[rhq] modules/core
by mazz
modules/core/dbutils/pom.xml | 2
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 42 +++-------
2 files changed, 17 insertions(+), 27 deletions(-)
New commits:
commit 19558e110cd6f9233225e7122d8af4baafb1ea56
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 27 17:27:39 2011 -0400
we can't rename tables (which is essentially removing an old table and creating a new table)
because dbsetup won't work - the dbsetup uninstall won't know about the old table to remove if it is still around
collapse the two dbupgrade steps into one
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index 39f0798..a368986 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.111</db.schema.version>
+ <db.schema.version>2.110</db.schema.version>
</properties>
<dependencies>
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 9950e58..df0daf7 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3417,44 +3417,34 @@
<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 desc="Creating table RHQ_CONFIG_PD_OSRC">
+ CREATE TABLE RHQ_CONFIG_PD_OSRC ( 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_CONFIG_PD_OSRC" column="LINK_TO_TARGET" columnType="BOOLEAN"/>
+ <schema-alterColumn table="RHQ_CONFIG_PD_OSRC" 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_CONFIG_PD_OSRC" column="FILTER" columnType="VARCHAR2" precision="40"/>
+ <schema-alterColumn table="RHQ_CONFIG_PD_OSRC" 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_CONFIG_PD_OSRC" column="EXPRESSION" columnType="VARCHAR2" precision="400"/>
+ <schema-alterColumn table="RHQ_CONFIG_PD_OSRC" 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_CONFIG_PD_OSRC" column="TARGET_TYPE" columnType="VARCHAR2" precision="20"/>
+ <schema-alterColumn table="RHQ_CONFIG_PD_OSRC" column="TARGET_TYPE" nullable="FALSE"/>
- <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC" column="PROPERTY_DEF_ID" columnType="INTEGER"/>
+ <schema-addColumn table="RHQ_CONFIG_PD_OSRC" 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
+ <statement desc="Adding a foreign key constraint to RHQ_CONFIG_PD_OSRC">
+ ALTER TABLE RHQ_CONFIG_PD_OSRC
+ ADD CONSTRAINT RHQ_CONFIG_PD_OSRC_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>
- <schemaSpec version="2.111">
- <schema-directSQL>
- <statement desc="rename to correct name">
- ALTER TABLE RHQ_PROP_DEF_OPT_SRC
- RENAME TO RHQ_CONFIG_PD_OSRC
- </statement>
- <statement desc="rename sequence">
- ALTER TABLE rhq_config_prop_def_opt_src_id_seq RENAME TO rhq_config_pd_osrc_id_seq
- </statement>
- </schema-directSQL>
+ <schema-createSequence name="rhq_config_pd_osrc_id_seq" initial="10001" />
</schemaSpec>
+
</dbupgrade>
</target>
</project>
12 years, 10 months
[rhq] Branch 'drift' - modules/core modules/enterprise
by John Sanda
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java | 2 +-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java | 4 ++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java | 5 ++++-
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java | 5 ++---
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java | 2 +-
5 files changed, 10 insertions(+), 8 deletions(-)
New commits:
commit 1e24f2a07539809341563cd41400f6ccc4462c2d
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Jun 27 16:10:30 2011 -0400
Changing DriftAgentService.requestDriftFiles to pass resource id and drift config name
DriftManagerBean now includes the resource id and drift configuration
name in the call to DriftAgentService.requestDriftFiles. The drift
config name is read from the headers in the changeset meta data file.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java
index 83baf92..3442b67 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java
@@ -39,7 +39,7 @@ public interface DriftAgentService {
* @param driftFiles
* @return the results of the immediate scheduling
*/
- boolean requestDriftFiles(List<DriftFile> driftFiles);
+ boolean requestDriftFiles(int resourceId, String driftConfigurationName, List<DriftFile> driftFiles);
/**
* Execute drift detection immediately. If any drift is found, the agent will send the
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index 114408b..cfe9137 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -142,11 +142,11 @@ public class DriftManager extends AgentService implements DriftAgentService, Con
}
@Override
- public boolean requestDriftFiles(List<DriftFile> driftFiles) {
- // TODO Auto-generated method stub
+ public boolean requestDriftFiles(int resourceId, String driftConfigurationName, List<DriftFile> driftFiles) {
return false;
}
+
@Override
public void unscheduleDriftDetection(int resourceId, DriftConfiguration driftConfiguration) {
// TODO Auto-generated method stub
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index 3e8b33d..e88425d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@ -43,6 +43,8 @@ import javax.jms.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
+import com.sun.net.httpserver.Headers;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Hibernate;
@@ -179,7 +181,8 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
resourceId);
DriftAgentService service = agentClient.getDriftAgentService();
try {
- if (service.requestDriftFiles(emptyDriftFiles)) {
+ if (service.requestDriftFiles(resourceId,
+ reader.getHeaders().getDriftConfigurationName(), emptyDriftFiles)) {
for (DriftFile driftFile : emptyDriftFiles) {
driftFile.setStatus(DriftFileStatus.REQUESTED);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
index d75e1dc..58f4ba2 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
@@ -342,9 +342,8 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
private class TestConfigService implements DriftAgentService {
@Override
- public boolean requestDriftFiles(List<DriftFile> driftFiles) {
- // pretend we actually processed the request
- return true;
+ public boolean requestDriftFiles(int resourceId, String driftConfigurationName, List<DriftFile> driftFiles) {
+ return false;
}
@Override
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
index 842ab10..68b940c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
@@ -330,7 +330,7 @@ public class TestAgentClient implements AgentClient, BundleAgentService, DriftAg
}
@Override
- public boolean requestDriftFiles(List<DriftFile> driftFiles) {
+ public boolean requestDriftFiles(int resourceId, String driftConfigurationName, List<DriftFile> driftFiles) {
return false;
}
12 years, 10 months
[rhq] Branch 'drift' - modules/common modules/core
by John Sanda
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReader.java | 2
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java | 17 +
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java | 10 -
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java | 14 +
modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java | 28 ++
modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java | 100 +++++++---
modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java | 95 ++++++++-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java | 3
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java | 6
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 5
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java | 5
11 files changed, 234 insertions(+), 51 deletions(-)
New commits:
commit d6dad28b375c5c26e50a6eba841166cd919652ce
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Jun 27 12:57:31 2011 -0400
Adding support to read/write headers in changeset meta data file
The changeset meta data file now includes a header with three entries,
one per line. The headers are,
* drift configuration name
* drift configuration base dir
* flag indicating whether or not it is a coverage changeset
The changeset reader and writer classes, including tests, have been
updating to handle the headers.
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReader.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReader.java
index 630b1a6..93fe553 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReader.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReader.java
@@ -4,6 +4,8 @@ import java.io.IOException;
public interface ChangeSetReader {
+ Headers getHeaders() throws IOException;
+
DirectoryEntry readDirectoryEntry() throws IOException;
void close() throws IOException;
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
index 7e557a2..9cb3392 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
@@ -19,13 +19,30 @@ public class ChangeSetReaderImpl implements ChangeSetReader {
private File metaDataFile;
+ private Headers headers;
+
public ChangeSetReaderImpl(File metaDataFile) throws IOException {
this.metaDataFile = metaDataFile;
reader = new BufferedReader(new FileReader(this.metaDataFile));
+ readHeaders();
}
public ChangeSetReaderImpl(Reader metaDataFile) throws Exception {
reader = new BufferedReader(metaDataFile);
+ readHeaders();
+ }
+
+ private void readHeaders() throws IOException {
+ String name = reader.readLine();
+ String basedir = reader.readLine();
+ boolean coverageChangeSet = Boolean.valueOf(reader.readLine());
+
+ headers = new Headers(name, basedir, coverageChangeSet);
+ }
+
+ @Override
+ public Headers getHeaders() throws IOException {
+ return headers;
}
@Override
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java
index 782f9bf..bcf14da 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java
@@ -13,11 +13,19 @@ import java.io.IOException;
* <br/>
* The current format of the change set file is:
* <pre>
+ * HEADER
* DRIFT_ENTRY
* FILE_ENTRY (1..N)
* EMPTY_LINE
* </pre>
- * where DRIFT_ENTRY has two field that are space delimited. The first is the directory path
+ * where HEADER has three fields that are terminated by newline characters. Those fields are:
+ * <ul>
+ * <li>drift configuration name</li>
+ * <li>drift configuration base directory</li>
+ * <li>flag indicating whether or not this is a coverage changeset</li>
+ * </ul>
+ * <br/>
+ * and where DRIFT_ENTRY has two field that are space delimited. The first is the directory path
* and the second is the number of files included in DRIFT_ENTRY. Note that the last FILE_ENTRY
* in DRIFT_ENTRY is followed by a new line.
* <br/>
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java
index 21b819a..1b68506 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java
@@ -6,15 +6,27 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
+import org.rhq.core.domain.drift.DriftConfiguration;
+
public class ChangeSetWriterImpl implements ChangeSetWriter {
private Writer writer;
private File changeSetFile;
- public ChangeSetWriterImpl(File changeSetFile) throws IOException {
+ public ChangeSetWriterImpl(File changeSetFile, DriftConfiguration driftConfig, boolean coverageChangeSet)
+ throws IOException {
+
this.changeSetFile = changeSetFile;
writer = new BufferedWriter(new FileWriter(this.changeSetFile));
+
+ writeHeader(driftConfig, coverageChangeSet);
+ }
+
+ private void writeHeader(DriftConfiguration driftConfig, boolean initialChangeSet) throws IOException {
+ writer.write(driftConfig.getName() + "\n");
+ writer.write(driftConfig.getBasedir() + "\n");
+ writer.write(initialChangeSet + "\n");
}
public void writeDirectoryEntry(DirectoryEntry dirEntry) throws IOException {
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java b/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java
new file mode 100644
index 0000000..7263f96
--- /dev/null
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java
@@ -0,0 +1,28 @@
+package org.rhq.common.drift;
+
+public class Headers {
+
+ private String driftConfigurationName;
+
+ private String basedir;
+
+ private boolean coverageChangeSet;
+
+ public Headers(String driftConfigurationName, String basedir, boolean coverageChangeSet) {
+ this.driftConfigurationName = driftConfigurationName;
+ this.basedir = basedir;
+ this.coverageChangeSet = coverageChangeSet;
+ }
+
+ public String getDriftConfigurationName() {
+ return driftConfigurationName;
+ }
+
+ public String getBasedir() {
+ return basedir;
+ }
+
+ public boolean isCoverageChangeSet() {
+ return coverageChangeSet;
+ }
+}
diff --git a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java
index a7c8d2e..e642063 100644
--- a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java
+++ b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java
@@ -10,67 +10,113 @@ public class ChangeSetReaderImplTest {
@Test
@SuppressWarnings("unchecked")
public void readDirectoryEntryWithFileAdded() throws Exception {
- String changeset = "myresource/conf 1\n" +
+ String changeset = "file-added-test\n" +
+ "myresource\n" +
+ "true\n" +
+ "myresource/conf 1\n" +
"a34ef6 0 myconf.conf A";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
+
+ Headers actualHeaders = reader.getHeaders();
+ Headers expectedHeaders = new Headers("file-added-test", "myresource", true);
+
+ assertHeadersEquals(actualHeaders, expectedHeaders);
+
DirectoryEntry dirEntry = reader.readDirectoryEntry();
reader.close();
- assertNotNull(dirEntry, "Expected reader to return a directory entry");
- assertEquals(dirEntry.getDirectory(), "myresource/conf", "The directory name is wrong");
- assertEquals(dirEntry.getNumberOfFiles(), 1, "The number of files for the directory entry is wrong");
+ assertDirectoryEntryEquals(dirEntry, "myresource/conf", 1);
- FileEntry fileEntry = dirEntry.iterator().next();
+ FileEntry actualFileEntry = dirEntry.iterator().next();
+ FileEntry expectedFileEntry = new FileEntry("a34ef6", "0", "myconf.conf", "A");
- assertEquals(fileEntry.getNewSHA(), "a34ef6", "The first column, the new SHA-256, is wrong");
- assertEquals(fileEntry.getOldSHA(), "0", "The second column, the old SHA-256, is wrong");
- assertEquals(fileEntry.getFile(), "myconf.conf", "The third column, the file name, is wrong");
- assertEquals(fileEntry.getType().code(), "A", "The fourth column, the entry type, is wrong");
+ assertFileEntryEquals(actualFileEntry, expectedFileEntry);
}
@Test
@SuppressWarnings("unchecked")
public void readDirectoryEntryWithFileRemoved() throws Exception {
- String changeset = "myresource/conf 1\n" +
+ String changeset = "file-removed-test\n" +
+ "myresource\n" +
+ "true\n" +
+ "myresource/conf 1\n" +
"0 a34ef6 myconf.conf R";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
+
+ Headers actualHeaders = reader.getHeaders();
+ Headers expectedHeaders = new Headers("file-removed-test", "myresource", true);
+
+ assertHeadersEquals(actualHeaders, expectedHeaders);
+
DirectoryEntry dirEntry = reader.readDirectoryEntry();
reader.close();
- assertNotNull(dirEntry, "Expected reader to return a directory entry");
- assertEquals(dirEntry.getDirectory(), "myresource/conf", "The directory name is wrong");
- assertEquals(dirEntry.getNumberOfFiles(), 1, "The number of files for the directory entry is wrong");
+ assertDirectoryEntryEquals(dirEntry, "myresource/conf", 1);
- FileEntry fileEntry = dirEntry.iterator().next();
+ FileEntry actualFileEntry = dirEntry.iterator().next();
+ FileEntry expectedFileEntry = new FileEntry("0", "a34ef6", "myconf.conf", "R");
- assertEquals(fileEntry.getNewSHA(), "0", "The first column, the new SHA-256, is wrong");
- assertEquals(fileEntry.getOldSHA(), "a34ef6", "The second column, the old SHA-256, is wrong");
- assertEquals(fileEntry.getFile(), "myconf.conf", "The third column, the file name, is wrong");
- assertEquals(fileEntry.getType().code(), "R", "The fourth column, the entry type, is wrong");
+ assertFileEntryEquals(actualFileEntry, expectedFileEntry);
}
@Test
@SuppressWarnings("unchecked")
public void readDirectoryEntryWithFileChanged() throws Exception {
- String changeset = "myresource/conf 1\n" +
+ String changeset = "file-changed-test\n" +
+ "myresource\n" +
+ "true\n" +
+ "myresource/conf 1\n" +
"a34ef6 c41b8 myconf.conf C";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
+
+ Headers actualHeaders = reader.getHeaders();
+ Headers expectedHeaders = new Headers("file-changed-test", "myresource", true);
+
+ assertHeadersEquals(actualHeaders, expectedHeaders);
+
DirectoryEntry dirEntry = reader.readDirectoryEntry();
reader.close();
- assertNotNull(dirEntry, "Expected reader to return a directory entry");
- assertEquals(dirEntry.getDirectory(), "myresource/conf", "The directory name is wrong");
- assertEquals(dirEntry.getNumberOfFiles(), 1, "The number of files for the directory entry is wrong");
+ assertDirectoryEntryEquals(dirEntry, "myresource/conf", 1);
+
+ FileEntry actualFileEntry = dirEntry.iterator().next();
+ FileEntry expectedFileEntry = new FileEntry("a34ef6", "c41b8", "myconf.conf", "C");
+
+ assertFileEntryEquals(actualFileEntry, expectedFileEntry);
+ }
- FileEntry fileEntry = dirEntry.iterator().next();
+ void assertHeadersEquals(Headers actual, Headers expected) {
+ assertEquals(actual.getDriftConfigurationName(), expected.getDriftConfigurationName(),
+ "The drift configuration name, which should be the first header, is wrong.");
+ assertEquals(actual.getBasedir(), expected.getBasedir(), "The drift configuration base directory, which " +
+ "should be the second header, is wrong.");
+ assertEquals(actual.isCoverageChangeSet(), expected.isCoverageChangeSet(), "The coverage change set flag, " +
+ "which should be the third header, is wrong.");
+ }
+
+ /**
+ * Verifies that the directory entry name (i.e., path) and number of files match the
+ * specified values.
+ *
+ * @param dirEntry
+ * @param path
+ * @param numberOfFiles
+ */
+ void assertDirectoryEntryEquals(DirectoryEntry dirEntry, String path, int numberOfFiles) {
+ assertNotNull(dirEntry, "Expected non-null directory entry");
+ assertEquals(dirEntry.getDirectory(), path, "The directory name/path is wrong");
+ assertEquals(dirEntry.getNumberOfFiles(), numberOfFiles, "The number of files for the directory entry is " +
+ "wrong");
+ }
- assertEquals(fileEntry.getNewSHA(), "a34ef6", "The first column, the new SHA-256, is wrong");
- assertEquals(fileEntry.getOldSHA(), "c41b8", "The second column, the old SHA-256, is wrong");
- assertEquals(fileEntry.getFile(), "myconf.conf", "The third column, the file name, is wrong");
- assertEquals(fileEntry.getType().code(), "C", "The fourth column, the entry type, is wrong");
+ void assertFileEntryEquals(FileEntry actual, FileEntry expected) {
+ assertEquals(actual.getNewSHA(), expected.getNewSHA(), "The first column, the new SHA-256, is wrong");
+ assertEquals(actual.getOldSHA(), expected.getOldSHA(), "The second column, the old SHA-256, is wrong");
+ assertEquals(actual.getFile(), expected.getFile(), "The third column, the file name, is wrong");
+ assertEquals(actual.getType(), expected.getType(), "The fourth column, the entry type, is wrong");
}
}
diff --git a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java
index 3e21887..6c9a475 100644
--- a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java
+++ b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java
@@ -7,6 +7,10 @@ import java.util.List;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.drift.DriftConfiguration;
+
import static org.apache.commons.io.FileUtils.deleteDirectory;
import static org.apache.commons.io.IOUtils.lineIterator;
import static org.apache.commons.io.IOUtils.readLines;
@@ -18,18 +22,22 @@ import static org.testng.Assert.assertTrue;
public class ChangeSetWriterImplTest {
- File changesetsDir = new File("target", "changesets");
+ File changeSetsDir = new File("target", "changesets");
@BeforeClass
public void setupChangesetsDir() throws Exception {
- deleteDirectory(changesetsDir);
- assertTrue(changesetsDir.mkdirs(), "Failed to create " + changesetsDir.getPath());
+ deleteDirectory(changeSetsDir);
+ assertTrue(changeSetsDir.mkdirs(), "Failed to create " + changeSetsDir.getPath());
}
@Test
@SuppressWarnings("unchecked")
public void writeDirectoryEntryWithAddedFile() throws Exception {
- ChangeSetWriterImpl writer = new ChangeSetWriterImpl(new File(changesetsDir, "added-file-test"));
+ File changeSetFile = new File(changeSetsDir, "added-file-test");
+ DriftConfiguration driftConfig = driftConfiguration("added-file-test", "myresource");
+ boolean coverageChangeSet = true;
+
+ ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, driftConfig, coverageChangeSet);
writer.writeDirectoryEntry(new DirectoryEntry("myresource/conf").add(
addedFileEntry("myconf.conf", "a34ef6")));
@@ -38,17 +46,25 @@ public class ChangeSetWriterImplTest {
File metaDataFile = writer.getChangeSetFile();
List<String> lines = readLines(new FileInputStream(metaDataFile));
- assertEquals(lines.size(), 3, "Expected to find three lines in " + metaDataFile.getPath());
- assertEquals(lines.get(0), "myresource/conf 1", "The first line for a directory entry should specify the " +
+ assertEquals(lines.size(), 6, "Expected to find six lines in " + metaDataFile.getPath() +
+ " - three for the header followed by three for a directory entry.");
+
+ assertHeaderEquals(lines, "added-file-test", "myresource", "true");
+
+ assertEquals(lines.get(3), "myresource/conf 1", "The first line for a directory entry should specify the " +
"directory path followed by the number of lines in the entry.");
- assertFileEntryEquals(lines.get(1), "a34ef6 0 myconf.conf A");
+ assertFileEntryEquals(lines.get(4), "a34ef6 0 myconf.conf A");
}
@Test
@SuppressWarnings("unchecked")
public void writeDirectoryEntryWithRemovedFile() throws Exception {
- ChangeSetWriterImpl writer = new ChangeSetWriterImpl(new File(changesetsDir, "removed-file-test"));
+ File changeSetFile = new File(changeSetsDir, "removed-file-test");
+ DriftConfiguration driftConfig = driftConfiguration("removed-file-test", "myresource");
+ boolean coverageChangeSet = true;
+
+ ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, driftConfig, coverageChangeSet);
writer.writeDirectoryEntry(new DirectoryEntry("myresource/conf").add(
removedFileEntry("myconf.conf", "a34ef6")));
@@ -57,17 +73,25 @@ public class ChangeSetWriterImplTest {
File metaDataFile = writer.getChangeSetFile();
List<String> lines = readLines(new FileInputStream(metaDataFile));
- assertEquals(lines.size(), 3, "Expected to find three lines in " + metaDataFile.getPath());
- assertEquals(lines.get(0), "myresource/conf 1", "The first line for a directory entry should specify the " +
+ assertEquals(lines.size(), 6, "Expected to find six lines in " + metaDataFile.getPath() +
+ " - three for the header followed by three for a directory entry.");
+
+ assertHeaderEquals(lines, "removed-file-test", "myresource", "true");
+
+ assertEquals(lines.get(3), "myresource/conf 1", "The first line for a directory entry should specify the " +
"directory path followed by the number of lines in the entry.");
- assertFileEntryEquals(lines.get(1), "0 a34ef6 myconf.conf R");
+ assertFileEntryEquals(lines.get(4), "0 a34ef6 myconf.conf R");
}
@Test
@SuppressWarnings("unchecked")
public void writeDirectoryEntryWithChangedFile() throws Exception {
- ChangeSetWriterImpl writer = new ChangeSetWriterImpl(new File(changesetsDir, "changed-file-test"));
+ File changeSetFile = new File(changeSetsDir, "changed-file-test");
+ DriftConfiguration driftConfig = driftConfiguration("changed-file-test", "myresource");
+ boolean coverageChangeSet = true;
+
+ ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, driftConfig, coverageChangeSet);
writer.writeDirectoryEntry(new DirectoryEntry("myresource/conf").add(
changedFileEntry("myconf.conf", "a34ef6", "c2d55f")));
@@ -76,13 +100,46 @@ public class ChangeSetWriterImplTest {
File metaDataFile = writer.getChangeSetFile();
List<String> lines = readLines(new FileInputStream(metaDataFile));
- assertEquals(lines.size(), 3, "Expected to find three lines in " + metaDataFile.getPath());
- assertEquals(lines.get(0), "myresource/conf 1", "The first line for a directory entry should specify the " +
+ assertEquals(lines.size(), 6, "Expected to find six lines in " + metaDataFile.getPath() +
+ " - three for the header followed by three for a directory entry.");
+
+ assertHeaderEquals(lines, "changed-file-test", "myresource", "true");
+
+ assertEquals(lines.get(3), "myresource/conf 1", "The first line for a directory entry should specify the " +
"directory path followed by the number of lines in the entry.");
- assertFileEntryEquals(lines.get(1), "c2d55f a34ef6 myconf.conf C");
+ assertFileEntryEquals(lines.get(4), "c2d55f a34ef6 myconf.conf C");
+ }
+
+ /**
+ * Verifies that <code>lines</code>, which is assumed to represent the entire changeset
+ * file, contains the expected header. The header contains three entries which are
+ * written out one entry per line. The header is the first three lines of the changeset
+ * file and contains the following entries:
+ *
+ * <ul>
+ * <li>drift configuration name</li>
+ * <li>drift configuration base directory</li>
+ * <li>boolean flag indicating whether or not this is an initial changeset</li>
+ * </ul>
+ * @param lines
+ * @param expected
+ */
+ void assertHeaderEquals(List<String> lines, String... expected) {
+ assertEquals(lines.get(0), expected[0], "The first header entry should be the drift configuration name.");
+ assertEquals(lines.get(1), expected[1], "The second header entry should be the base directory.");
+ assertEquals(lines.get(2), expected[2], "The second header entry should be a flag indicating whether or not " +
+ "this is a coverage change set");
}
+ /**
+ * Verifies that a file entry matches an expected value. A file entry consists of
+ * four, space-delimited fields and is terminated by a newline character. Those fields
+ * are new_sha, old_sha, file_name, type.
+ *
+ * @param actual
+ * @param expected
+ */
void assertFileEntryEquals(String actual, String expected) {
String[] expectedFields = expected.split(" ");
String[] actualFields = actual.split(" ");
@@ -96,4 +153,12 @@ public class ChangeSetWriterImplTest {
assertEquals(actualFields[3], expectedFields[3], "The fourth column, the type, is wrong");
}
+ DriftConfiguration driftConfiguration(String name, String basedir) {
+ Configuration config = new Configuration();
+ config.put(new PropertySimple("name", name));
+ config.put(new PropertySimple("basedir", basedir));
+
+ return new DriftConfiguration(config);
+ }
+
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
index d001019..962299b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
@@ -33,7 +33,8 @@ public interface ChangeSetManager {
*/
ChangeSetReader getChangeSetReader(int resourceId, DriftConfiguration driftConfiguration) throws IOException;
- ChangeSetWriter getChangeSetWriter(int resourceId, DriftConfiguration driftConfiguration) throws IOException;
+ ChangeSetWriter getChangeSetWriter(int resourceId, DriftConfiguration driftConfiguration,
+ boolean coverageChangeSet) throws IOException;
void addFileToChangeSet(int resourceId, DriftConfiguration driftConfiguration, File file);
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
index ef7db5c..baea20c 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
@@ -46,8 +46,8 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
}
@Override
- public ChangeSetWriter getChangeSetWriter(int resourceId, DriftConfiguration driftConfiguration)
- throws IOException {
+ public ChangeSetWriter getChangeSetWriter(int resourceId, DriftConfiguration driftConfiguration,
+ boolean coverageChangeSet) throws IOException {
File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
File changeSetDir = new File(resourceDir, driftConfiguration.getName());
@@ -55,7 +55,7 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
changeSetDir.mkdirs();
}
- return new ChangeSetWriterImpl(new File(changeSetDir, "changeset.txt"));
+ return new ChangeSetWriterImpl(new File(changeSetDir, "changeset.txt"), driftConfiguration, coverageChangeSet);
}
@Override
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 4519b06..ad8b0c1 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -50,8 +50,11 @@ public class DriftDetector implements Runnable {
}
try {
+ // TODO add logic to determine if there is an existing changeset
+ // if there is no previous changeset then we need to generate the initial
+ // coverage changeset
ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(),
- schedule.getDriftConfiguration());
+ schedule.getDriftConfiguration(), true);
DirectoryScanner scanner = new DirectoryScanner(schedule.getDriftConfiguration(), writer);
scanner.scan();
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
index 9cb3119..80f16b1 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
@@ -80,8 +80,9 @@ public class DriftDetectorTest extends JMockTest {
allowing(changeSetMgr).getChangeSetReader(schedule.getResourceId(), schedule.getDriftConfiguration());
will(returnValue(new DriftDetectionSchedule(1, driftConfig)));
- allowing(changeSetMgr).getChangeSetWriter(1, schedule.getDriftConfiguration());
- will(returnValue(new ChangeSetWriterImpl(new File(changeSetDir, "test"))));
+ allowing(changeSetMgr).getChangeSetWriter(1, schedule.getDriftConfiguration(), true);
+ will(returnValue(new ChangeSetWriterImpl(new File(changeSetDir, "test"),
+ schedule.getDriftConfiguration(), true)));
}});
DriftDetector driftDetector = new DriftDetector();
12 years, 10 months
[rhq] modules/plugins
by Heiko W. Rupp
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java | 3 +++
1 file changed, 3 insertions(+)
New commits:
commit 1553673802ec3f30d6582d6f0a8df3707cc5d6a1
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Jun 27 17:55:59 2011 +0200
Fix a possible NPE that prevents config rendering.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
index f66cefd..ae8e5d9 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
@@ -219,6 +219,9 @@ public class ConfigurationDelegate implements ConfigurationFacet {
* @return the populated map
*/
PropertyMap handlePropertyMap(PropertyDefinitionMap propDef, Object valueObject) {
+ if (valueObject==null)
+ return null;
+
PropertyMap propertyMap = new PropertyMap(propDef.getName());
Map<String, PropertyDefinition> memberDefMap = propDef.getPropertyDefinitions();
12 years, 10 months
[rhq] Branch 'drift' - 2 commits - modules/core
by mazz
modules/core/dbutils/pom.xml | 2 -
modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml | 2 -
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 11 ++++++++++
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyOptionsSource.java | 4 +--
4 files changed, 15 insertions(+), 4 deletions(-)
New commits:
commit 0f87b3b856ff91b6d9559defa12d01b9f6c9d089
Merge: 1a7ea86 c57ee65
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 27 10:13:05 2011 -0400
Merge commit 'origin/master' into drift
Conflicts:
modules/core/dbutils/pom.xml
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
diff --cc modules/core/dbutils/pom.xml
index e2a599d,39f0798..d79b738
--- 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.112</db.schema.version>
- <db.schema.version>2.111</db.schema.version>
++ <db.schema.version>2.113</db.schema.version>
</properties>
<dependencies>
diff --cc modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 143ea85,9950e58..8e276a1
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@@ -3443,132 -3444,17 +3443,143 @@@
</schema-directSQL>
<schema-createSequence name="rhq_config_prop_def_opt_src_id_seq" initial="10001" />
</schemaSpec>
+
<schemaSpec version="2.111">
<schema-directSQL>
+ <statement desc="Creating global drift configuration definition">
+ INSERT INTO rhq_config_def (id, name, description)
+ VALUES (1, 'GLOBAL_DRIFT_CONFIG_DEF', 'The drift configuration definition')
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ order_index, dtype, config_def_id)
+ VALUES (1, 'name', 'Drift Configuration Name', 'The drift configuration name', true, 'string',
+ 0, 'property', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ default_value, order_index, dtype, config_def_id)
+ VALUES (2, 'enabled', 'Enabled', 'Enables or disables drift detection for this configuration', true, 'boolean',
+ 'false', 1, 'property', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ order_index, dtype, config_def_id)
+ VALUES (3, 'basedir', 'Base Directory', 'The base directory from which files will be monitored for drift.',
+ true, 'string', 2, 'property', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ order_index, dtype, default_value, config_def_id)
+ VALUES (4, 'interval', 'Interval', 'The interval, in seconds, between drift detection scans for this configuration. Default is thirty minutes.',
+ false, 'long', 3, 'property', '1800', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, description, order_index,
+ config_def_id)
+ VALUES (5, 'includes', 'Includes', 'list', 'A set of patterns that specify files and/or directories to include.',
+ 4, 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, parent_list_definition_id)
+ VALUES (6, 'include', 'Include', 'map', 4)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (7, 'path', 'Path', 'A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift configuration.',
+ 'string', 0, 'property', 5)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (8, 'pattern', 'Pattern', 'TBD', 'string', 1, 'property', 5)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, description, order_index,
+ config_def_id)
+ VALUES (9, 'excludes', 'Excludes', 'list', 'A set of patterns that specify files and/or directories to exclude.',
+ 5, 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, parent_list_definition_id)
+ VALUES (10, 'exclude', 'Exclude', 'map', 8)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (11, 'path', 'Path', 'A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift configuration.',
+ 'string', 0, 'property', 9)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (12, 'pattern', 'Pattern', 'TBD', 'string', 1, 'property', 9)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
+ <schemaSpec version="2.112">
+ <schema-directSQL>
+ <statement desc="Creating table RHQ_DRIFT_TEMPLATE">
+ CREATE TABLE RHQ_DRIFT_TEMPLATE (
+ RESOURCE_TYPE_ID INTEGER,
+ CONFIG_TEMPLATE_ID INTEGER)
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_DRIFT_TEMPLATE" column="RESOURCE_TYPE_ID" nullable="false"/>
+ <schema-alterColumn table="RHQ_DRIFT_TEMPLATE" column="CONFIG_TEMPLATE_ID" nullable="false"/>
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DRIFT_TEMPLATE foreign key to RHQ_RESOURCE_TYPE">
+ ALTER TABLE RHQ_DRIFT_TEMPLATE
+ ADD CONSTRAINT RESOURCE_TYPE_ID_FK
+ FOREIGN KEY (RESOURCE_TYPE_ID)
+ REFERENCES RHQ_RESOURCE_TYPE (ID)
+ </statement>
+ <statement desc="Creating RHQ_DRIFT_TEMPLATE foreign key to RHQ_CONFIG_TEMPLATE">
+ ALTER TABLE RHQ_DRIFT_TEMPLATE
+ ADD CONSTRAINT CONFIG_TEMPLATE_ID_FK
+ FOREIGN KEY (CONFIG_TEMPLATE_ID)
+ REFERENCES RHQ_CONFIG_TEMPLATE (ID)
+ </statement>
+ </schema-directSQL>
+
+ <schema-directSQL>
+ <statement desc="Creating table RHQ_DRIFT_CONFIG">
+ CREATE TABLE RHQ_DRIFT_CONFIG (
+ RESOURCE_ID INTEGER,
+ CONFIG_ID INTEGER)
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="RESOURCE_ID" nullable="false"/>
+ <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="CONFIG_ID" nullable="false"/>
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DRIFT_CONFIG foreign key to RHQ_RESOURCE">
+ ALTER TABLE RHQ_DRIFT_CONFIG
+ ADD CONSTRAINT RESOURCE_ID_FK
+ FOREIGN KEY (RESOURCE_ID)
+ REFERENCES RHQ_RESOURCE (ID)
+ </statement>
+ <statement desc="Creating RHQ_DRIFT_CONFIG foreign key to RHQ_CONFIG">
+ ALTER TABLE RHQ_DRIFT_CONFIG
+ ADD CONSTRAINT CONFIG_ID_FK
+ FOREIGN KEY (CONFIG_ID)
+ REFERENCES RHQ_CONFIG (ID)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
++ <schemaSpec version="2.113">
++ <schema-directSQL>
+ <statement desc="rename to correct name">
+ ALTER TABLE RHQ_PROP_DEF_OPT_SRC
+ RENAME TO RHQ_CONFIG_PD_OSRC
+ </statement>
+ <statement desc="rename sequence">
+ ALTER TABLE rhq_config_prop_def_opt_src_id_seq RENAME TO rhq_config_pd_osrc_id_seq
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
</dbupgrade>
</target>
</project>
commit c57ee650b5c77aeb10df19ed3da12c6ad0c20ef5
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Jun 27 10:59:47 2011 +0200
Fix table and sequence names for dependent values
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index a368986..39f0798 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.110</db.schema.version>
+ <db.schema.version>2.111</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 c5155ab..07f101d 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
@@ -58,7 +58,7 @@
<column name="PROPERTY_DEF_ID" type="INTEGER" required="false" references="RHQ_CONFIG_PROP_DEF"/>
</table>
- <table name="RHQ_PROP_DEF_OPT_SRC">
+ <table name="RHQ_CONFIG_PD_OSRC">
<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"/>
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 4d66b02..9950e58 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3444,6 +3444,17 @@
</schema-directSQL>
<schema-createSequence name="rhq_config_prop_def_opt_src_id_seq" initial="10001" />
</schemaSpec>
+ <schemaSpec version="2.111">
+ <schema-directSQL>
+ <statement desc="rename to correct name">
+ ALTER TABLE RHQ_PROP_DEF_OPT_SRC
+ RENAME TO RHQ_CONFIG_PD_OSRC
+ </statement>
+ <statement desc="rename sequence">
+ ALTER TABLE rhq_config_prop_def_opt_src_id_seq RENAME TO rhq_config_pd_osrc_id_seq
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
</dbupgrade>
</target>
</project>
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
index 1af0bf4..9755bdd 100644
--- 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
@@ -45,8 +45,8 @@ import javax.xml.bind.annotation.XmlAccessorType;
* @author Heiko W. Rupp
*/
@Entity
-@Table(name="RHQ_PROP_DEF_OPT_SRC")
-@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_CONFIG_PROP_DEF_OPT_SRC_ID_SEQ")
+@Table(name="RHQ_CONFIG_PD_OSRC")
+@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_CONFIG_PD_OSRC_ID_SEQ")
@XmlAccessorType(XmlAccessType.FIELD)
public class PropertyOptionsSource implements Serializable{
12 years, 10 months
[rhq] modules/core
by Heiko W. Rupp
modules/core/dbutils/pom.xml | 2 -
modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml | 2 -
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 11 ++++++++++
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyOptionsSource.java | 4 +--
4 files changed, 15 insertions(+), 4 deletions(-)
New commits:
commit c57ee650b5c77aeb10df19ed3da12c6ad0c20ef5
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Jun 27 10:59:47 2011 +0200
Fix table and sequence names for dependent values
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index a368986..39f0798 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.110</db.schema.version>
+ <db.schema.version>2.111</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 c5155ab..07f101d 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
@@ -58,7 +58,7 @@
<column name="PROPERTY_DEF_ID" type="INTEGER" required="false" references="RHQ_CONFIG_PROP_DEF"/>
</table>
- <table name="RHQ_PROP_DEF_OPT_SRC">
+ <table name="RHQ_CONFIG_PD_OSRC">
<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"/>
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 4d66b02..9950e58 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3444,6 +3444,17 @@
</schema-directSQL>
<schema-createSequence name="rhq_config_prop_def_opt_src_id_seq" initial="10001" />
</schemaSpec>
+ <schemaSpec version="2.111">
+ <schema-directSQL>
+ <statement desc="rename to correct name">
+ ALTER TABLE RHQ_PROP_DEF_OPT_SRC
+ RENAME TO RHQ_CONFIG_PD_OSRC
+ </statement>
+ <statement desc="rename sequence">
+ ALTER TABLE rhq_config_prop_def_opt_src_id_seq RENAME TO rhq_config_pd_osrc_id_seq
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
</dbupgrade>
</target>
</project>
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
index 1af0bf4..9755bdd 100644
--- 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
@@ -45,8 +45,8 @@ import javax.xml.bind.annotation.XmlAccessorType;
* @author Heiko W. Rupp
*/
@Entity
-@Table(name="RHQ_PROP_DEF_OPT_SRC")
-@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_CONFIG_PROP_DEF_OPT_SRC_ID_SEQ")
+@Table(name="RHQ_CONFIG_PD_OSRC")
+@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_CONFIG_PD_OSRC_ID_SEQ")
@XmlAccessorType(XmlAccessType.FIELD)
public class PropertyOptionsSource implements Serializable{
12 years, 10 months
[rhq] Branch 'drift' - 186 commits - etc/guiperftests modules/core modules/enterprise modules/plugins pom.xml
by mazz
etc/guiperftests/pom.xml | 204
etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java | 121
etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestSuite.java | 80
etc/guiperftests/src/test/java/org/rhq/guiperftest/SahiUtility.java | 57
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/ConfigurationMetadataParser.java | 22
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java | 24
modules/core/client-api/src/main/java/org/rhq/core/clientapi/descriptor/AgentPluginDescriptorUtil.java | 65
modules/core/client-api/src/main/resources/rhq-configuration.xsd | 42
modules/core/client-api/src/main/resources/rhq-plugin.xsd | 74
modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/ConfigurationMetadataParser2Test.java | 131
modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java | 25
modules/core/client-api/src/test/resources/metadata-manager-test-1.xml | 10
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/dbsetup/content-schema.xml | 1
modules/core/dbutils/src/main/scripts/dbsetup/inventory-schema.xml | 1
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 68
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java | 29
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java | 284 +
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/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 27
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundleDeployRequest.java | 17
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundlePurgeRequest.java | 18
modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java | 185
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java | 19
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java | 6
modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java | 20
modules/core/plugin-container/src/main/java/org/rhq/core/pc/standaloneContainer/Command.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java | 113
modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java | 483 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java | 164
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java | 63
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java | 21
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationDataSource.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationListView.java | 19
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java | 5
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/BundleGWTService.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java | 2
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/client/inventory/groups/definitions/SingleGroupDefinitionView.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java | 113
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java | 70
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java | 34
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java | 43
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java | 29
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 12
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 16
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 16
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 16
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 10
modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png |binary
modules/enterprise/server/ear/pom.xml | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 82
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java | 32
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 91
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java | 21
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBean.java | 70
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 12
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java | 44
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 77
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java | 78
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/discovery/DiscoveryBossBeanTest.java | 21
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/inventory/InventoryManagerBeanTest.java | 25
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java | 46
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java | 106
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/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml | 354 +
modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v1.xml | 27
modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v2.xml | 23
modules/enterprise/server/xml-schemas/src/main/java/org/rhq/enterprise/server/xmlschema/ServerPluginDescriptorUtil.java | 55
modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java | 15
modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java | 18
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java | 6
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/VirtualHostLegacyResourceKeyUtil.java | 48
modules/plugins/apache/src/main/java/org/rhq/plugins/www/util/WWWUtils.java | 41
modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml | 10
modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/FileTemplateBundlePluginServerComponent.java | 8
modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java | 3
modules/plugins/hudson/pom.xml | 4
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-as-5/src/main/resources/META-INF/rhq-plugin.xml | 11
modules/plugins/jboss-as-7/pom.xml | 231 +
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java | 230 +
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java | 178
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java | 239 +
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java | 504 ++
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java | 216 +
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java | 320 +
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java | 44
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java | 65
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java | 429 ++
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java | 71
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java | 127
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/LoggerComponent.java | 69
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java | 246 +
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/PluginStats.java | 61
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java | 179
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java | 195
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarComponent.java | 58
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarDiscovery.java | 45
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Attribute.java | 86
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ComplexResult.java | 40
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/CompositeOperation.java | 64
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Domain.java | 53
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java | 40
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NetworkInterface.java | 45
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java | 141
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/OperationDescription.java | 80
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java | 69
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadAttribute.java | 32
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java | 37
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenResources.java | 37
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java | 38
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java | 86
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/SocketBindingGroup.java | 47
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java | 67
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Tuple.java | 35
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Type.java | 50
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/TypeModelValue.java | 39
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueDeserializer.java | 53
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueSerializer.java | 45
modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml | 1421 ++++++
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/CompositeOperationTest.java | 108
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java | 515 ++
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java | 295 +
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java | 106
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java | 320 +
modules/plugins/jboss-as-7/src/test/resources/complexInterface.json | 14
modules/plugins/jboss-as-7/src/test/resources/connector.json | 10
modules/plugins/jboss-as-7/src/test/resources/domain-result.json | 2113 ++++++++++
modules/plugins/jboss-as-7/src/test/resources/extensions.json | 93
modules/plugins/jboss-as-7/src/test/resources/interfaces.json | 8
modules/plugins/jboss-as-7/src/test/resources/logging.json | 15
modules/plugins/jboss-as-7/src/test/resources/loopback.json | 10
modules/plugins/jboss-as-7/src/test/resources/schema-locations.json | 50
modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml | 92
modules/plugins/jboss-as-7/src/test/resources/test-simple.war |binary
modules/plugins/jboss-as-7/src/test/resources/threadpool.json | 25
modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml | 11
modules/plugins/jboss-cache-v3/pom.xml | 2
modules/plugins/perftest/README | 12
modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestComponent.java | 2
modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestDiscoveryComponent.java | 2
modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestRogueDiscoveryComponent.java | 4
modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/ScenarioManager.java | 10
modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/event/PerfTestEventPoller.java | 13
modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml | 14
modules/plugins/perftest/src/main/resources/artifacts.xml | 6
modules/plugins/perftest/src/main/resources/calltime.xml | 2
modules/plugins/perftest/src/main/resources/configurable-1.xml | 8
modules/plugins/perftest/src/main/resources/configurable-2.xml | 12
modules/plugins/perftest/src/main/resources/configurable-3.xml | 8
modules/plugins/perftest/src/main/resources/configurable-4.xml | 8
modules/plugins/perftest/src/main/resources/configurable-5.xml | 8
modules/plugins/perftest/src/main/resources/configurable-6.xml | 7
modules/plugins/perftest/src/main/resources/configurable-alphaomega.xml | 32
modules/plugins/perftest/src/main/resources/configurable-average.xml | 32
modules/plugins/perftest/src/main/resources/metrics.xml | 2
modules/plugins/perftest/src/main/resources/perftest-scenario.xsd | 4
modules/plugins/perftest/src/main/resources/rogue.xml | 18
modules/plugins/perftest/src/test/java/org/rhq/plugins/perftest/ScenarioManagerTest.java | 6
modules/plugins/perftest/src/test/resources/unit-test-scenario.xml | 8
modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml | 18
modules/plugins/pom.xml | 1
pom.xml | 6
180 files changed, 13970 insertions(+), 721 deletions(-)
New commits:
commit 1a7ea8682fd9dd18e69f62f7e1f14a145e8650bc
Merge: 6b100b8 c1539ab
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jun 24 15:34:57 2011 -0400
Merge commit 'origin/master' into drift-master-merge
Conflicts:
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
modules/core/client-api/src/main/resources/rhq-plugin.xsd
modules/core/dbutils/pom.xml
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
diff --cc modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
index 3f16233,2d6ba8b..93c4417
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
@@@ -33,8 -33,8 +33,9 @@@ import java.util.Set
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.core.clientapi.descriptor.drift.DriftDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.Bundle;
+ import org.rhq.core.clientapi.descriptor.plugin.BundleTargetDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.ContentDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.EventDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.MetricDescriptor;
@@@ -438,13 -440,13 +441,14 @@@ public class PluginMetadataParser
// 2) Classes
// 3) Plugin config
// 4) Resource config
- // 5) Metrics
- // 6) Control operations
- // 7) Process matches (for process scan auto-discovery)
- // 8) Artifacts
- // 9) Child subcategories
- // 10) Bundle Type
- // 11) Bundle Configuration (for types that are targets for bundle deployments)
+ // 5) Drift config
+ // 6) Metrics
+ // 7) Control operations
+ // 8) Process matches (for process scan auto-discovery)
+ // 9) Artifacts
+ // 10) Child subcategories
+ // 11) Bundle Type
++ // 12) Bundle Configuration (for types that are targets for bundle deployments)
String classLoaderTypeString = resourceDescriptor.getClassLoader();
if (classLoaderTypeString == null) {
diff --cc modules/core/client-api/src/main/resources/rhq-plugin.xsd
index df79477,dc4a572..65d0fdb
--- a/modules/core/client-api/src/main/resources/rhq-plugin.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
@@@ -563,7 -620,7 +622,8 @@@
<xs:element ref="rhq:event" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="rhq:content" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="resource-configuration" type="config:configuration" minOccurs="0"/>
+ <xs:element name="drift-configuration" type="drift:Drift" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="rhq:bundle-target" minOccurs="0" maxOccurs="1"/>
<xs:element ref="rhq:help" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string"/>
diff --cc modules/core/dbutils/pom.xml
index e5994fe,a368986..e2a599d
--- 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.109</db.schema.version>
- <db.schema.version>2.110</db.schema.version>
++ <db.schema.version>2.112</db.schema.version>
</properties>
<dependencies>
diff --cc modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index f1e99bc,4d66b02..143ea85
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@@ -3389,132 -3389,61 +3389,186 @@@
<schemaSpec version="2.107">
<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>
++
++ <schemaSpec version="2.111">
+ <schema-directSQL>
+ <statement desc="Creating global drift configuration definition">
+ INSERT INTO rhq_config_def (id, name, description)
+ VALUES (1, 'GLOBAL_DRIFT_CONFIG_DEF', 'The drift configuration definition')
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ order_index, dtype, config_def_id)
+ VALUES (1, 'name', 'Drift Configuration Name', 'The drift configuration name', true, 'string',
+ 0, 'property', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ default_value, order_index, dtype, config_def_id)
+ VALUES (2, 'enabled', 'Enabled', 'Enables or disables drift detection for this configuration', true, 'boolean',
+ 'false', 1, 'property', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ order_index, dtype, config_def_id)
+ VALUES (3, 'basedir', 'Base Directory', 'The base directory from which files will be monitored for drift.',
+ true, 'string', 2, 'property', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
+ order_index, dtype, default_value, config_def_id)
+ VALUES (4, 'interval', 'Interval', 'The interval, in seconds, between drift detection scans for this configuration. Default is thirty minutes.',
+ false, 'long', 3, 'property', '1800', 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, description, order_index,
+ config_def_id)
+ VALUES (5, 'includes', 'Includes', 'list', 'A set of patterns that specify files and/or directories to include.',
+ 4, 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, parent_list_definition_id)
+ VALUES (6, 'include', 'Include', 'map', 4)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (7, 'path', 'Path', 'A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift configuration.',
+ 'string', 0, 'property', 5)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (8, 'pattern', 'Pattern', 'TBD', 'string', 1, 'property', 5)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, description, order_index,
+ config_def_id)
+ VALUES (9, 'excludes', 'Excludes', 'list', 'A set of patterns that specify files and/or directories to exclude.',
+ 5, 1)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, dtype, parent_list_definition_id)
+ VALUES (10, 'exclude', 'Exclude', 'map', 8)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (11, 'path', 'Path', 'A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift configuration.',
+ 'string', 0, 'property', 9)
+ </statement>
+ <statement>
+ INSERT INTO rhq_config_prop_def (id, name, display_name, description, simple_type,
+ order_index, dtype, parent_map_definition_id)
+ VALUES (12, 'pattern', 'Pattern', 'TBD', 'string', 1, 'property', 9)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
- <schemaSpec version="2.109">
++ <schemaSpec version="2.112">
+ <schema-directSQL>
+ <statement desc="Creating table RHQ_DRIFT_TEMPLATE">
+ CREATE TABLE RHQ_DRIFT_TEMPLATE (
+ RESOURCE_TYPE_ID INTEGER,
+ CONFIG_TEMPLATE_ID INTEGER)
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_DRIFT_TEMPLATE" column="RESOURCE_TYPE_ID" nullable="false"/>
+ <schema-alterColumn table="RHQ_DRIFT_TEMPLATE" column="CONFIG_TEMPLATE_ID" nullable="false"/>
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DRIFT_TEMPLATE foreign key to RHQ_RESOURCE_TYPE">
+ ALTER TABLE RHQ_DRIFT_TEMPLATE
+ ADD CONSTRAINT RESOURCE_TYPE_ID_FK
+ FOREIGN KEY (RESOURCE_TYPE_ID)
+ REFERENCES RHQ_RESOURCE_TYPE (ID)
+ </statement>
+ <statement desc="Creating RHQ_DRIFT_TEMPLATE foreign key to RHQ_CONFIG_TEMPLATE">
+ ALTER TABLE RHQ_DRIFT_TEMPLATE
+ ADD CONSTRAINT CONFIG_TEMPLATE_ID_FK
+ FOREIGN KEY (CONFIG_TEMPLATE_ID)
+ REFERENCES RHQ_CONFIG_TEMPLATE (ID)
+ </statement>
+ </schema-directSQL>
+
+ <schema-directSQL>
+ <statement desc="Creating table RHQ_DRIFT_CONFIG">
+ CREATE TABLE RHQ_DRIFT_CONFIG (
+ RESOURCE_ID INTEGER,
+ CONFIG_ID INTEGER)
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="RESOURCE_ID" nullable="false"/>
+ <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="CONFIG_ID" nullable="false"/>
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DRIFT_CONFIG foreign key to RHQ_RESOURCE">
+ ALTER TABLE RHQ_DRIFT_CONFIG
+ ADD CONSTRAINT RESOURCE_ID_FK
+ FOREIGN KEY (RESOURCE_ID)
+ REFERENCES RHQ_RESOURCE (ID)
+ </statement>
+ <statement desc="Creating RHQ_DRIFT_CONFIG foreign key to RHQ_CONFIG">
+ ALTER TABLE RHQ_DRIFT_CONFIG
+ ADD CONSTRAINT CONFIG_ID_FK
+ FOREIGN KEY (CONFIG_ID)
+ REFERENCES RHQ_CONFIG (ID)
+ </statement>
+ </schema-directSQL>
-
+ </schemaSpec>
++
</dbupgrade>
</target>
</project>
diff --cc modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index 15abcac,efb55e4..ff4904d
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@@ -59,8 -59,9 +59,10 @@@ import javax.persistence.Transient
import javax.xml.bind.annotation.XmlTransient;
import org.rhq.core.domain.bundle.BundleType;
+ import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.event.EventDefinition;
import org.rhq.core.domain.measurement.MeasurementDefinition;
@@@ -393,10 -395,13 +397,17 @@@ public class ResourceType implements Se
@OneToOne(mappedBy = "resourceType", fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true)
private BundleType bundleType;
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ @JoinTable(name = "RHQ_DRIFT_TEMPLATE_MAP", joinColumns = @JoinColumn(name = "RESOURCE_TYPE_ID", nullable = false), inverseJoinColumns = @JoinColumn(name = "CONFIG_TEMPLATE_ID", nullable = false))
+ private Set<ConfigurationTemplate> driftConfigurationTemplates = new HashSet<ConfigurationTemplate>();
+
+ // note that this is mapped to a Configuration entity, which is what it really is. However, our getter/setter
+ // only provides access to this via ResourceTypeBundleConfiguration to encapsulate the innards of this implementation
+ // detail, exposing only the more strongly typed methods to obtain bundle-related config properties
+ @JoinColumn(name = "BUNDLE_CONFIG_ID", nullable = true)
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
+ private Configuration bundleConfiguration;
+
@Transient
private transient String helpText;
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index 0898a97,d501799..5a649fc
--- 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
@@@ -88,5 -89,9 +88,7 @@@ public interface ConfigurationGWTServic
void deleteGroupResourceConfigurationUpdate(Integer groupId, Integer[] groupResourceConfigUpdateIds)
throws RuntimeException;
- /**
- * GWT-RPC service asynchronous (client-side) interface
- * @see ConfigurationGWTService
- */
+ Configuration getConfiguration(int configurationId);
++
+ ConfigurationDefinition getOptionValuesForConfigDefinition(ConfigurationDefinition definition);
}
commit c1539ab2b81270985ba026be2725f8195d9d4917
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 23 11:57:01 2011 -0400
BZ 644328 - abort the bundle deployment if we cannot determine where to put the bundle,
that is, if we don't have an absolute path. We need to do this for those cases
where, for example, a resource doesn't store an absolute path in its plugin config,
resource source or trait - rather it stores a relative path. In this case, we can't
pin that relative path to anything absolute, so we don't know where to put
the bundle.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index b0cd714..29afab5 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -507,7 +507,17 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
}
- return new File(baseLocation, relativeDeployDir);
+ File destDir = new File(baseLocation, relativeDeployDir);
+
+ if (!destDir.isAbsolute()) {
+ throw new IllegalArgumentException("The base location path specified by [" + destBaseDirValueName
+ + "] in the context [" + bundleDestBaseDir.getValueContext()
+ + "] along with the destination directory of [" + relativeDeployDir
+ + "] did not resolve to an absolute path [" + destDir.getPath()
+ + "] so there is no way to know where to put the bundle.");
+ }
+
+ return destDir;
}
/**
commit 44d0542ab1bf78b8953dc69f805f55fa15420509
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 23 11:43:28 2011 -0400
BZ 644328 - enable bundle deployments to jboss-as-5 plugin
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index 40e2441..21161fe 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -1191,6 +1191,17 @@
</configuration>
</content>
+ <bundle-target>
+ <destination-base-dir name="Install Directory" description="The top directory where the JBossAS Server is installed. (i.e. the value found in the 'JBoss Home Directory' connection property)">
+ <value-context>pluginConfiguration</value-context>
+ <value-name>homeDir</value-name>
+ </destination-base-dir>
+ <destination-base-dir name="Profile Directory" description="The profile configuration directory such as 'default', 'minimal', 'production' or similar location. (i.e. the value found in the 'Server Home Dir' connection property)">
+ <value-context>pluginConfiguration</value-context>
+ <value-name>serverHomeDir</value-name>
+ </destination-base-dir>
+ </bundle-target>
+
<server name="JBoss AS JVM"
description="JVM of the JBossAS"
sourcePlugin="JMX"
commit d6718f1139ed78493364cbd25e19ebec436822e7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Jun 22 20:53:15 2011 +0200
Disable the individual test methods, as the class one did not work.
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index 2c9f546..dfa9fd9 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -49,7 +49,7 @@ public class UploadAndDeployTest {
private static final String DC_HOST = "localhost";
private static final int DC_HTTP_PORT = 9990;
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L, enabled=false)
public void testUploadOnly() throws Exception {
String bytes_value = prepare();
@@ -61,7 +61,7 @@ public class UploadAndDeployTest {
}
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L, enabled=false)
public void testDoubleUploadOnly() throws Exception {
String bytes_value = prepare();
@@ -74,7 +74,7 @@ public class UploadAndDeployTest {
assert bytes_value.equals("7jgpMVmynfxpqp8UDleKLmtgbrA=");
}
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L,enabled=false)
public void testUploadIndividualSteps() throws Exception {
String bytes_value = prepare();
@@ -154,7 +154,7 @@ public class UploadAndDeployTest {
}
// Test for AS7-853
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L,enabled = false)
public void testUploadIndividualSteps2() throws Exception {
String bytes_value = prepare();
@@ -228,7 +228,7 @@ public class UploadAndDeployTest {
}
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L,enabled = false)
public void testUploadComposite() throws Exception {
String bytes_value = prepare();
commit 2906b2db5c170ef6d80dad8e74a1a1a956bb4ba0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Jun 22 20:26:16 2011 +0200
Disable the test, as it needs a running as7
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index 57ec4f3..2c9f546 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -41,7 +41,7 @@ import org.rhq.modules.plugins.jbossas7.json.Result;
* the UPLOAD_FILE must point to a valid archive in the resources directory.
* @author Heiko W. Rupp
*/
-@Test
+@Test(enabled = false) // TODO add an "integration test profile" that is able to fire the server before running the test
public class UploadAndDeployTest {
static final String TEST_WAR = "test.war";
@@ -49,7 +49,7 @@ public class UploadAndDeployTest {
private static final String DC_HOST = "localhost";
private static final int DC_HTTP_PORT = 9990;
- @Test(timeOut = 60*1000L, enabled = true)
+ @Test(timeOut = 60*1000L)
public void testUploadOnly() throws Exception {
String bytes_value = prepare();
@@ -61,7 +61,7 @@ public class UploadAndDeployTest {
}
- @Test(timeOut = 60*1000L, enabled = true)
+ @Test(timeOut = 60*1000L)
public void testDoubleUploadOnly() throws Exception {
String bytes_value = prepare();
@@ -74,7 +74,7 @@ public class UploadAndDeployTest {
assert bytes_value.equals("7jgpMVmynfxpqp8UDleKLmtgbrA=");
}
- @Test(timeOut = 60*1000L, enabled = true)
+ @Test(timeOut = 60*1000L)
public void testUploadIndividualSteps() throws Exception {
String bytes_value = prepare();
@@ -154,7 +154,7 @@ public class UploadAndDeployTest {
}
// Test for AS7-853
- @Test(timeOut = 60*1000L, enabled = true)
+ @Test(timeOut = 60*1000L)
public void testUploadIndividualSteps2() throws Exception {
String bytes_value = prepare();
@@ -228,7 +228,7 @@ public class UploadAndDeployTest {
}
- @Test(timeOut = 60*1000L, enabled = true)
+ @Test(timeOut = 60*1000L)
public void testUploadComposite() throws Exception {
String bytes_value = prepare();
commit 28432d866fba7a7cae80e7efc9bd7e84314e113e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Jun 22 10:43:30 2011 -0400
BZ 644328 - when someone creates a new group from within the bundle deploy wizard, prepopulate the
bundle deploy wizard's group selector, but only if the new group supports bundles.
This also clears the radio button options whenever the user starts typing in the
drop down group selector because once you change the group (or start changing the group)
the radio options probably are not valid (we will refresh the options once a valid
group has been selected)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index 54f6f15..7459562 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
import java.util.LinkedHashMap;
import java.util.Set;
+import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
@@ -31,6 +32,8 @@ import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
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.DataArrivedEvent;
+import com.smartgwt.client.widgets.form.fields.events.DataArrivedHandler;
import com.smartgwt.client.widgets.form.fields.events.IconClickEvent;
import com.smartgwt.client.widgets.form.fields.events.IconClickHandler;
import com.smartgwt.client.widgets.form.validator.IsIntegerValidator;
@@ -61,8 +64,9 @@ public class GetDestinationStep extends AbstractWizardStep {
private VLayout form;
DynamicForm valForm = new LocatableDynamicForm("GetDestinationStepValForm");
private SingleCompatibleResourceGroupSelector selector;
- private BundleDestination dest = new BundleDestination();
+ private BundleDestination destination = new BundleDestination();
private boolean createInProgress = false;
+ private RadioGroupItem destBaseDirItem;
public GetDestinationStep(BundleDeployWizard wizard) {
this.wizard = wizard;
@@ -94,7 +98,7 @@ public class GetDestinationStep extends AbstractWizardStep {
value = "";
}
wizard.setSubtitle(value.toString());
- dest.setName(value.toString());
+ destination.setName(value.toString());
}
});
FormUtility.addContextualHelp(nameTextItem, MSG.view_bundle_deployWizard_getDest_name_help());
@@ -108,7 +112,7 @@ public class GetDestinationStep extends AbstractWizardStep {
if (value == null) {
value = "";
}
- dest.setDescription(value.toString());
+ destination.setDescription(value.toString());
}
});
@@ -122,23 +126,23 @@ public class GetDestinationStep extends AbstractWizardStep {
if (value == null) {
value = "";
}
- dest.setDeployDir(value.toString());
+ destination.setDeployDir(value.toString());
}
});
FormUtility.addContextualHelp(deployDirTextItem, MSG.view_bundle_deployWizard_getDest_deployDir_help());
- final RadioGroupItem destBaseDirItem = new RadioGroupItem("destBaseDir", MSG
+ this.destBaseDirItem = new RadioGroupItem("destBaseDir", MSG
.view_bundle_deployWizard_getDest_destBaseDirName());
- destBaseDirItem.setWidth(300);
- destBaseDirItem.setRequired(true);
- destBaseDirItem.setDisabled(true);
- destBaseDirItem.addChangedHandler(new ChangedHandler() {
+ this.destBaseDirItem.setWidth(300);
+ this.destBaseDirItem.setRequired(true);
+ this.destBaseDirItem.setDisabled(true);
+ this.destBaseDirItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
Object value = event.getValue();
if (value != null && value.toString().length() > 0) {
- dest.setDestinationBaseDirectoryName(value.toString());
+ destination.setDestinationBaseDirectoryName(value.toString());
} else {
- dest.setDestinationBaseDirectoryName(null);
+ destination.setDestinationBaseDirectoryName(null);
}
}
});
@@ -152,62 +156,16 @@ public class GetDestinationStep extends AbstractWizardStep {
this.selector.addChangedHandler(new ChangedHandler() {
@Override
public void onChanged(ChangedEvent event) {
- Integer selectedGroupId = null;
-
// if the user is typing in the name of the group, and is only partially
// done, the event value will be the String of the partial group name.
// If the selection is an actual group name, the event value will be
// an integer (the group ID) and that is our indication that the selection
// of an actual group has been made
+ Integer selectedGroupId = null;
if (event.getValue() instanceof Integer) {
selectedGroupId = (Integer) event.getValue();
}
-
- // new group is, or is in the process of being, selected so forget what the base location was before
- dest.setDestinationBaseDirectoryName(null);
- destBaseDirItem.clearValue();
-
- if (selectedGroupId != null) {
- bundleServer.getResourceTypeBundleConfiguration(selectedGroupId.intValue(),
- new AsyncCallback<ResourceTypeBundleConfiguration>() {
- public void onSuccess(ResourceTypeBundleConfiguration result) {
- // populate the base location drop down with all the possible dest base directories
- LinkedHashMap<String, String> menuItems = null;
- if (result != null) {
- Set<BundleDestinationBaseDirectory> baseDirs;
- baseDirs = result.getBundleDestinationBaseDirectories();
- if (baseDirs != null && baseDirs.size() > 0) {
- String defaultSelectedItem = null;
- menuItems = new LinkedHashMap<String, String>(baseDirs.size());
- for (BundleDestinationBaseDirectory baseDir : baseDirs) {
- if (baseDir.getDescription() != null) {
- menuItems.put(baseDir.getName(), "<b>" + baseDir.getName()
- + "</b>: " + baseDir.getDescription());
- } else {
- menuItems.put(baseDir.getName(), baseDir.getName());
- }
- if (defaultSelectedItem == null) {
- defaultSelectedItem = baseDir.getName();
- }
- }
- destBaseDirItem.setValueMap(menuItems);
- destBaseDirItem.setValue(defaultSelectedItem);
- dest.setDestinationBaseDirectoryName(defaultSelectedItem);
- }
- }
-
- destBaseDirItem.setDisabled(menuItems == null);
- }
-
- public void onFailure(Throwable caught) {
- destBaseDirItem.setDisabled(true);
- CoreGUI.getErrorHandler().handleError(
- MSG.view_bundle_deployWizard_error_noBundleConfig(), caught);
- }
- });
- } else {
- destBaseDirItem.setDisabled(true);
- }
+ groupSelectionChanged(selectedGroupId);
}
});
final FormItemIcon newGroupIcon = new FormItemIcon();
@@ -223,7 +181,7 @@ public class GetDestinationStep extends AbstractWizardStep {
FormUtility.addContextualHelp(this.selector, MSG.view_bundle_deployWizard_getDest_group_help(),
newGroupIcon);
- this.valForm.setItems(nameTextItem, descriptionTextAreaItem, this.selector, destBaseDirItem,
+ this.valForm.setItems(nameTextItem, descriptionTextAreaItem, this.selector, this.destBaseDirItem,
deployDirTextItem);
CanvasItem ci1 = new CanvasItem();
ci1.setShowTitle(false);
@@ -271,8 +229,8 @@ public class GetDestinationStep extends AbstractWizardStep {
private void createDestination() {
int selectedGroup = (Integer) this.valForm.getValue("group");
- bundleServer.createBundleDestination(wizard.getBundleId(), dest.getName(), dest.getDescription(), dest
- .getDestinationBaseDirectoryName(), dest.getDeployDir(), selectedGroup, //
+ bundleServer.createBundleDestination(wizard.getBundleId(), destination.getName(), destination.getDescription(),
+ destination.getDestinationBaseDirectoryName(), destination.getDeployDir(), selectedGroup, //
new AsyncCallback<BundleDestination>() {
public void onSuccess(BundleDestination result) {
wizard.setDestination(result);
@@ -295,16 +253,84 @@ public class GetDestinationStep extends AbstractWizardStep {
});
}
+ private void groupSelectionChanged(Integer selectedGroupId) {
+ // new group is, or is in the process of being, selected so forget what the base location was before
+ destination.setDestinationBaseDirectoryName(null);
+ destBaseDirItem.clearValue();
+ destBaseDirItem.setValueMap((String[]) null);
+
+ // this will be null if there is no true group actually selected (e.g. user is typing a partial name to search)
+ if (selectedGroupId != null) {
+ bundleServer.getResourceTypeBundleConfiguration(selectedGroupId.intValue(),
+ new AsyncCallback<ResourceTypeBundleConfiguration>() {
+ public void onSuccess(ResourceTypeBundleConfiguration result) {
+ // populate the base location drop down with all the possible dest base directories
+ LinkedHashMap<String, String> menuItems = null;
+ if (result != null) {
+ Set<BundleDestinationBaseDirectory> baseDirs;
+ baseDirs = result.getBundleDestinationBaseDirectories();
+ if (baseDirs != null && baseDirs.size() > 0) {
+ String defaultSelectedItem = null;
+ menuItems = new LinkedHashMap<String, String>(baseDirs.size());
+ for (BundleDestinationBaseDirectory baseDir : baseDirs) {
+ if (baseDir.getDescription() != null) {
+ menuItems.put(baseDir.getName(), "<b>" + baseDir.getName() + "</b>: "
+ + baseDir.getDescription());
+ } else {
+ menuItems.put(baseDir.getName(), baseDir.getName());
+ }
+ if (defaultSelectedItem == null) {
+ defaultSelectedItem = baseDir.getName();
+ }
+ }
+ destBaseDirItem.setValueMap(menuItems);
+ destBaseDirItem.setValue(defaultSelectedItem);
+ destination.setDestinationBaseDirectoryName(defaultSelectedItem);
+ }
+ }
+
+ destBaseDirItem.setDisabled(menuItems == null);
+ }
+
+ public void onFailure(Throwable caught) {
+ destBaseDirItem.setDisabled(true);
+ CoreGUI.getErrorHandler().handleError(MSG.view_bundle_deployWizard_error_noBundleConfig(),
+ caught);
+ }
+ });
+ } else {
+ destBaseDirItem.setDisabled(true);
+ }
+ }
+
private class QuickGroupCreateWizard extends AbstractGroupCreateWizard {
- private SingleCompatibleResourceGroupSelector selector;
+ private SingleCompatibleResourceGroupSelector groupSelector;
+ private HandlerRegistration handlerRegistrar;
- public QuickGroupCreateWizard(SingleCompatibleResourceGroupSelector selector) {
+ public QuickGroupCreateWizard(SingleCompatibleResourceGroupSelector theSelector) {
super();
- this.selector = selector;
+ this.groupSelector = theSelector;
}
- public void groupCreateCallback(ResourceGroup group) {
- selector.fetchData();
+ public void groupCreateCallback(final ResourceGroup group) {
+ // note: "group" is essentially a flyweight - it doesn't have much other than ID
+ this.groupSelector.setValue(group.getId());
+
+ this.handlerRegistrar = this.groupSelector.addDataArrivedHandler(new DataArrivedHandler() {
+ public void onDataArrived(DataArrivedEvent event) {
+ handlerRegistrar.removeHandler(); // this handler is only needed once, when group wizard is finished with and we created our group
+ if (groupSelector.getSelectedRecord() == null) {
+ // it appears that the user created a group that cannot be a bundle target.
+ groupSelector.clearValue();
+ groupSelectionChanged(null);
+ } else {
+ groupSelectionChanged(group.getId());
+ }
+ }
+ });
+
+ // order is important - we set the value first above, add dataArrivedHandler, then fetch, which triggers our handler
+ this.groupSelector.fetchData();
}
}
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 b06ec2e2753e497bc08041a13d5d5c728a1ffecf
Merge: 3434b60 04f721e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Jun 20 12:54:06 2011 +0200
Merge branch 'master' into as7plugin
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 04f721e861f260537ba85fd33fb79e8620dae01b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jun 17 17:19:06 2011 -0400
provide a "+" add icon to the bundle deploy wizard's create destination step
this allows you to create a group right there in case you don't yet
have a group that you want
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index b7fedc0..54f6f15 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -25,11 +25,14 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
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.IconClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.IconClickHandler;
import com.smartgwt.client.widgets.form.validator.IsIntegerValidator;
import com.smartgwt.client.widgets.form.validator.Validator;
import com.smartgwt.client.widgets.layout.VLayout;
@@ -37,11 +40,13 @@ import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
+import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.deploy.selection.SingleCompatibleResourceGroupSelector;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard.AbstractGroupCreateWizard;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
@@ -205,7 +210,18 @@ public class GetDestinationStep extends AbstractWizardStep {
}
}
});
- FormUtility.addContextualHelp(this.selector, MSG.view_bundle_deployWizard_getDest_group_help());
+ final FormItemIcon newGroupIcon = new FormItemIcon();
+ newGroupIcon.setSrc("[SKIN]/actions/add.png");
+ this.selector.addIconClickHandler(new IconClickHandler() {
+ public void onIconClick(IconClickEvent event) {
+ if (event.getIcon().equals(newGroupIcon)) {
+ new QuickGroupCreateWizard(selector).startWizard();
+ }
+ }
+ });
+
+ FormUtility.addContextualHelp(this.selector, MSG.view_bundle_deployWizard_getDest_group_help(),
+ newGroupIcon);
this.valForm.setItems(nameTextItem, descriptionTextAreaItem, this.selector, destBaseDirItem,
deployDirTextItem);
@@ -278,4 +294,18 @@ public class GetDestinationStep extends AbstractWizardStep {
}
});
}
+
+ private class QuickGroupCreateWizard extends AbstractGroupCreateWizard {
+ private SingleCompatibleResourceGroupSelector selector;
+
+ public QuickGroupCreateWizard(SingleCompatibleResourceGroupSelector selector) {
+ super();
+ this.selector = selector;
+ }
+
+ public void groupCreateCallback(ResourceGroup group) {
+ selector.fetchData();
+ }
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java
new file mode 100644
index 0000000..9ef3573
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java
@@ -0,0 +1,113 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.IButton;
+
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizard;
+import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+
+/**
+ * A wizard for creating a new Resource group. This is an abstract base class that
+ * subclasses can use to perform group creation.
+ *
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public abstract class AbstractGroupCreateWizard extends AbstractWizard {
+ private GroupCreateStep createStep;
+ private GroupMembersStep memberStep;
+
+ public AbstractGroupCreateWizard() {
+ List<WizardStep> steps = new ArrayList<WizardStep>();
+ steps.add(createStep = new GroupCreateStep());
+ steps.add(memberStep = new GroupMembersStep(this));
+ setSteps(steps);
+ }
+
+ public String getWindowTitle() {
+ return MSG.view_groupCreateWizard_windowTitle();
+ }
+
+ public String getTitle() {
+ return MSG.view_groupCreateWizard_title();
+ }
+
+ public String getSubtitle() {
+ return null;
+ }
+
+ public List<IButton> getCustomButtons(int step) {
+ return null;
+ }
+
+ public void cancel() {
+ // Nothing to do. Group is persisted after the "Finish" button.
+ }
+
+ public boolean createGroup() {
+
+ ResourceGroupGWTServiceAsync groupService = GWTServiceLookup.getResourceGroupService();
+
+ groupService.createResourceGroup(createStep.getGroup(), memberStep.getSelectedResourceIds(),
+ new AsyncCallback<ResourceGroup>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_groupCreateWizard_createFailure(), caught);
+ }
+
+ public void onSuccess(ResourceGroup result) {
+ String groupUrl = LinkManager.getResourceGroupLink(result.getId());
+ String conciseMessage = MSG.view_groupCreateWizard_createSuccessful_concise(groupUrl);
+ String detailedMessage = MSG.view_groupCreateWizard_createSuccessful_full(result.getGroupCategory()
+ .name().toLowerCase(), result.getName(), String
+ .valueOf(memberStep.getSelectedResourceIds().length));
+ CoreGUI.getMessageCenter().notify(new Message(conciseMessage, detailedMessage));
+ groupCreateCallback(result);
+ }
+ });
+
+ return true;
+ }
+
+ /**
+ * Subclasses can override this in order to perform additional tasks once the group is created.
+ * Use this to do things like refresh other parts of the UI that need to see the new group
+ * that was created.
+ *
+ * @param group the new group that was created
+ */
+ protected void groupCreateCallback(ResourceGroup group) {
+ return; // no-op - subclasses can override this method to do things
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java
index e437e31..462b636 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java
@@ -22,84 +22,24 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.widgets.IButton;
-
import org.rhq.core.domain.resource.group.ResourceGroup;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizard;
-import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupListView;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
/**
* A wizard for creating a new Resource group.
*
* @author Greg Hinkle
+ * @author John Mazzitelli
*/
-public class GroupCreateWizard extends AbstractWizard {
+public class GroupCreateWizard extends AbstractGroupCreateWizard {
private ResourceGroupListView resourceGroupListView;
- private GroupCreateStep createStep;
- private GroupMembersStep memberStep;
-
public GroupCreateWizard(ResourceGroupListView resourceGroupListView) {
+ super();
this.resourceGroupListView = resourceGroupListView;
-
- List<WizardStep> steps = new ArrayList<WizardStep>();
-
- steps.add(createStep = new GroupCreateStep());
- steps.add(memberStep = new GroupMembersStep(this));
- setSteps(steps);
}
- public String getWindowTitle() {
- return MSG.view_groupCreateWizard_windowTitle();
- }
-
- public String getTitle() {
- return MSG.view_groupCreateWizard_title();
- }
-
- public String getSubtitle() {
- return null;
- }
-
- public List<IButton> getCustomButtons(int step) {
- return null;
- }
-
- public void cancel() {
- // Nothing to do. Group is persisted after the "Finish" button.
- }
-
- public boolean createGroup() {
-
- ResourceGroupGWTServiceAsync groupService = GWTServiceLookup.getResourceGroupService();
-
- groupService.createResourceGroup(createStep.getGroup(), memberStep.getSelectedResourceIds(),
- new AsyncCallback<ResourceGroup>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_groupCreateWizard_createFailure(), caught);
- }
-
- public void onSuccess(ResourceGroup result) {
- String groupUrl = LinkManager.getResourceGroupLink(result.getId());
- String conciseMessage = MSG.view_groupCreateWizard_createSuccessful_concise(groupUrl);
- String detailedMessage = MSG.view_groupCreateWizard_createSuccessful_full(result.getGroupCategory()
- .name().toLowerCase(), result.getName(), String
- .valueOf(memberStep.getSelectedResourceIds().length));
- CoreGUI.getMessageCenter().notify(new Message(conciseMessage, detailedMessage));
- resourceGroupListView.refresh();
- }
- });
-
- return true;
+ public void groupCreateCallback(ResourceGroup group) {
+ resourceGroupListView.refresh();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java
index 0f8fe84..6b4e85d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java
@@ -35,10 +35,10 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
*/
public class GroupMembersStep extends AbstractWizardStep {
- private GroupCreateWizard wizard = null;
+ private AbstractGroupCreateWizard wizard = null;
private ResourceSelector selector = null;
- public GroupMembersStep(GroupCreateWizard wizard) {
+ public GroupMembersStep(AbstractGroupCreateWizard wizard) {
this.wizard = wizard;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
index c510c4b..09f5ec4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
@@ -50,10 +50,38 @@ public class FormUtility {
}
}
+ /**
+ * Adds a help icon to the given form item. When the help icon is clicked,
+ * the helpText is displayed to the user.
+ *
+ * @param item item that will get a single help icon added to it
+ * @param helpText the help text to show the user when the help icon is clicked
+ */
public static void addContextualHelp(FormItem item, final String helpText) {
+ addContextualHelp(item, helpText, (FormItemIcon[]) null);
+ }
+
+ /**
+ * Just like {@link #addContextualHelp(FormItem, String)} except this will also add
+ * the given icons to the form item, with the help icon being the last icon.
+ *
+ * @param item item that will get the given icons plus a help icon added to it
+ * @param helpText the help text to show the user when the help icon is clicked
+ * @param icons other icons to add to the form item - these will appear before the help icon
+ */
+ public static void addContextualHelp(FormItem item, final String helpText, FormItemIcon... icons) {
final FormItemIcon helpIcon = new FormItemIcon();
helpIcon.setSrc(ImageManager.getHelpIcon());
- item.setIcons(helpIcon);
+
+ if (icons == null) {
+ item.setIcons(helpIcon);
+ } else {
+ FormItemIcon[] allIcons = new FormItemIcon[icons.length + 1];
+ System.arraycopy(icons, 0, allIcons, 0, icons.length);
+ allIcons[icons.length] = helpIcon;
+ item.setIcons(allIcons);
+ }
+
item.addIconClickHandler(new IconClickHandler() {
public void onIconClick(IconClickEvent event) {
if (event.getIcon().equals(helpIcon)) {
commit 757c7d6923741ee83657de0c078a1d46c1603921
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 7e7d926..14d22c2 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;
}
commit 321e2eec625cb9e503e9135722704c3da01c7f15
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jun 17 14:56:35 2011 -0400
rename all on.* sysprops in perftest plugin to rhq.* and replace other ON/JON
references with "RHQ"; in perftest discovery code, if rhq.perftest.scenario
sysprop is not defined, log an info message, rather than an error; include
perftest plugin in RHQ distribution
diff --git a/modules/enterprise/server/ear/pom.xml b/modules/enterprise/server/ear/pom.xml
index 4d6ee84..00b29ea 100644
--- a/modules/enterprise/server/ear/pom.xml
+++ b/modules/enterprise/server/ear/pom.xml
@@ -692,6 +692,12 @@
<artifactItem>
<groupId>org.rhq</groupId>
+ <artifactId>rhq-perftest-plugin</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>org.rhq</groupId>
<artifactId>rhq-snmptrapd-plugin</artifactId>
<version>${project.version}</version>
</artifactItem>
diff --git a/modules/plugins/perftest/README b/modules/plugins/perftest/README
index 3e2f1cb..bb31981 100644
--- a/modules/plugins/perftest/README
+++ b/modules/plugins/perftest/README
@@ -1,12 +1,12 @@
Usage
=============================
-- Deploy the perftest plugin to the JON server (by default, the agent will download the plugin on startup)
+- Deploy the perftest plugin to the RHQ Server (by default, the Agent will download the plugin on startup)
- The scenario to use is specified to the agent through a system property. The value of this property should be the
- name of the XML file without the .xml extension. The property name is on.perftest.scenario. For example (remove
- the quotes)
+ name of the XML file without the .xml extension. The property name is rhq.perftest.scenario. For example (remove
+ the quotes):
- "-Don.perftest.scenario=high-servers-1000"
+ "-Drhq.perftest.scenario=high-servers-1000"
-- Some scenarios may be configurable and require other system properties to dictate its behavior. Check the
- scenario itself for more details.
\ No newline at end of file
+- Some scenarios may be configurable and require other system properties to dictate their behavior. Check the
+ scenario XML files for more details.
\ No newline at end of file
diff --git a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestComponent.java b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestComponent.java
index 485ff20..1f5b2e6 100644
--- a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestComponent.java
+++ b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestComponent.java
@@ -62,7 +62,7 @@ import java.util.Set;
import java.util.Arrays;
/**
- * JON resource component for handling resources defined in the performance test scenario.
+ * RHQ resource component for handling resources defined in the performance test scenario.
*
* @author Jason Dobies
*/
diff --git a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestDiscoveryComponent.java b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestDiscoveryComponent.java
index 6830f5f..e47e9fb 100644
--- a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestDiscoveryComponent.java
+++ b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestDiscoveryComponent.java
@@ -29,7 +29,7 @@ import org.rhq.plugins.perftest.configuration.ConfigurationFactory;
import org.rhq.plugins.perftest.resource.ResourceFactory;
/**
- * JON discovery component for discovering resources defined in the performance test scenario.
+ * RHQ discovery component for discovering resources defined in the performance test scenario.
*
* @author Jason Dobies
*/
diff --git a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestRogueDiscoveryComponent.java b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestRogueDiscoveryComponent.java
index 7f4eeda..433668e 100644
--- a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestRogueDiscoveryComponent.java
+++ b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestRogueDiscoveryComponent.java
@@ -34,8 +34,8 @@ import org.rhq.plugins.perftest.resource.ResourceFactory;
public class PerfTestRogueDiscoveryComponent implements ResourceDiscoveryComponent {
private Log log = LogFactory.getLog(PerfTestRogueDiscoveryComponent.class);
- private static final String SYSPROP_DISCOVERY = "on.perftest.server-rogue-discovery";
- private static final String SYSPROP_DISCOVERY_INT = "on.perftest.server-rogue-discovery-interruptable";
+ private static final String SYSPROP_DISCOVERY = "rhq.perftest.server-rogue-discovery";
+ private static final String SYSPROP_DISCOVERY_INT = "rhq.perftest.server-rogue-discovery-interruptable";
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext context)
throws InvalidPluginConfigurationException, Exception {
diff --git a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/ScenarioManager.java b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/ScenarioManager.java
index 5cd8fea..306f3d5 100644
--- a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/ScenarioManager.java
+++ b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/ScenarioManager.java
@@ -68,7 +68,7 @@ import org.rhq.plugins.perftest.trait.SimpleTraitFactory;
import org.rhq.plugins.perftest.trait.TraitFactory;
/**
- * Loads performance testing scenarios and parses into usable components by the JON resource components.
+ * Loads performance testing scenarios and parses into usable components by the RHQ resource components.
*
* @author Jason Dobies
*/
@@ -82,7 +82,7 @@ public class ScenarioManager {
* name of the scenario, minus the ".xml". For example, to use the scenario defined in high-servers.xml, this
* property should be set to "high-servers".
*/
- public static final String SCENARIO_PROPERTY = "on.perftest.scenario";
+ public static final String SCENARIO_PROPERTY = "rhq.perftest.scenario";
/**
* Resource factory used when a scenario doesn't define any resources of a particular type.
@@ -452,11 +452,11 @@ public class ScenarioManager {
String scenarioName = System.getProperty(SCENARIO_PROPERTY);
if (scenarioName == null) {
- log.error("Cannot find scenario name. Make sure the property " + SCENARIO_PROPERTY + " is set.");
+ log.info("Cannot find scenario name. Make sure the system property " + SCENARIO_PROPERTY + " is set.");
return;
}
- log.info("Loading Performance Testing Scenario: " + scenarioName);
+ log.info("Loading Performance Testing Scenario [" + scenarioName + "]...");
ClassLoader loader = this.getClass().getClassLoader();
URL scenarioUrl = loader.getResource(scenarioName + ".xml");
@@ -485,7 +485,7 @@ public class ScenarioManager {
unmarshaller.setEventHandler(vec);
this.scenario = (Scenario) unmarshaller.unmarshal(scenarioUrl);
} catch (JAXBException e) {
- log.error("Scenario could not be loaded", e);
+ log.error("Scenario [" + scenarioName + "] could not be loaded from [" + scenarioUrl + "]." , e);
return;
}
}
diff --git a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/event/PerfTestEventPoller.java b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/event/PerfTestEventPoller.java
index d3d3713..10af135 100644
--- a/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/event/PerfTestEventPoller.java
+++ b/modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/event/PerfTestEventPoller.java
@@ -10,16 +10,17 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
/**
* Emits events when polled. Set the following system properties to define behavior:
- * on.perftest.events.count (default is "1")
- * on.perftest.events.severity (default is "INFO")
- * on.perftest.events.polling-interval (in seconds; if this is not set, this poller object will never be created)
+ *
+ * rhq.perftest.events.count (default is "1")
+ * rhq.perftest.events.severity (default is "INFO")
+ * rhq.perftest.events.polling-interval (in seconds; if this is not set, this poller object will never be created)
*/
public class PerfTestEventPoller implements EventPoller {
public static final String PERFTEST_EVENT_TYPE = "PerfTestEventType";
- public static final String SYSPROP_EVENTS_POLLING_INTERVAL = "on.perftest.events.polling-interval";
- public static final String SYSPROP_EVENTS_COUNT = "on.perftest.events.count";
- public static final String SYSPROP_EVENTS_SEVERITY = "on.perftest.events.severity";
+ public static final String SYSPROP_EVENTS_POLLING_INTERVAL = "rhq.perftest.events.polling-interval";
+ public static final String SYSPROP_EVENTS_COUNT = "rhq.perftest.events.count";
+ public static final String SYSPROP_EVENTS_SEVERITY = "rhq.perftest.events.severity";
private final ResourceContext resourceContext;
diff --git a/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml
index 2975ccd..abbb55c 100644
--- a/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml
@@ -356,18 +356,18 @@
<help>
<![CDATA[
- <p>To enable the perftest plugin, start the agent with <tt>-Don.perftest.scenario=scenario-name</tt> where the
+ <p>To enable the perftest plugin, start the agent with <tt>-Drhq.perftest.scenario=scenario-name</tt> where the
scenario name matches one of the included scenario files for an inventory structure you would like to
- simulated.</p>
+ simulate.</p>
<p>The following setup, for example, will use some typical server and service configurations resulting in 10
- servers each with 25 child services and each of those will have 2 child-child services.<p>
+ servers each with 25 child services each having 2 child services of their own.<p>
<code><pre>
- -Don.perftest.scenario=configurable-average
- -Don.perftest.server-a-count=10
- -Don.perftest.service-a-count=25
- -Don.perftest.service-ab-count=2
+ -Drhq.perftest.scenario=configurable-average
+ -Drhq.perftest.server-a-count=10
+ -Drhq.perftest.service-a-count=25
+ -Drhq.perftest.service-ab-count=2
</pre></code>
]]>
</help>
diff --git a/modules/plugins/perftest/src/main/resources/artifacts.xml b/modules/plugins/perftest/src/main/resources/artifacts.xml
index 9203575..c12d876 100644
--- a/modules/plugins/perftest/src/main/resources/artifacts.xml
+++ b/modules/plugins/perftest/src/main/resources/artifacts.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<resource type="server-a">
- <simpleResourceGenerator property="on.perftest.server-a-count"/>
- <simpleContentGenerator packageType="artifact1" numberOfPackages="10" property="on.perftest.artifact1-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-a-count"/>
+ <simpleContentGenerator packageType="artifact1" numberOfPackages="10" property="rhq.perftest.artifact1-count"/>
</resource>
</scenario>
diff --git a/modules/plugins/perftest/src/main/resources/calltime.xml b/modules/plugins/perftest/src/main/resources/calltime.xml
index a2967c5..b2ea6c9 100644
--- a/modules/plugins/perftest/src/main/resources/calltime.xml
+++ b/modules/plugins/perftest/src/main/resources/calltime.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<resource type="server-a">
<simpleResourceGenerator numberOfResources="1"/>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-1.xml b/modules/plugins/perftest/src/main/resources/configurable-1.xml
index b904d91..55f88b7 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-1.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-1.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
This scenario will create a number of servers, each with a number of services. Both are configurable
through the properties specified in this file. For example, to create 10 servers, each with 100 services,
the following should be passed to the agent:
- -Don.perftest.scenario=configurable-1 -Don.perftest.server-a-count=10 -Don.perftest.service-a-count=50
+ -Drhq.perftest.scenario=configurable-1 -Drhq.perftest.server-a-count=10 -Drhq.perftest.service-a-count=50
-->
<resource type="server-a">
- <simpleResourceGenerator property="on.perftest.server-a-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-a-count"/>
</resource>
<resource type="service-a">
- <simpleResourceGenerator property="on.perftest.service-a-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-a-count"/>
</resource>
</scenario>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-2.xml b/modules/plugins/perftest/src/main/resources/configurable-2.xml
index 9ae3211..58e9d6a 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-2.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-2.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
This scenario will create a number of servers, each with a number of services. Some services (those of type
@@ -9,20 +9,20 @@
specified in this file. For example, to create 10 servers, each with 20 services, and each of those services
having 5 child services, the following should be passed to the agent:
- -Don.perftest.scenario=configurable-2 -Don.perftest.server-a-count=10 -Don.perftest.service-a-count=50
- -Don.perftest.service-ab-count=5
+ -Drhq.perftest.scenario=configurable-2 -Drhq.perftest.server-a-count=10 -Drhq.perftest.service-a-count=50
+ -Drhq.perftest.service-ab-count=5
-->
<resource type="server-a">
- <simpleResourceGenerator property="on.perftest.server-a-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-a-count"/>
</resource>
<resource type="service-a">
- <simpleResourceGenerator property="on.perftest.service-a-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-a-count"/>
</resource>
<resource type="service-ab">
- <simpleResourceGenerator property="on.perftest.service-ab-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-ab-count"/>
</resource>
</scenario>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-3.xml b/modules/plugins/perftest/src/main/resources/configurable-3.xml
index fbfba82..e84530a 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-3.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-3.xml
@@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
This scenario will create a number of servers, each with a number of services. Both are configurable
through the properties specified in this file. For example, to create 10 servers, each with 100 services,
the following should be passed to the agent:
- -Don.perftest.scenario=configurable-3 -Don.perftest.server-b-count=10 -Don.perftest.service-b-count=50
+ -Drhq.perftest.scenario=configurable-3 -Drhq.perftest.server-b-count=10 -Drhq.perftest.service-b-count=50
-->
<resource type="server-b">
- <simpleResourceGenerator property="on.perftest.server-b-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-b-count"/>
<simpleNumericMeasurementGenerator/>
</resource>
<resource type="service-b">
- <simpleResourceGenerator property="on.perftest.service-b-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-b-count"/>
</resource>
</scenario>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-4.xml b/modules/plugins/perftest/src/main/resources/configurable-4.xml
index 11aefc1..c364e60 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-4.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-4.xml
@@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
This scenario will create a number of servers, each with a number of services (with metrics). Both are configurable
through the properties specified in this file. For example, to create 10 servers, each with 100 services,
the following should be passed to the agent:
- -Don.perftest.scenario=configurable-4 -Don.perftest.server-b-count=10 -Don.perftest.service-b-metrics-count=50
+ -Drhq.perftest.scenario=configurable-4 -Drhq.perftest.server-b-count=10 -Drhq.perftest.service-b-metrics-count=50
-->
<resource type="server-b">
- <simpleResourceGenerator property="on.perftest.server-b-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-b-count"/>
<simpleNumericMeasurementGenerator/>
</resource>
<resource type="service-b-metrics">
- <simpleResourceGenerator property="on.perftest.service-b-metrics-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-b-metrics-count"/>
<simpleNumericMeasurementGenerator/>
</resource>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-5.xml b/modules/plugins/perftest/src/main/resources/configurable-5.xml
index 889b2b2..769fed9 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-5.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-5.xml
@@ -1,25 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
This scenario will create one server with a service that has 5 summary measurements in them.
To create 10 servers, each with 170 services, the following should be passed to the agent:
- -Don.perftest.scenario=configurable-5 -Don.perftest.server-d-count=10 -Don.perftest.service-d-metrics-count=170
+ -Drhq.perftest.scenario=configurable-5 -Drhq.perftest.server-d-count=10 -Drhq.perftest.service-d-metrics-count=170
This collects, on average, 170 measurements per minute (assuming summary measurement collection interval is 5 mins)
-->
<resource type="server-d">
- <simpleResourceGenerator property="on.perftest.server-d-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-d-count"/>
<simpleNumericMeasurementGenerator/>
</resource>
<resource type="service-d-metrics">
- <simpleResourceGenerator property="on.perftest.service-d-metrics-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-d-metrics-count"/>
<simpleNumericMeasurementGenerator/>
<simpleTraitMeasurementGenerator/>
<ConfigurableCallTimeDataGenerator
diff --git a/modules/plugins/perftest/src/main/resources/configurable-6.xml b/modules/plugins/perftest/src/main/resources/configurable-6.xml
index 03bbf97..5340023 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-6.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-6.xml
@@ -1,16 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
-
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<resource type="server-e">
- <simpleResourceGenerator property="on.perftest.server-e-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-e-count"/>
<OOBNumericMeasurementGenerator/>
</resource>
<resource type="service-e-metrics">
- <simpleResourceGenerator property="on.perftest.service-e-metrics-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-e-metrics-count"/>
<OOBNumericMeasurementGenerator/>
</resource>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-alphaomega.xml b/modules/plugins/perftest/src/main/resources/configurable-alphaomega.xml
index 7cd8c0b..5f7dbf0 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-alphaomega.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-alphaomega.xml
@@ -1,41 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
Sets up "omega servers" that have two kinds of child services, "alpha" and "beta".
Example:
- -Don.perftest.scenario=configurable-alphaomega
- -Don.perftest.server-omega-count=10
- -Don.perftest.service-alpha-count=25
- -Don.perftest.service-beta-count=2
+ -Drhq.perftest.scenario=configurable-alphaomega
+ -Drhq.perftest.server-omega-count=10
+ -Drhq.perftest.service-alpha-count=25
+ -Drhq.perftest.service-beta-count=2
You can optionally indicate how many content packages to have:
- -Don.perftest.omega-content[0-4]-count
- -Don.perftest.alpha-content0-count
+ -Drhq.perftest.omega-content[0-4]-count
+ -Drhq.perftest.alpha-content0-count
-->
<resource type="server-omega">
- <simpleResourceGenerator property="on.perftest.server-omega-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-omega-count"/>
<simpleNumericMeasurementGenerator/>
- <simpleContentGenerator packageType="omega-content0" property="on.perftest.omega-content0-count" numberOfPackages="10" />
- <simpleContentGenerator packageType="omega-content1" property="on.perftest.omega-content1-count" numberOfPackages="10" />
- <simpleContentGenerator packageType="omega-content2" property="on.perftest.omega-content2-count" numberOfPackages="10" />
- <simpleContentGenerator packageType="omega-content3" property="on.perftest.omega-content3-count" numberOfPackages="10" />
- <simpleContentGenerator packageType="omega-content4" property="on.perftest.omega-content4-count" numberOfPackages="10" />
+ <simpleContentGenerator packageType="omega-content0" property="rhq.perftest.omega-content0-count" numberOfPackages="10" />
+ <simpleContentGenerator packageType="omega-content1" property="rhq.perftest.omega-content1-count" numberOfPackages="10" />
+ <simpleContentGenerator packageType="omega-content2" property="rhq.perftest.omega-content2-count" numberOfPackages="10" />
+ <simpleContentGenerator packageType="omega-content3" property="rhq.perftest.omega-content3-count" numberOfPackages="10" />
+ <simpleContentGenerator packageType="omega-content4" property="rhq.perftest.omega-content4-count" numberOfPackages="10" />
</resource>
<resource type="service-alpha">
- <simpleResourceGenerator property="on.perftest.service-alpha-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-alpha-count"/>
<simpleNumericMeasurementGenerator/>
- <simpleContentGenerator packageType="alpha-content0" property="on.perftest.alpha-content0-count" numberOfPackages="1" />
+ <simpleContentGenerator packageType="alpha-content0" property="rhq.perftest.alpha-content0-count" numberOfPackages="1" />
</resource>
<resource type="service-beta">
- <simpleResourceGenerator property="on.perftest.service-beta-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-beta-count"/>
<simpleConfigurationGenerator/>
<simpleNumericMeasurementGenerator/>
</resource>
diff --git a/modules/plugins/perftest/src/main/resources/configurable-average.xml b/modules/plugins/perftest/src/main/resources/configurable-average.xml
index 9453373..aabc151 100644
--- a/modules/plugins/perftest/src/main/resources/configurable-average.xml
+++ b/modules/plugins/perftest/src/main/resources/configurable-average.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
This scenario will try to mimic an "average" inventory with a typical number of metrics, plugin
@@ -12,36 +12,36 @@
specified in this file. For example, to create 10 servers, each with 25 services, and each of those services
having 2 child services, the following should be passed to the agent:
- -Don.perftest.scenario=configurable-average
- -Don.perftest.server-a-count=10
- -Don.perftest.service-a-count=25
- -Don.perftest.service-ab-count=2
+ -Drhq.perftest.scenario=configurable-average
+ -Drhq.perftest.server-a-count=10
+ -Drhq.perftest.service-a-count=25
+ -Drhq.perftest.service-ab-count=2
You can optionally indicate how many content packages to have:
- -Don.perftest.package[0-4]-count
- -Don.perftest.childPackage0-count
+ -Drhq.perftest.package[0-4]-count
+ -Drhq.perftest.childPackage0-count
-->
<resource type="server-a">
- <simpleResourceGenerator property="on.perftest.server-a-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-a-count"/>
<simpleConfigurationGenerator/>
<simpleNumericMeasurementGenerator/>
- <simpleContentGenerator packageType="package0" property="on.perftest.package0-count" numberOfPackages="0" />
- <simpleContentGenerator packageType="package1" property="on.perftest.package1-count" numberOfPackages="1" />
- <simpleContentGenerator packageType="package2" property="on.perftest.package2-count" numberOfPackages="2" />
- <simpleContentGenerator packageType="package3" property="on.perftest.package3-count" numberOfPackages="3" />
- <simpleContentGenerator packageType="package4" property="on.perftest.package4-count" numberOfPackages="4" />
+ <simpleContentGenerator packageType="package0" property="rhq.perftest.package0-count" numberOfPackages="0" />
+ <simpleContentGenerator packageType="package1" property="rhq.perftest.package1-count" numberOfPackages="1" />
+ <simpleContentGenerator packageType="package2" property="rhq.perftest.package2-count" numberOfPackages="2" />
+ <simpleContentGenerator packageType="package3" property="rhq.perftest.package3-count" numberOfPackages="3" />
+ <simpleContentGenerator packageType="package4" property="rhq.perftest.package4-count" numberOfPackages="4" />
</resource>
<resource type="service-a">
- <simpleResourceGenerator property="on.perftest.service-a-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-a-count"/>
<simpleConfigurationGenerator/>
<simpleNumericMeasurementGenerator/>
- <simpleContentGenerator packageType="childPackage0" property="on.perftest.childPackage0-count" numberOfPackages="1" />
+ <simpleContentGenerator packageType="childPackage0" property="rhq.perftest.childPackage0-count" numberOfPackages="1" />
</resource>
<resource type="service-ab">
- <simpleResourceGenerator property="on.perftest.service-ab-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-ab-count"/>
<simpleConfigurationGenerator/>
<simpleNumericMeasurementGenerator/>
</resource>
diff --git a/modules/plugins/perftest/src/main/resources/metrics.xml b/modules/plugins/perftest/src/main/resources/metrics.xml
index 1b09b0f..1b7288f 100644
--- a/modules/plugins/perftest/src/main/resources/metrics.xml
+++ b/modules/plugins/perftest/src/main/resources/metrics.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<resource type="server-a">
<simpleResourceGenerator numberOfResources="1"/>
diff --git a/modules/plugins/perftest/src/main/resources/perftest-scenario.xsd b/modules/plugins/perftest/src/main/resources/perftest-scenario.xsd
index ab938e5..3555093 100644
--- a/modules/plugins/perftest/src/main/resources/perftest-scenario.xsd
+++ b/modules/plugins/perftest/src/main/resources/perftest-scenario.xsd
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns:perf="urn:xmlns:jboss.org:on-perftest"
- targetNamespace="urn:xmlns:jboss.org:on-perftest"
+ xmlns:perf="urn:xmlns:jboss.org:rhq-perftest"
+ targetNamespace="urn:xmlns:jboss.org:rhq-perftest"
elementFormDefault="qualified"
jaxb:version="2.0"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
diff --git a/modules/plugins/perftest/src/main/resources/rogue.xml b/modules/plugins/perftest/src/main/resources/rogue.xml
index ac72edf..cc25071 100644
--- a/modules/plugins/perftest/src/main/resources/rogue.xml
+++ b/modules/plugins/perftest/src/main/resources/rogue.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<!--
- -Don.perftest.scenario=rogue
- -Don.perftest.server-rogue-count=10
+ -Drhq.perftest.scenario=rogue
+ -Drhq.perftest.server-rogue-count=10
There is an additional system property you can set to determine the discovery component behavior.
You set this either to "error" which causes discovery component to throw an Exception or you set it to
@@ -13,20 +13,20 @@
value and the component throws an InvalidPluginConfigurationException. If you do not set this, the discovery
component returns normally.
- -Don.perftest.server-rogue-discovery=error // discovery component throws an exception during auto-discovery scan
- -Don.perftest.server-rogue-discovery=foo // discovery component throws an invalid config exception during auto-discovery scan
- -Don.perftest.server-rogue-discovery=60 // discovery component sleeps for 60 seconds during auto-discovery scan
+ -Drhq.perftest.server-rogue-discovery=error // discovery component throws an exception during auto-discovery scan
+ -Drhq.perftest.server-rogue-discovery=foo // discovery component throws an invalid config exception during auto-discovery scan
+ -Drhq.perftest.server-rogue-discovery=60 // discovery component sleeps for 60 seconds during auto-discovery scan
There is another system property that allows the discovery component to abort this discovery sleep.
- If you set on.perftest.server-rogue-discovery-interruptable to true, and the plugin container times out
+ If you set rhq.perftest.server-rogue-discovery-interruptable to true, and the plugin container times out
the discovery, the rogue discovery will be nice and abort what its doing and have the thread return.
Otherwise, the rogue discovery component will ignore the interrupt and keep sleeping until its done.
- -Don.perftest.server-rogue-discovery-interruptable=true
+ -Drhq.perftest.server-rogue-discovery-interruptable=true
-->
<resource type="server-rogue">
- <simpleResourceGenerator property="on.perftest.server-rogue-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-rogue-count"/>
</resource>
</scenario>
\ No newline at end of file
diff --git a/modules/plugins/perftest/src/test/java/org/rhq/plugins/perftest/ScenarioManagerTest.java b/modules/plugins/perftest/src/test/java/org/rhq/plugins/perftest/ScenarioManagerTest.java
index 9fa41fd..1642cbd 100644
--- a/modules/plugins/perftest/src/test/java/org/rhq/plugins/perftest/ScenarioManagerTest.java
+++ b/modules/plugins/perftest/src/test/java/org/rhq/plugins/perftest/ScenarioManagerTest.java
@@ -88,7 +88,7 @@ public class ScenarioManagerTest {
@Test
public void configurableResources() {
// Setup
- System.setProperty("on.perftest.server-b-test", "20");
+ System.setProperty("rhq.perftest.server-b-test", "20");
ResourceType resourceType = new ResourceType("server-b", "plugin", ResourceCategory.SERVER, null);
ResourceDiscoveryContext context = new ResourceDiscoveryContext(resourceType, null, null, null, null, null,
@@ -108,8 +108,8 @@ public class ScenarioManagerTest {
@Test
public void OOBMetrics() {
// Setup
- System.setProperty("on.perftest.server-e-count", "3");
- System.setProperty("on.perftest.service-e-metrics-count", "10");
+ System.setProperty("rhq.perftest.server-e-count", "3");
+ System.setProperty("rhq.perftest.service-e-metrics-count", "10");
// Test
ScenarioManager manager = ScenarioManager.getInstance();
diff --git a/modules/plugins/perftest/src/test/resources/unit-test-scenario.xml b/modules/plugins/perftest/src/test/resources/unit-test-scenario.xml
index 79bd046..7ef3dc3 100644
--- a/modules/plugins/perftest/src/test/resources/unit-test-scenario.xml
+++ b/modules/plugins/perftest/src/test/resources/unit-test-scenario.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:jboss.org:on-perftest">
+ xmlns="urn:xmlns:jboss.org:rhq-perftest">
<resource type="server-a">
<simpleResourceGenerator numberOfResources="10"/>
@@ -10,16 +10,16 @@
</resource>
<resource type="server-b">
- <simpleResourceGenerator property="on.perftest.server-b-test"/>
+ <simpleResourceGenerator property="rhq.perftest.server-b-test"/>
</resource>
<resource type="server-e">
- <simpleResourceGenerator property="on.perftest.server-e-count"/>
+ <simpleResourceGenerator property="rhq.perftest.server-e-count"/>
<OOBNumericMeasurementGenerator/>
</resource>
<resource type="service-e-metrics">
- <simpleResourceGenerator property="on.perftest.service-e-metrics-count"/>
+ <simpleResourceGenerator property="rhq.perftest.service-e-metrics-count"/>
<OOBNumericMeasurementGenerator/>
</resource>
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 3434b60637c8024e83569c50acad52f8e74176da
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 20:06:44 2011 +0200
Fix some option source
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 1b83106..0ccacf6 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -108,16 +108,18 @@
<operation name="server-group:remove" displayName="Remove ServerGroup" description="Remove a server group from the Domain.">
<parameters>
<c:simple-property name="name" description="Name of Group to remove">
- <c:option-source target="resource" expression="type=server-group"/>
+ <c:option-source target="resource" expression="type=ServerGroup"/>
</c:simple-property>
</parameters>
</operation>
<operation name="managed-server:add" displayName="Add managed server" description="Add a new managed server">
<parameters>
<c:simple-property name="servername" displayName="Name of the new server" required="true"/>
- <c:simple-property name="hostname" displayName="Name of the host to put the server on" required="true"/>
+ <c:simple-property name="hostname" displayName="Name of the host to put the server on" required="true">
+ <c:option-source target="resource" expression="type=Host plugin=jboss-as-7"/>
+ </c:simple-property>
<c:simple-property name="server-group" displayName="Server group to add to" required="true">
- <c:option-source target="resource" expression="type=server-group"/>
+ <c:option-source target="resource" expression="type=ServerGroup"/>
</c:simple-property>
<c:simple-property name="socket-bindings" displayName="Socket bindings to base upon" default="standard-sockets" description="Socket bindings to base upon"/>
<c:simple-property name="port-offset" displayName="Port offset" default="0" type="integer" />
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 fabdf620c756d90fd7fccd4af816f01a679e3a25
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 16:08:18 2011 +0200
Add more option-sources.
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index b63bdbc..1b83106 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -107,7 +107,9 @@
</operation>
<operation name="server-group:remove" displayName="Remove ServerGroup" description="Remove a server group from the Domain.">
<parameters>
- <c:simple-property name="name" description="Name of Group to add"/>
+ <c:simple-property name="name" description="Name of Group to remove">
+ <c:option-source target="resource" expression="type=server-group"/>
+ </c:simple-property>
</parameters>
</operation>
<operation name="managed-server:add" displayName="Add managed server" description="Add a new managed server">
@@ -128,7 +130,9 @@
<operation name="managed-server:remove" displayName="Remove managed server" description="Remove a managed server">
<parameters>
<c:simple-property name="servername" displayName="Name of the server to remove" required="true"/>
- <c:simple-property name="hostname" displayName="Name of the host where the server is on" required="true"/>
+ <c:simple-property name="hostname" displayName="Name of the host where the server is on" required="true">
+ <c:option-source target="resource" expression="type=JBossAS-Managed"/>
+ </c:simple-property>
</parameters>
<results>
<c:simple-property name="result" description="Outcome of the remove server operation"/>
commit 26f07e6d14a978989354631f032bac5bddc45c8e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 15:16:00 2011 +0200
Use the new option-source
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 7851d73..b63bdbc 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -114,7 +114,9 @@
<parameters>
<c:simple-property name="servername" displayName="Name of the new server" required="true"/>
<c:simple-property name="hostname" displayName="Name of the host to put the server on" required="true"/>
- <c:simple-property name="server-group" displayName="Server group to add to" required="true"/>
+ <c:simple-property name="server-group" displayName="Server group to add to" required="true">
+ <c:option-source target="resource" expression="type=server-group"/>
+ </c:simple-property>
<c:simple-property name="socket-bindings" displayName="Socket bindings to base upon" default="standard-sockets" description="Socket bindings to base upon"/>
<c:simple-property name="port-offset" displayName="Port offset" default="0" type="integer" />
<c:simple-property name="auto-start" displayName="Autostart" default="false" type="boolean" />
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 aa6ff5c12b3750cd1264b84559306e29b86e062d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 15:29:57 2011 -0400
bumping back JNA version to 3.2.5
diff --git a/pom.xml b/pom.xml
index c47cd49..b7f249e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,7 +94,7 @@
<sigar.version>1.6.5.132</sigar.version>
<sigar.zip.version>1.6.5</sigar.zip.version>
<quartz.version>1.6.5</quartz.version>
- <jna.version>3.2.3</jna.version>
+ <jna.version>3.2.5</jna.version>
<twitter4j.version>2.1.2</twitter4j.version>
<commons-codec.version>1.4</commons-codec.version>
<testng.version>5.13.1</testng.version>
commit cc03cf67d114ba6914d685e17bdbe86bb1cf841a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 15:26:37 2011 -0400
BZ 644328 - even though webservices aren't used much anymore, I see we are missing lots of @WebMethod annotations, so I'm adding them.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 273f2c2..41ec97c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -89,7 +89,6 @@ public interface BundleManagerRemote {
* @return the new BundleFile
* @throws Exception
*/
-
@WebMethod
BundleFile addBundleFile( //
@WebParam(name = "subject") Subject subject, //
@@ -104,6 +103,7 @@ public interface BundleManagerRemote {
*
* @see {@link addBundleFile(Subject, int, String, String, Architecture, InputStream, boolean)}
*/
+ @WebMethod
BundleFile addBundleFileViaByteArray( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleVersionid") int bundleVersionId, //
@@ -117,6 +117,7 @@ public interface BundleManagerRemote {
*
* @see {@link addBundleFile(Subject, int, String, String, Architecture, InputStream, boolean)}
*/
+ @WebMethod
BundleFile addBundleFileViaURL( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleVersionid") int bundleVersionId, //
@@ -130,6 +131,7 @@ public interface BundleManagerRemote {
*
* @see {@link addBundleFile(Subject, int, String, String, Architecture, InputStream, boolean)}
*/
+ @WebMethod
BundleFile addBundleFileViaPackageVersion( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleVersionid") int bundleVersionId, //
@@ -150,6 +152,7 @@ public interface BundleManagerRemote {
* @return the persisted deployment
* @throws Exception
*/
+ @WebMethod
BundleDeployment createBundleDeployment( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleVersionId") int bundleVersionId, //
@@ -173,6 +176,7 @@ public interface BundleManagerRemote {
* @return the persisted destination
* @throws Exception
*/
+ @WebMethod
BundleDestination createBundleDestination( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleId") int bundleId, //
@@ -193,6 +197,7 @@ public interface BundleManagerRemote {
* @return the persisted BundleVersion with alot of the internal relationships filled in to help the caller
* understand all that this method did.
*/
+ @WebMethod
BundleVersion createBundleVersionViaRecipe( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "recipe") String recipe) throws Exception;
@@ -209,6 +214,7 @@ public interface BundleManagerRemote {
* @return the persisted BundleVersion with alot of the internal relationships filled in to help the caller
* understand all that this method did. Bundle files specifically are returned.
*/
+ @WebMethod
BundleVersion createBundleVersionViaFile( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "distributionFile") File distributionFile) throws Exception;
@@ -229,6 +235,7 @@ public interface BundleManagerRemote {
* @return the persisted BundleVersion with alot of the internal relationships filled in to help the caller
* understand all that this method did. Bundle files specifically are returned.
*/
+ @WebMethod
BundleVersion createBundleVersionViaURL( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "distributionFileUrl") String distributionFileUrl) throws Exception;
@@ -332,6 +339,7 @@ public interface BundleManagerRemote {
* @return The List of filenames.
* @throws Exception
*/
+ @WebMethod
Set<String> getBundleVersionFilenames( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleVersionId") int bundleVersionId, //
commit d8513869945fbe84642266abe709cd78490a10e0
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 15:25:52 2011 -0400
BZ 644328 - the description is optional - if it wasn't specified, then just show the name
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index 21a6a64..b7fedc0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -175,8 +175,12 @@ public class GetDestinationStep extends AbstractWizardStep {
String defaultSelectedItem = null;
menuItems = new LinkedHashMap<String, String>(baseDirs.size());
for (BundleDestinationBaseDirectory baseDir : baseDirs) {
- menuItems.put(baseDir.getName(), "<b>" + baseDir.getName() + "</b>: "
- + baseDir.getDescription());
+ if (baseDir.getDescription() != null) {
+ menuItems.put(baseDir.getName(), "<b>" + baseDir.getName()
+ + "</b>: " + baseDir.getDescription());
+ } else {
+ menuItems.put(baseDir.getName(), baseDir.getName());
+ }
if (defaultSelectedItem == null) {
defaultSelectedItem = baseDir.getName();
}
commit a75d63257ea4c4212e66c6a18f1c69286a75e895
Merge: 2ec2511 b166bce
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 14:32:56 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
commit b166bce2bb8319661e3f169edc73f7644bc89600
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Jun 16 19:32:38 2011 +0200
Improving the apache vhost upgrade process. Now we can successfully upgrade resoures from RHQ 1.x even if RHQ 3 would get them wrong.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
index d6a36fb..28f68da 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
@@ -191,7 +191,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
//yay, we can use the snmpService index to determine which vhost we're dealing with
if (snmpServiceIndex == 1) {
//k, looks the vhost was representing the main server. Let's do a cross-check.
- List<String> legacyResourceKeys = legacyResourceKeyUtil.getLegacyMainServerResourceKeys();
+ Set<String> legacyResourceKeys = legacyResourceKeyUtil.getLegacyMainServerResourceKeys();
if (legacyResourceKeys.contains(resourceKey)) {
newResourceKey = ApacheVirtualHostServiceComponent.MAIN_SERVER_RESOURCE_KEY;
} else {
@@ -214,7 +214,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
//right, let's do a cross-check before we actually create the resource key so
//that we catch user-generated errors.
- List<String> legacyResourceKeys = legacyResourceKeyUtil.getLegacyVirtualHostResourceKeys(vhost);
+ Set<String> legacyResourceKeys = legacyResourceKeyUtil.getLegacyVirtualHostResourceKeys(vhost);
if (legacyResourceKeys.contains(resourceKey)) {
newResourceKey = createResourceKey(vhost.serverName, vhost.hosts);
} else {
@@ -240,7 +240,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
Map<String, Set<VHostSpec>> possibleMatchesPerRK = new HashMap<String, Set<VHostSpec>>();
for (VHostSpec vhost : vhosts) {
- List<String> legacyResourceKeys = legacyResourceKeyUtil.getLegacyVirtualHostResourceKeys(vhost);
+ Set<String> legacyResourceKeys = legacyResourceKeyUtil.getLegacyVirtualHostResourceKeys(vhost);
for(String legacyRK : legacyResourceKeys) {
addPossibleRKMatch(legacyRK, vhost, possibleMatchesPerRK);
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/VirtualHostLegacyResourceKeyUtil.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/VirtualHostLegacyResourceKeyUtil.java
index 6c8436e..c1f98aa 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/VirtualHostLegacyResourceKeyUtil.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/VirtualHostLegacyResourceKeyUtil.java
@@ -25,7 +25,9 @@ import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.rhq.plugins.apache.ApacheServerComponent;
import org.rhq.plugins.apache.ApacheVirtualHostServiceComponent;
@@ -64,15 +66,11 @@ public class VirtualHostLegacyResourceKeyUtil {
* This uses the algoritms used in the RHQ 3 codebase and returns both the resource key
* that would be generated wihout SNMP support and with it.
* <p>
- * The returned list contains either 1 or 2 elements. The first element is always the resource
- * key as it would be generated without SNMP support. The second element is the resource key as
- * it would be derived from the SNMP record. If the legacy algorithm wouldn't be able to
- * deduce the resource key from SNMP (which could happen), the second element wouldn't be present
- * in the resulting list.
- * .
+ * The returned set also contains the resource key as it would be found by RHQ 1.x
+ *
* @return possible resource keys of the main server.
*/
- public List<String> getLegacyMainServerResourceKeys() {
+ public Set<String> getLegacyMainServerResourceKeys() {
String mainServerUrl = serverComponent.getServerUrl();
String key = null;
@@ -94,29 +92,32 @@ public class VirtualHostLegacyResourceKeyUtil {
key = ApacheVirtualHostServiceComponent.MAIN_SERVER_RESOURCE_KEY;
}
+ Set<String> ret = new HashSet<String>();
+
+ ret.add(key);
+
String snmpKey = getSNMPResourceKey(key);
- String[] ret = new String[snmpKey == null ? 1 : 2];
-
- ret[0] = key;
if (snmpKey != null) {
- ret[1] = snmpKey;
+ ret.add(snmpKey);
}
+
+ ret.add(addressUtility.getHttpdInternalMainServerAddressRepresentation(runtimeConfig).toString(false, false));
- return Arrays.asList(ret);
+ return ret;
}
/**
* Returns a list of possible resource keys that the RHQ 3 code could generate for the specified
* vhost.
* <p>
- * As with {@link #getLegacyMainServerResourceKeys()} the resulting list will contain either 1 or
- * 2 elements depending on the ability of the legacy algorithm to deduce the resource key from SNMP.
+ * As with {@link #getLegacyMainServerResourceKeys()} the resulting set will contain all the various
+ * resource keys that could have been found by past versions of the plugin.
*
* @param vhost
* @return the possible vhosts
*/
- public List<String> getLegacyVirtualHostResourceKeys(VHostSpec vhost) {
+ public Set<String> getLegacyVirtualHostResourceKeys(VHostSpec vhost) {
String host = vhost.hosts.get(0);
HttpdAddressUtility.Address hostAddr = HttpdAddressUtility.Address.parse(host);
if (vhost.serverName != null) {
@@ -133,16 +134,19 @@ public class VirtualHostLegacyResourceKeyUtil {
String key = hostAddr.host + ":" + hostAddr.port;
- String snmpKey = getSNMPResourceKey(key);
-
- String[] ret = new String[snmpKey == null ? 1 : 2];
- ret[0] = key;
+ Set<String> ret = new HashSet<String>();
+
+ ret.add(key);
+ String snmpKey = getSNMPResourceKey(key);
if (snmpKey != null) {
- ret[1] = snmpKey;
+ ret.add(snmpKey);
}
-
- return Arrays.asList(ret);
+
+ String snmpKeyFromRhq1 = addressUtility.getHttpdInternalVirtualHostAddressRepresentation(runtimeConfig, vhost.hosts.get(0), vhost.serverName).toString(false, false);
+ ret.add(snmpKeyFromRhq1);
+
+ return ret;
}
private String getSNMPResourceKey(String nonSnmpResourceKey) {
commit c6ebdb696373e10dcfa7ed28eed0e7547efaa615
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Jun 16 19:31:13 2011 +0200
BZ 711135 - define defaults to all required properties in the apache plugin configuration so that upgrade of the plugin on the server succeeds.
diff --git a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
index f3cf33f..ad08a22 100644
--- a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
@@ -84,7 +84,7 @@
</c:list-property>
'>
<!ENTITY DocumentRoot '
- <c:simple-property name="DocumentRoot">
+ <c:simple-property name="DocumentRoot" default="THIS IS AUTO-DISCOVERED">
<c:description>
This directive sets the directory from which httpd will serve files. Unless matched by a directive like Alias, the server appends the path from the requested URL to the document root to make the path to the document.
If the directory-path is not absolute then it is assumed to be relative to the ServerRoot.
@@ -264,14 +264,14 @@
activationPolicy: immediate
-->
<c:simple-property name="serverRoot" required="true"
- description="the absolute path of the Apache server root directory"/>
+ description="the absolute path of the Apache server root directory" default="THIS SHOULD BE AUTO-DISCOVERED"/>
<c:simple-property name="executablePath" required="false"
description="the path to the Apache executable - if the path is not absolute, it will be resolved relative to the server root directory; if unset, default value is 'bin/httpd' on UNIX or 'bin\Apache.exe' on Windows"/>
<c:simple-property name="controlScriptPath" required="false"
description="the path to the Apache control script - if the path is not absolute, it will be resolved relative to the server root directory; if unset, default will be 'bin/apachectl' on UNIX or the Apache executable on Windows"/>
<!-- TODO need to add a comment about the file location on Win* -->
<c:simple-property name="configFile" required="true" readOnly="true"
- description="the path to the httpd.conf file - if the path is not absolute, it will be resolved relative to the server root directory; if unset, default will be 'conf/httpd.conf' on UNIX"/>
+ description="the path to the httpd.conf file - if the path is not absolute, it will be resolved relative to the server root directory; if unset, default will be 'conf/httpd.conf' on UNIX" default="THIS SHOULD BE AUTO-DISCOVERED"/>
<c:simple-property name="url" displayName="URL" required="false"
description="The http or https URL that will be used to check availability for this Apache
server; if not set, availablity will be determined based on whether plugin can connect
@@ -320,7 +320,7 @@
</c:property-options>
</c:simple-property>
- <c:simple-property name="vhostFilesMask" displayName="Path To Contain Virtual Hosts Files">
+ <c:simple-property name="vhostFilesMask" displayName="Path To Contain Virtual Hosts Files" default="conf.d/*.conf">
<c:description>
If the new virtual hosts should be created in standalone files, this mask determines where
to create those files. The '*' in the path is replaced by the name of the virtual host.
@@ -718,7 +718,7 @@
<service name="Directory" class="ApacheDirectoryComponent" discovery="ApacheDirectoryDiscoveryComponent" createDeletePolicy="both">
<plugin-configuration>
- <c:simple-property name="directiveIndex" readOnly="true" required="true" type="integer"/>
+ <c:simple-property name="directiveIndex" readOnly="true" required="true" type="integer" default="-1"/>
<c:simple-property name="regexp" displayName="Regular Expression" type="boolean" default="false" readOnly="true"
description="Does the name of this directory denote a regular expression?"/>
</plugin-configuration>
commit ab97d23a233552d206f198f71bcdd711618a7bb0
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Jun 16 19:26:15 2011 +0200
BZ 712429 - giving out more useful error message in case of resource key conflict during the resource upgrade.
The error message now contains the details of the resources given resource conflicts with so that the user can easily locate them.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
index cee582e..915c8e0 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
@@ -19,6 +19,7 @@
package org.rhq.core.pc.upgrade;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -59,7 +60,7 @@ public class ResourceUpgradeDelegate {
private boolean enabled = true;
private Set<ResourceUpgradeRequest> requests = new HashSet<ResourceUpgradeRequest>();
- private Set<ResourceUpgradeRequest> originalResourceData = new HashSet<ResourceUpgradeRequest>();
+ private Set<ResourceUpgradeRequest> originalResourceData = new HashSet<ResourceUpgradeRequest>();
private InventoryManager inventoryManager;
private Set<Resource> failedResources = new HashSet<Resource>();
private Map<Resource, Set<ResourceType>> failedResourceTypesPerParent = new HashMap<Resource, Set<ResourceType>>();
@@ -154,19 +155,21 @@ public class ResourceUpgradeDelegate {
if ((upgradeErrors = checkUpgradeValid(resource, request)) != null) {
//the resource is in its upgraded state but it's going to get reverted back to the original state
//in the code below. Let's use the original resource for the error message so that we don't confuse
- //the user.
- for(ResourceUpgradeRequest orig : originalResourceData) {
- if (orig.equals(request)) {
- orig.updateResource(resource);
- break;
- }
+ //the user.
+ ResourceUpgradeRequest orig = findOriginal(request);
+
+ //orig should never be null, but let's be paranoid
+ if (orig != null) {
+ orig.updateResource(resource);
}
- String errorString = "Upgrading the resource [" + resource + "] using these updates [" + request
- + "] would render the inventory invalid because of the following reasons: " + upgradeErrors;
+
+ String errorString = "Upgrading the resource [" + resource + "] using these updates ["
+ + request + "] would render the inventory invalid because of the following reasons: "
+ + upgradeErrors;
//now switch the resource back to the upgraded state for the rest of the code below again
request.updateResource(resource);
-
+
log.error(errorString);
IllegalStateException ex = new IllegalStateException(errorString);
@@ -176,7 +179,7 @@ public class ResourceUpgradeDelegate {
//to the server and locally roll back to the previous state.
request.setErrorProperties(ex);
request.clearUpgradeData();
-
+
if (request.getUpgradeErrorMessage() != null) {
rememberFailure(resource);
inventoryManager.deactivateResource(resource);
@@ -185,7 +188,7 @@ public class ResourceUpgradeDelegate {
}
}
}
-
+
//now before we talk to server and sync up the upgraded data,
//reset the resources to their original values so that any changes
//the server makes to the upgrade data are applied to the "vanilla" state
@@ -197,12 +200,12 @@ public class ResourceUpgradeDelegate {
request.updateResource(resource);
}
}
-
+
//merge the resources with the data as received from the server
//(this can differ from what the upgrade "wants" because the server is
//free to disallow some changes, e.g. resource name change)
inventoryManager.mergeResourcesFromUpgrade(requests);
-
+
//and now restart all the "touched" resources with the true intended
//data
for (ResourceUpgradeRequest request : requests) {
@@ -235,16 +238,17 @@ public class ResourceUpgradeDelegate {
ResourceComponent<T> parentResourceComponent = resourceContainer.getResourceContext()
.getParentResourceComponent();
-
+
Resource parentResource = resourceContainer.getResource().getParentResource();
ResourceContainer parentResourceContainer = (parentResource != null) ? inventoryManager
.getResourceContainer(resourceContainer.getResource().getParentResource()) : null;
- ResourceContext<?> parentResourceContext = parentResourceContainer == null ? null : parentResourceContainer.getResourceContext();
-
+ ResourceContext<?> parentResourceContext = parentResourceContainer == null ? null : parentResourceContainer
+ .getResourceContext();
+
Resource resource = resourceContainer.getResource();
-
+
ResourceDiscoveryComponent<ResourceComponent<T>> discoveryComponent = PluginContainer.getInstance()
.getPluginComponentFactory().getDiscoveryComponent(resource.getResourceType(), parentResourceContainer);
@@ -281,41 +285,80 @@ public class ResourceUpgradeDelegate {
rememberFailure(resource);
return false;
}
-
+
//alright, everything went fine with the upgrade. Let's update the data of the resource
//right now so that it starts up as if it was already upgraded. This is to ensure that
//its children will use a parent component that behaves like the upgraded one.
//We are going to roll back the upgraded data if the upgrade fails to sync with the server
//later on.
-
+
//remember the original values
ResourceUpgradeRequest original = new ResourceUpgradeRequest(resource.getId());
original.fillInFromResource(resource);
originalResourceData.add(original);
-
+
//update the resource
request.updateResource(resource);
-
+
return true;
}
private String checkUpgradeValid(Resource resource, ResourceUpgradeReport upgradeReport) {
StringBuilder s = new StringBuilder();
- if (!checkResourceKeyUniqueAmongSiblings(resource, upgradeReport)) {
- s.append("\nAnother inventoried sibling resource of the same type already has the proposed resource key or would have it after the upgrade.");
+ Set<Resource> duplicitSiblings = findDuplicitSiblingResources(resource, upgradeReport);
+ if (!duplicitSiblings.isEmpty()) {
+ s.append("After the upgrade, the following resources would have the same resource key which is illegal. This is an issue of either the old or the new version of the plugin '"
+ + resource.getResourceType().getPlugin()
+ + "'. Please consult the documentation of the plugin to see what are the recommended steps to resolve this situation:\n");
+
+ //ok, this is a little tricky
+ //this method is called when the inventory is in the state as it would look after a
+ //successful upgrade.
+ //but just now, we found out that the upgrade won't succeed because we found some
+ //conflicting resources. These resources won't be upgraded but right now, we see
+ //them as if they were.
+ //For each resource, we therefore need to find the corresponding "original" and report
+ //that instead of how the resource looks like right now.
+ for (Resource r : duplicitSiblings) {
+ ResourceUpgradeRequest fakeRequest = new ResourceUpgradeRequest(r.getId());
+ fakeRequest.fillInFromResource(r);
+
+ ResourceUpgradeRequest orig = findOriginal(fakeRequest);
+
+ //we might not find the original, because this resource might not need an upgrade.
+ //in that case, the reporting will be accurate because upgrade didn't touch the resource.
+ if (orig != null) {
+ orig.updateResource(r);
+ }
+
+ //now we have the resource as it looked before the upgrade kicked in (which is in this
+ //case also what it will look like after the upgrade finishes, because we're failing it).
+ s.append(r).append(",\n");
+
+ //and revert the resource back to what it looked like (i.e. back to the upgraded state so
+ //that we don't introduce side-effects in this method).
+ if (orig != null) {
+ fakeRequest.updateResource(r);
+ }
+ }
+
+ //remove the trailing ",\n"
+ s.replace(s.length() - 2, s.length(), "");
}
return s.length() > 0 ? s.toString() : null;
}
- private boolean checkResourceKeyUniqueAmongSiblings(Resource resource, ResourceUpgradeReport upgradeReport) {
+ private Set<Resource> findDuplicitSiblingResources(Resource resource, ResourceUpgradeReport upgradeReport) {
Resource parent = resource.getParentResource();
if (parent == null) {
//there is only a single platform resource on an agent
- return true;
+ return Collections.emptySet();
}
+ Set<Resource> ret = new HashSet<Resource>();
+
for (Resource sibling : parent.getChildResources()) {
//we'd have a resource key conflict if there was a resource
//of the same type under the same parent that would have the same
@@ -325,18 +368,18 @@ public class ResourceUpgradeDelegate {
&& !sibling.getUuid().equals(resource.getUuid())) {
if (sibling.getResourceKey().equals(upgradeReport.getNewResourceKey())) {
- return false;
+ ret.add(sibling);
}
}
}
- return true;
+ return ret;
}
-
+
private void rememberFailure(Resource resource) {
failedResources.add(resource);
Resource parentResource = resource.getParentResource();
-
+
Set<ResourceType> failedResourceTypesInParent = failedResourceTypesPerParent.get(parentResource);
if (failedResourceTypesInParent == null) {
failedResourceTypesInParent = new HashSet<ResourceType>();
@@ -345,4 +388,14 @@ public class ResourceUpgradeDelegate {
failedResourceTypesInParent.add(resource.getResourceType());
}
+
+ private ResourceUpgradeRequest findOriginal(ResourceUpgradeRequest request) {
+ for(ResourceUpgradeRequest original : originalResourceData) {
+ if (original.equals(request)) {
+ return original;
+ }
+ }
+
+ return null;
+ }
}
commit 2ec2511ba508c96a2389f40ea13a121774cdeebd
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 13:32:34 2011 -0400
BZ 644328 - not really related to this BZ but the help icons need to show
a "?" not a "i". For some reason, our built in skin's icon has a "i" in the icon.
I found the smartgwt ? icon and used that.
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png
index 12cd1ae..25ce508 100644
Binary files a/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png
index 4fc784a..ff2fd21 100644
Binary files a/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png differ
commit 83d78504eac6fd1afdab1e2eab1ab598cbd2f336
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 13:24:23 2011 -0400
BZ 644328 - add context help to some fields in the bundle deploy wizard
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
index 8be3976..4c8fbfa 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
@@ -25,6 +25,13 @@ public class ImageManager {
public static final String IMAGES_DIR = "images/";
+ /**
+ * Returns a generic "help" icon. This will also have a peer "disabled" help icon.
+ */
+ public static String getHelpIcon() {
+ return "global/help.png";
+ }
+
public static String getLoadingIcon() {
return "ajax-loader.gif";
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index 8d7acfd..21a6a64 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -42,6 +42,7 @@ import org.rhq.enterprise.gui.coregui.client.bundle.deploy.selection.SingleCompa
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
@@ -91,6 +92,7 @@ public class GetDestinationStep extends AbstractWizardStep {
dest.setName(value.toString());
}
});
+ FormUtility.addContextualHelp(nameTextItem, MSG.view_bundle_deployWizard_getDest_name_help());
final TextAreaItem descriptionTextAreaItem = new TextAreaItem("description", MSG
.view_bundle_deployWizard_getDest_desc());
@@ -118,6 +120,7 @@ public class GetDestinationStep extends AbstractWizardStep {
dest.setDeployDir(value.toString());
}
});
+ FormUtility.addContextualHelp(deployDirTextItem, MSG.view_bundle_deployWizard_getDest_deployDir_help());
final RadioGroupItem destBaseDirItem = new RadioGroupItem("destBaseDir", MSG
.view_bundle_deployWizard_getDest_destBaseDirName());
@@ -198,6 +201,7 @@ public class GetDestinationStep extends AbstractWizardStep {
}
}
});
+ FormUtility.addContextualHelp(this.selector, MSG.view_bundle_deployWizard_getDest_group_help());
this.valForm.setItems(nameTextItem, descriptionTextAreaItem, this.selector, destBaseDirItem,
deployDirTextItem);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
index 1097bf1..c510c4b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
@@ -25,6 +25,8 @@ import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.events.IconClickEvent;
import com.smartgwt.client.widgets.form.fields.events.IconClickHandler;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+
/**
* A collection of utility methods for working with SmartGWT {@link DynamicForm}s.
*
@@ -50,7 +52,7 @@ public class FormUtility {
public static void addContextualHelp(FormItem item, final String helpText) {
final FormItemIcon helpIcon = new FormItemIcon();
- helpIcon.setSrc("[SKIN]/actions/help.png");
+ helpIcon.setSrc(ImageManager.getHelpIcon());
item.setIcons(helpIcon);
item.addIconClickHandler(new IconClickHandler() {
public void onIconClick(IconClickEvent event) {
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index a66fbd1..ddd0d3e 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -918,9 +918,12 @@ view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = New Destination
view_bundle_deployWizard_getDest_deployDir = Deployment Directory
+view_bundle_deployWizard_getDest_deployDir_help = The directory where the bundle will be deployed. This directory will be the same for all deployments on all resources but it is relative to the destination base directory location. This means that the absolute directory may have a different path on the different target resources depending on where the base location is on all the different target resources.
view_bundle_deployWizard_getDest_desc = Destination Description
view_bundle_deployWizard_getDest_destBaseDirName = Base Location
+view_bundle_deployWizard_getDest_group_help = The group whose members will be the destination targets for all bundle deployments. Only compatible groups that contain resources that support bundle deployments are selectable.
view_bundle_deployWizard_getDest_name = Destination Name
+view_bundle_deployWizard_getDest_name_help = The name of the destination, which will identify a particular group of resources and the destination directory on those resources for a particular bundle.
view_bundle_deployWizard_getInfoStep = Provide Deployment Information
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index ff33d5d..8edfee2 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -781,9 +781,12 @@ view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
view_bundle_deployWizard_getDestStep = New Destination~
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
-view_bundle_deployWizard_getDest_desc = Destination Description~
+##view_bundle_deployWizard_getDest_deployDir_help = The directory where the bundle will be deployed. This directory will be the same for all deployments on all resources but it is relative to the destination base directory location. This means that the absolute directory may have a different path on the different target resources depending on where the base location is on all the different target resources.
+##view_bundle_deployWizard_getDest_desc = Destination Description
##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
-view_bundle_deployWizard_getDest_name = Destination Name~
+##view_bundle_deployWizard_getDest_group_help = The group whose members will be the destination targets for all bundle deployments. Only compatible groups that contain resources that support bundle deployments are selectable.
+##view_bundle_deployWizard_getDest_name = Destination Name
+##view_bundle_deployWizard_getDest_name_help = The name of the destination, which will identify a particular group of resources and the destination directory on those resources for a particular bundle.
view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)~
view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description~
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index b20b7c0..b9fc4a3 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -919,9 +919,12 @@ view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = New Destination
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
-view_bundle_deployWizard_getDest_desc = Destination Description
+##view_bundle_deployWizard_getDest_deployDir_help = The directory where the bundle will be deployed. This directory will be the same for all deployments on all resources but it is relative to the destination base directory location. This means that the absolute directory may have a different path on the different target resources depending on where the base location is on all the different target resources.
+##view_bundle_deployWizard_getDest_desc = Destination Description
##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
-view_bundle_deployWizard_getDest_name = Destination Name
+##view_bundle_deployWizard_getDest_group_help = The group whose members will be the destination targets for all bundle deployments. Only compatible groups that contain resources that support bundle deployments are selectable.
+##view_bundle_deployWizard_getDest_name = Destination Name
+##view_bundle_deployWizard_getDest_name_help = The name of the destination, which will identify a particular group of resources and the destination directory on those resources for a particular bundle.
view_bundle_deployWizard_getInfoStep = Provide Deployment Information
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 68e9552..1a2ae2f 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -936,9 +936,12 @@ view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
view_bundle_deployWizard_getDestStep = New Destination~
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
-view_bundle_deployWizard_getDest_desc = Destination Description~
+##view_bundle_deployWizard_getDest_deployDir_help = The directory where the bundle will be deployed. This directory will be the same for all deployments on all resources but it is relative to the destination base directory location. This means that the absolute directory may have a different path on the different target resources depending on where the base location is on all the different target resources.
+##view_bundle_deployWizard_getDest_desc = Destination Description
##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
-view_bundle_deployWizard_getDest_name = Destination Name~
+##view_bundle_deployWizard_getDest_group_help = The group whose members will be the destination targets for all bundle deployments. Only compatible groups that contain resources that support bundle deployments are selectable.
+##view_bundle_deployWizard_getDest_name = Destination Name
+##view_bundle_deployWizard_getDest_name_help = The name of the destination, which will identify a particular group of resources and the destination directory on those resources for a particular bundle.
view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)~
view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description~
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index cde574b..0b9d91a 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -918,9 +918,12 @@ view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = \u65B0\u5EFA\u76EE\u7684\u5730
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
+##view_bundle_deployWizard_getDest_deployDir_help = The directory where the bundle will be deployed. This directory will be the same for all deployments on all resources but it is relative to the destination base directory location. This means that the absolute directory may have a different path on the different target resources depending on where the base location is on all the different target resources.
view_bundle_deployWizard_getDest_desc = \u76EE\u7684\u5730\u63CF\u8FF0
##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
+##view_bundle_deployWizard_getDest_group_help = The group whose members will be the destination targets for all bundle deployments. Only compatible groups that contain resources that support bundle deployments are selectable.
view_bundle_deployWizard_getDest_name = \u76EE\u7684\u5730\u540D
+##view_bundle_deployWizard_getDest_name_help = The name of the destination, which will identify a particular group of resources and the destination directory on those resources for a particular bundle.
view_bundle_deployWizard_getInfoStep = \u63D0\u4F9B\u53D1\u5E03\u4FE1\u606F
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
view_bundle_deployWizard_getInfo_deploymentDesc = \u53D1\u5E03\u63CF\u8FF0
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png
new file mode 100644
index 0000000..12cd1ae
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png
new file mode 100644
index 0000000..4fc784a
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/help_Disabled.png differ
commit 969095fc111bff5690a3102f506eedb0beaced98
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Jun 16 11:25:27 2011 -0400
downgrade JNA from 3.2.5 to 3.2.3, since 3.2.3 is the latest version available
in the central repo
diff --git a/pom.xml b/pom.xml
index b7f249e..c47cd49 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,7 +94,7 @@
<sigar.version>1.6.5.132</sigar.version>
<sigar.zip.version>1.6.5</sigar.zip.version>
<quartz.version>1.6.5</quartz.version>
- <jna.version>3.2.5</jna.version>
+ <jna.version>3.2.3</jna.version>
<twitter4j.version>2.1.2</twitter4j.version>
<commons-codec.version>1.4</commons-codec.version>
<testng.version>5.13.1</testng.version>
commit 3431d0db3475816a887511505904576b588367c3
Merge: 5a2ef20 47a5ff6
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 09:57:06 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
commit 5a2ef20fb74acbf56c3ea303852c90e440e5e910
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 16 09:56:42 2011 -0400
BZ 644328 - add description attribute to the bundle-target schema stuff so
we can add help test to the deploy wizard. change the Base Location drop down
menu to a radio button group.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
index c75111b..2d6ba8b 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
@@ -542,7 +542,9 @@ public class PluginMetadataParser {
String name = destBaseDir.getName();
String valueContext = destBaseDir.getValueContext();
String valueName = destBaseDir.getValueName();
- bundleConfiguration.addBundleDestinationBaseDirectory(name, valueContext, valueName);
+ String description = destBaseDir.getDescription();
+ bundleConfiguration.addBundleDestinationBaseDirectory(name, valueContext, valueName,
+ description);
}
resourceType.setResourceTypeBundleConfiguration(bundleConfiguration);
}
diff --git a/modules/core/client-api/src/main/resources/rhq-plugin.xsd b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
index c06b949..dc4a572 100644
--- a/modules/core/client-api/src/main/resources/rhq-plugin.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
@@ -530,10 +530,17 @@
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required">
<xs:annotation>
- <xs:documentation>
- The name given to identify this particular destination base directory.
- </xs:documentation>
- </xs:annotation>
+ <xs:documentation>
+ The name given to identify this particular destination base directory.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="description" type="xs:string" use="optional">
+ <xs:annotation>
+ <xs:documentation>
+ An explanation to the user to describe what this destination location is.
+ </xs:documentation>
+ </xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
index 4ab5755..415383c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
@@ -36,7 +36,7 @@ import org.rhq.core.domain.configuration.PropertySimple;
* the bundle destination base directory definitions (the base locations where bundles can be deployed for resources that
* are of the given type). Rather than expect users of this object to know the internal properties stored in the config, this
* object has strongly-typed methods to extract the properties into more easily consumable POJOs, such as
- * {@link #getBundleDestinationBaseDirectory()} and {@link #addBundleDestinationBaseDirectory(String, String)}.
+ * {@link #getBundleDestinationBaseDirectory()} and {@link #addBundleDestinationBaseDirectory(String, String, String, String)}.
*
* @author John Mazzitelli
*/
@@ -48,6 +48,7 @@ public class ResourceTypeBundleConfiguration implements Serializable {
private static final String BUNDLE_DEST_BASE_DIR_NAME_NAME = "name";
private static final String BUNDLE_DEST_BASE_DIR_VALUE_CONTEXT_NAME = "valueContext";
private static final String BUNDLE_DEST_BASE_DIR_VALUE_NAME_NAME = "valueName";
+ private static final String BUNDLE_DEST_BASE_DIR_DESCRIPTION_NAME = "description";
// this is the actual bundle configuration - see ResourceType.bundleConfiguration
private Configuration bundleConfiguration;
@@ -102,7 +103,9 @@ public class ResourceTypeBundleConfiguration implements Serializable {
String name = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_NAME_NAME, null);
String valueContext = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_VALUE_CONTEXT_NAME, null);
String valueName = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_VALUE_NAME_NAME, null);
- BundleDestinationBaseDirectory bdbd = new BundleDestinationBaseDirectory(name, valueContext, valueName);
+ String description = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_DESCRIPTION_NAME, null);
+ BundleDestinationBaseDirectory bdbd = new BundleDestinationBaseDirectory(name, valueContext, valueName,
+ description);
retVal.add(bdbd);
}
@@ -118,14 +121,16 @@ public class ResourceTypeBundleConfiguration implements Serializable {
* in {@link BundleDestinationBaseDirectory.Context}
* @param valueName the name of the property found in the given context where the value
* of the base directory is
+ * @param description optional explanation for what this destination location is
*/
- public void addBundleDestinationBaseDirectory(String name, String valueContext, String valueName) {
+ public void addBundleDestinationBaseDirectory(String name, String valueContext, String valueName, String description) {
if (this.bundleConfiguration == null) {
throw new NullPointerException("bundleConfiguration == null");
}
// we create this just to make sure the context and value are valid. An exception will be thrown if they are not.
- BundleDestinationBaseDirectory destBaseDir = new BundleDestinationBaseDirectory(name, valueContext, valueName);
+ BundleDestinationBaseDirectory destBaseDir = new BundleDestinationBaseDirectory(name, valueContext, valueName,
+ description);
PropertyList propertyList = this.bundleConfiguration.getList(BUNDLE_DEST_BASE_DIR_LIST_NAME);
if (propertyList == null) {
@@ -138,10 +143,18 @@ public class ResourceTypeBundleConfiguration implements Serializable {
.getValueContext().name());
PropertySimple valueNameProp = new PropertySimple(BUNDLE_DEST_BASE_DIR_VALUE_NAME_NAME, destBaseDir
.getValueName());
+
PropertyMap map = new PropertyMap(BUNDLE_DEST_BASE_DIR_LIST_ITEM_NAME);
map.put(nameProp);
map.put(valueContextProp);
map.put(valueNameProp);
+
+ if (destBaseDir.getDescription() != null) {
+ PropertySimple descriptionProp = new PropertySimple(BUNDLE_DEST_BASE_DIR_DESCRIPTION_NAME, destBaseDir
+ .getDescription());
+ map.put(descriptionProp);
+ }
+
propertyList.add(map);
return;
}
@@ -200,14 +213,16 @@ public class ResourceTypeBundleConfiguration implements Serializable {
private final String name;
private final Context valueContext;
private final String valueName;
+ private final String description;
- public BundleDestinationBaseDirectory(String name, String valueContext, String valueName) {
+ public BundleDestinationBaseDirectory(String name, String valueContext, String valueName, String description) {
if (name == null) {
throw new NullPointerException("name == null");
}
this.name = name;
this.valueContext = Context.valueOf(valueContext); // will throw an exception if its not valid, which is what we want
this.valueName = valueName;
+ this.description = description;
}
/**
@@ -233,11 +248,19 @@ public class ResourceTypeBundleConfiguration implements Serializable {
return valueName;
}
+ /**
+ * @return an explanation for what this directory location is
+ */
+ public String getDescription() {
+ return description;
+ }
+
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("BundleDestinationBaseDirectory [name=").append(name).append(", valueContext=").append(
- valueContext).append(", valueName=").append(valueName).append("]");
+ valueContext).append(", valueName=").append(valueName).append(", description=").append(description)
+ .append("]");
return builder.toString();
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
index 9942cb3..c69331c 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
@@ -401,22 +401,22 @@ public class BundleManagerTest {
// measurement trait value, or strictly on the root file system (using no resource specific value)
ResourceTypeBundleConfiguration rtbc = new ResourceTypeBundleConfiguration(new Configuration());
rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_FS, Context.fileSystem.name(),
- BUNDLE_CONFIG_CONTEXT_VALUE_FS);
+ BUNDLE_CONFIG_CONTEXT_VALUE_FS, null);
serverTypeFS.setResourceTypeBundleConfiguration(rtbc);
rtbc = new ResourceTypeBundleConfiguration(new Configuration());
rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_PC, Context.pluginConfiguration.name(),
- BUNDLE_CONFIG_CONTEXT_VALUE_PC);
+ BUNDLE_CONFIG_CONTEXT_VALUE_PC, null);
serverTypePC.setResourceTypeBundleConfiguration(rtbc);
rtbc = new ResourceTypeBundleConfiguration(new Configuration());
rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_RC, Context.resourceConfiguration.name(),
- BUNDLE_CONFIG_CONTEXT_VALUE_RC);
+ BUNDLE_CONFIG_CONTEXT_VALUE_RC, null);
serverTypeRC.setResourceTypeBundleConfiguration(rtbc);
rtbc = new ResourceTypeBundleConfiguration(new Configuration());
rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_MT, Context.measurementTrait.name(),
- BUNDLE_CONFIG_CONTEXT_VALUE_MT);
+ BUNDLE_CONFIG_CONTEXT_VALUE_MT, null);
serverTypeMT.setResourceTypeBundleConfiguration(rtbc);
// each different resource needs to specify where exactly it wants the bundles deployed
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index cdba5cb..8d7acfd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -18,14 +18,14 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
-import java.util.Arrays;
+import java.util.LinkedHashMap;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
-import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
@@ -119,12 +119,10 @@ public class GetDestinationStep extends AbstractWizardStep {
}
});
- final SelectItem destBaseDirItem = new SelectItem("destBaseDir", MSG
+ final RadioGroupItem destBaseDirItem = new RadioGroupItem("destBaseDir", MSG
.view_bundle_deployWizard_getDest_destBaseDirName());
destBaseDirItem.setWidth(300);
destBaseDirItem.setRequired(true);
- destBaseDirItem.setAllowEmptyValue(false);
- destBaseDirItem.setMultiple(false);
destBaseDirItem.setDisabled(true);
destBaseDirItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
@@ -166,20 +164,23 @@ public class GetDestinationStep extends AbstractWizardStep {
new AsyncCallback<ResourceTypeBundleConfiguration>() {
public void onSuccess(ResourceTypeBundleConfiguration result) {
// populate the base location drop down with all the possible dest base directories
- String[] menuItems = null;
+ LinkedHashMap<String, String> menuItems = null;
if (result != null) {
Set<BundleDestinationBaseDirectory> baseDirs;
baseDirs = result.getBundleDestinationBaseDirectories();
if (baseDirs != null && baseDirs.size() > 0) {
- menuItems = new String[baseDirs.size()];
- int i = 0;
+ String defaultSelectedItem = null;
+ menuItems = new LinkedHashMap<String, String>(baseDirs.size());
for (BundleDestinationBaseDirectory baseDir : baseDirs) {
- menuItems[i++] = baseDir.getName();
+ menuItems.put(baseDir.getName(), "<b>" + baseDir.getName() + "</b>: "
+ + baseDir.getDescription());
+ if (defaultSelectedItem == null) {
+ defaultSelectedItem = baseDir.getName();
+ }
}
- Arrays.sort(menuItems); // just so they are ordered in the drop down list
destBaseDirItem.setValueMap(menuItems);
- destBaseDirItem.setValue(menuItems[0]);
- dest.setDestinationBaseDirectoryName(menuItems[0]);
+ destBaseDirItem.setValue(defaultSelectedItem);
+ dest.setDestinationBaseDirectoryName(defaultSelectedItem);
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index fa55ec1..40a0168 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -1053,7 +1053,7 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
ResourceTypeBundleConfiguration rtbc = new ResourceTypeBundleConfiguration(new Configuration());
rtbc.addBundleDestinationBaseDirectory(TEST_DESTBASEDIR_NAME,
ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory.Context.pluginConfiguration.name(),
- TEST_BUNDLE_DESTBASEDIR_PROP);
+ TEST_BUNDLE_DESTBASEDIR_PROP, null);
resourceType.setResourceTypeBundleConfiguration(rtbc);
resourceType.setPluginConfigurationDefinition(pcDef);
diff --git a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
index dd1d008..a151196 100644
--- a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
@@ -258,11 +258,11 @@
</content>
<bundle-target>
- <destination-base-dir name="Install Directory">
+ <destination-base-dir name="Install Directory" description="The top directory where the JBossAS Server is installed. (i.e. the value found in the 'JBoss Home Directory' connection property)">
<value-context>pluginConfiguration</value-context>
<value-name>jbossHomeDir</value-name>
</destination-base-dir>
- <destination-base-dir name="Configuration Set Directory">
+ <destination-base-dir name="Profile Directory" description="The profile configuration directory such as 'default', 'minimal', 'production' or similar location. (i.e. the value found in the 'Configuration Path' connection property)">
<value-context>pluginConfiguration</value-context>
<value-name>configurationPath</value-name>
</destination-base-dir>
diff --git a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
index 3c56aa4..40f6975 100644
--- a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
@@ -33,7 +33,7 @@
'>
<!ENTITY bundleTarget '
<bundle-target>
- <destination-base-dir name="Root File System">
+ <destination-base-dir name="Root File System" description="The top root directory on the platform (/)" >
<value-context>fileSystem</value-context>
<value-name>/</value-name>
</destination-base-dir>
commit 47a5ff64c25c0f4d8648ed8101152d17863abe4d
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Tue Jun 7 18:40:22 2011 +0200
BZ 711484 - catching all the exceptions that can happen during resource activation
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index d29cd56..dc58717 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -2746,8 +2746,10 @@ public class InventoryManager extends AgentService implements ContainerService,
for (Resource child : resource.getChildResources()) {
activateAndUpgradeResourceRecursively(child, doUpgrade);
}
- } catch (PluginContainerException e) {
- log.error("Exception thrown while activating [" + resource + "].", e);
+ } catch (InvalidPluginConfigurationException e) {
+ log.debug("Failed to activate resource [" + resource + "] due to invalid plugin configuration.", e);
+ } catch (Throwable t) {
+ log.error("Exception thrown while activating [" + resource + "].", t);
}
}
}
commit 5905b70b72eea224790d1254d973ba6dadf6b30e
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Wed Jun 15 15:08:37 2011 -0500
Close all db connections used by dbunit when no longer needed.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
index 83eb204..41b902c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
@@ -18,10 +18,8 @@
*/
package org.rhq.enterprise.server.alert.test;
+import java.sql.Connection;
import java.util.List;
-import java.util.Random;
-
-import javax.persistence.EntityManager;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
@@ -30,27 +28,15 @@ import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.xml.sax.InputSource;
-import org.rhq.core.domain.alert.Alert;
-import org.rhq.core.domain.alert.AlertCondition;
-import org.rhq.core.domain.alert.AlertConditionCategory;
import org.rhq.core.domain.alert.AlertConditionLog;
-import org.rhq.core.domain.alert.AlertDampening;
-import org.rhq.core.domain.alert.AlertDefinition;
-import org.rhq.core.domain.alert.AlertPriority;
-import org.rhq.core.domain.alert.BooleanExpression;
import org.rhq.core.domain.alert.notification.AlertNotificationLog;
-import org.rhq.core.domain.alert.notification.ResultState;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.EntityContext;
-import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -64,14 +50,22 @@ public class AlertManagerBeanTest extends AbstractEJB3Test {
private Subject superuser;
private Resource newResource;
-
@BeforeMethod
public void beforeMethod() throws Exception {
alertManager = LookupUtil.getAlertManager();
superuser = LookupUtil.getSubjectManager().getOverlord();
- IDatabaseConnection connection = new DatabaseConnection(getConnection());
- DatabaseOperation.CLEAN_INSERT.execute(connection, getDataSet());
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
+ DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
newResource = getEntityManager().find(Resource.class, 1);
}
@@ -79,8 +73,17 @@ public class AlertManagerBeanTest extends AbstractEJB3Test {
@AfterClass
public void cleanupDB() throws Exception {
if ("true".equals(System.getProperty("clean.db"))) {
- IDatabaseConnection connection = new DatabaseConnection(getConnection());
- DatabaseOperation.DELETE_ALL.execute(connection, getDataSet());
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
+ DatabaseOperation.DELETE_ALL.execute(dbUnitConnection, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
}
}
@@ -121,5 +124,4 @@ public class AlertManagerBeanTest extends AbstractEJB3Test {
assert 2 == alertManager.deleteAlerts(0L, System.currentTimeMillis() + 600000L); // go out into the future to make sure we get our alert
}
-
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java
index 46005c3..082bd6b 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java
@@ -22,11 +22,11 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.sql.Connection;
import java.util.Random;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
-import javax.persistence.EntityManager;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
@@ -43,6 +43,7 @@ import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
import org.jboss.mx.util.MBeanServerLocator;
@@ -50,14 +51,11 @@ import org.rhq.core.clientapi.server.discovery.InventoryReport;
import org.rhq.core.domain.discovery.ResourceSyncInfo;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.core.comm.ServerCommunicationsService;
import org.rhq.enterprise.server.core.comm.ServerCommunicationsServiceMBean;
-import org.rhq.enterprise.server.discovery.DiscoveryBossLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
-import org.xml.sax.InputSource;
public class DiscoveryBossBeanTest extends AbstractEJB3Test {
private DiscoveryBossLocal discoveryBoss;
@@ -176,9 +174,18 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test {
}
public void initDB() throws Exception {
- IDatabaseConnection conn = new DatabaseConnection(getConnection());
- setDbType(conn);
- DatabaseOperation.CLEAN_INSERT.execute(conn, getDataSet());
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
+ setDbType(dbUnitConnection);
+ DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
}
void setDbType(IDatabaseConnection connection) throws Exception {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/inventory/InventoryManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/inventory/InventoryManagerBeanTest.java
index acb6963..6aa8c4d 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/inventory/InventoryManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/inventory/InventoryManagerBeanTest.java
@@ -1,5 +1,8 @@
package org.rhq.enterprise.server.inventory;
+import static java.util.Arrays.asList;
+
+import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
@@ -24,8 +27,6 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
-import static java.util.Arrays.asList;
-
public class InventoryManagerBeanTest extends AbstractEJB3Test {
@BeforeClass
@@ -34,10 +35,7 @@ public class InventoryManagerBeanTest extends AbstractEJB3Test {
getTransactionManager().begin();
List<Integer> resourceTypeIds = asList(1, 2, 3, 4, 5);
-// List<ResourceType> resourceTypes = asList(
-// getEntityManager().find(ResourceType.class, 1),
-// getEntityManager().find(ResourceType.class, 4));
-
+
InventoryManagerLocal inventoryMgr = LookupUtil.getInventoryManager();
inventoryMgr.markTypesDeleted(resourceTypeIds);
getTransactionManager().commit();
@@ -117,9 +115,18 @@ public class InventoryManagerBeanTest extends AbstractEJB3Test {
}
public void initDB() throws Exception {
- IDatabaseConnection conn = new DatabaseConnection(getConnection());
- setDbType(conn);
- DatabaseOperation.CLEAN_INSERT.execute(conn, getDataSet());
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ IDatabaseConnection conn = new DatabaseConnection(connection);
+ setDbType(conn);
+ DatabaseOperation.CLEAN_INSERT.execute(conn, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
}
void setDbType(IDatabaseConnection connection) throws Exception {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java
index 8eebdb9..7182555 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java
@@ -1,7 +1,10 @@
package org.rhq.enterprise.server.resource.metadata;
+import static org.rhq.core.clientapi.shared.PluginDescriptorUtil.loadPluginDescriptor;
+
import java.io.File;
import java.net.URL;
+import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -36,9 +39,6 @@ import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
-import static org.rhq.core.clientapi.shared.PluginDescriptorUtil.toPluginDescriptor;
-import static org.rhq.core.clientapi.shared.PluginDescriptorUtil.loadPluginDescriptor;
-
public class MetadataBeanTest extends AbstractEJB3Test {
private static List<String> plugins = new ArrayList<String>();
@@ -70,9 +70,18 @@ public class MetadataBeanTest extends AbstractEJB3Test {
}
protected void setupDB() throws Exception {
- DatabaseConnection dbunitConnection = new DatabaseConnection(getConnection());
- setDbType(dbunitConnection);
- DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, getDataSet());
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ DatabaseConnection dbunitConnection = new DatabaseConnection(connection);
+ setDbType(dbunitConnection);
+ DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
}
private void setDbType(IDatabaseConnection connection) throws Exception {
@@ -106,7 +115,6 @@ public class MetadataBeanTest extends AbstractEJB3Test {
}
protected void createPlugin(String pluginFileName, String version, String descriptorFileName) throws Exception {
-// URL descriptorURL = getClass().getResource(descriptorFileName);
URL descriptorURL = getDescriptorURL(descriptorFileName);
PluginDescriptor pluginDescriptor = loadPluginDescriptor(descriptorURL);
String pluginFilePath = getCurrentWorkingDir() + "/" + pluginFileName + ".jar";
@@ -132,25 +140,6 @@ public class MetadataBeanTest extends AbstractEJB3Test {
String dir = getClass().getSimpleName();
return getClass().getResource(dir + "/" + descriptor);
}
-
-// protected void createPlugin(String pluginFileName, String version, String descriptor) throws Exception {
-// PluginDescriptor pluginDescriptor = toPluginDescriptor(descriptor);
-// String pluginFilePath = getCurrentWorkingDir() + "/" + pluginFileName + ".jar";
-// File pluginFile = new File(pluginFilePath);
-//
-// Plugin plugin = new Plugin(pluginDescriptor.getName(), pluginFilePath);
-// plugin.setDisplayName(pluginDescriptor.getName());
-// plugin.setEnabled(true);
-// plugin.setDescription(pluginDescriptor.getDescription());
-// plugin.setAmpsVersion(getAmpsVersion(pluginDescriptor));
-// plugin.setVersion(pluginDescriptor.getVersion());
-// plugin.setMD5(MessageDigestGenerator.getDigestString(pluginFile));
-//
-// SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
-// PluginManagerLocal pluginMgr = LookupUtil.getPluginManager();
-//
-// pluginMgr.registerPlugin(subjectMgr.getOverlord(), plugin, pluginDescriptor, null, true);
-// }
private String getPluginWorkDir() throws Exception {
return getCurrentWorkingDir() + "/work";
@@ -212,13 +201,11 @@ public class MetadataBeanTest extends AbstractEJB3Test {
errors = "Failed to find the following " + propertyName + "(s) for type " + resourceTypeName +
": " + missing;
}
-
+
if (unexpected.size() > 0) {
errors += "\nFailed to find the following " + propertyName + "(s) for type " + resourceTypeName +
": " + unexpected;
}
-
-
}
private boolean contains(ResourceType type, String propertyName, String expected) throws Exception {
@@ -231,5 +218,4 @@ public class MetadataBeanTest extends AbstractEJB3Test {
}
return false;
}
-
}
commit cb91dc2624cf5b1fca44ffcf579b162fc46fee44
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Jun 15 15:07:31 2011 -0400
BZ 644328 - prohibit someone from specifying a ".." directory inside the deployDir for a destination
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 9ea77f5..139efe4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -304,6 +304,14 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
public BundleDestination createBundleDestination(Subject subject, int bundleId, String name, String description,
String destBaseDirName, String deployDir, Integer groupId) throws Exception {
+ // if there is a .. in the path that looks suspicious, reject it. (note the : is to reject things like C:..\..\dir on windows)
+ // this won't allow everything (such as directories that start with ".." like "..abc" or "/abc/..def") but if you are naming
+ // your directories in those strange ways, you deserve what you get
+ if (deployDir.startsWith("..") || deployDir.matches(".*[/:\\\\]\\.\\..*")) {
+ throw new IllegalArgumentException(
+ "Destination directories are not allowed to have '..' parent directory path elements");
+ }
+
Bundle bundle = entityManager.find(Bundle.class, bundleId);
if (null == bundle) {
throw new IllegalArgumentException("Invalid bundleId [" + bundleId + "]");
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 d16af0ea8b4aad419fec5726681e0390ec4c05da
Merge: 7d3e34b 7377e26
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Jun 15 09:29:32 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
commit 7377e269fb933b5340ff029d156dc5b7fbc973ee
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Tue Jun 14 16:11:48 2011 -0500
Update to make dbunit config files oracle friendly.
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
index 388398c..d584809 100644
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
@@ -21,14 +21,14 @@
NAME="admin"
FIRST_NAME="Super"
LAST_NAME="User"
- FSYSTEM="TRUE"/>
+ FSYSTEM="1"/>
<rhq_subject
ID="2"
NAME="rhqadmin"
FIRST_NAME="RHQ"
LAST_NAME="Administrator"
EMAIL_ADDRESS="nobody@localhost"
- FSYSTEM="FALSE"/>
+ FSYSTEM="0"/>
<rhq_resource_type/>
<rhq_resource_subcat/>
<rhq_resource_type_parents/>
@@ -48,12 +48,12 @@
<rhq_role
ID="1"
NAME="Super User Role"
- FSYSTEM="TRUE"
+ FSYSTEM="1"
DESCRIPTION="System superuser role that provides full access to everything. This role cannot be modified."/>
<rhq_role
ID="2"
NAME="All Resources Role"
- FSYSTEM="FALSE"
+ FSYSTEM="0"
DESCRIPTION="Provides full access to all resources in inventory. Cannot modify users, roles or server settings."/>
<rhq_role_resource_group_map/>
<rhq_role_ldap_group/>
@@ -108,37 +108,37 @@
<rhq_alert_condition_log/>
<rhq_alert_notification/>
<rhq_system_config ID="1" PROPERTY_KEY="SERVER_VERSION" PROPERTY_VALUE="4.1.0-SNAPSHOT"
- DEFAULT_PROPERTY_VALUE="4.1.0-SNAPSHOT" FREAD_ONLY="TRUE"/>
+ DEFAULT_PROPERTY_VALUE="4.1.0-SNAPSHOT" FREAD_ONLY="1"/>
<rhq_system_config ID="2" PROPERTY_KEY="DB_SCHEMA_VERSION" PROPERTY_VALUE="2.107"
- DEFAULT_PROPERTY_VALUE="2.107" FREAD_ONLY="TRUE"/>
+ DEFAULT_PROPERTY_VALUE="2.107" FREAD_ONLY="1"/>
<rhq_system_config ID="3" PROPERTY_KEY="CAM_JAAS_PROVIDER" PROPERTY_VALUE="JDBC"
- DEFAULT_PROPERTY_VALUE="JDBC" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="JDBC" FREAD_ONLY="0"/>
<rhq_system_config ID="4" PROPERTY_KEY="CAM_BASE_URL" PROPERTY_VALUE="http://localhost:7080/"
- DEFAULT_PROPERTY_VALUE="http://localhost:7080/" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="http://localhost:7080/" FREAD_ONLY="0"/>
<rhq_system_config ID="9" PROPERTY_KEY="CAM_HELP_USER" PROPERTY_VALUE="web"
- DEFAULT_PROPERTY_VALUE="web" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="web" FREAD_ONLY="0"/>
<rhq_system_config ID="10" PROPERTY_KEY="CAM_HELP_PASSWORD" PROPERTY_VALUE="user"
- DEFAULT_PROPERTY_VALUE="user" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="user" FREAD_ONLY="0"/>
<rhq_system_config ID="32" PROPERTY_KEY="CAM_DATA_MAINTENANCE"
- PROPERTY_VALUE="3600000" DEFAULT_PROPERTY_VALUE="3600000" FREAD_ONLY="FALSE"/>
+ PROPERTY_VALUE="3600000" DEFAULT_PROPERTY_VALUE="3600000" FREAD_ONLY="0"/>
<rhq_system_config ID="34" PROPERTY_KEY="RT_DATA_PURGE" PROPERTY_VALUE="2678400000"
- DEFAULT_PROPERTY_VALUE="2678400000" FREAD_ONLY="FALSE"/>
- <rhq_system_config ID="35" PROPERTY_KEY="DATA_REINDEX_NIGHTLY" PROPERTY_VALUE="true"
- DEFAULT_PROPERTY_VALUE="true" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="2678400000" FREAD_ONLY="0"/>
+ <rhq_system_config ID="35" PROPERTY_KEY="DATA_REINDEX_NIGHTLY" PROPERTY_VALUE="1"
+ DEFAULT_PROPERTY_VALUE="1" FREAD_ONLY="0"/>
<rhq_system_config ID="36" PROPERTY_KEY="ALERT_PURGE" PROPERTY_VALUE="2678400000"
- DEFAULT_PROPERTY_VALUE="2678400000" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="2678400000" FREAD_ONLY="0"/>
<rhq_system_config ID="51" PROPERTY_KEY="EVENT_PURGE" PROPERTY_VALUE="1209600000"
- DEFAULT_PROPERTY_VALUE="1209600000" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="1209600000" FREAD_ONLY="0"/>
<rhq_system_config ID="52" PROPERTY_KEY="AGENT_MAX_QUIET_TIME_ALLOWED" PROPERTY_VALUE="900000"
- DEFAULT_PROPERTY_VALUE="900000" FREAD_ONLY="FALSE"/>
- <rhq_system_config ID="53" PROPERTY_KEY="ENABLE_AGENT_AUTO_UPDATE" PROPERTY_VALUE="true"
- DEFAULT_PROPERTY_VALUE="true" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="900000" FREAD_ONLY="0"/>
+ <rhq_system_config ID="53" PROPERTY_KEY="ENABLE_AGENT_AUTO_UPDATE" PROPERTY_VALUE="1"
+ DEFAULT_PROPERTY_VALUE="1" FREAD_ONLY="0"/>
<rhq_system_config ID="54" PROPERTY_KEY="TRAIT_PURGE" PROPERTY_VALUE="31536000000"
- DEFAULT_PROPERTY_VALUE="31536000000" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="31536000000" FREAD_ONLY="0"/>
<rhq_system_config ID="55" PROPERTY_KEY="AVAILABILITY_PURGE" PROPERTY_VALUE="31536000000"
- DEFAULT_PROPERTY_VALUE="31536000000" FREAD_ONLY="FALSE"/>
- <rhq_system_config ID="56" PROPERTY_KEY="RESOURCE_GENERIC_PROPERTIES_UPGRADE" PROPERTY_VALUE="false"
- DEFAULT_PROPERTY_VALUE="false" FREAD_ONLY="FALSE"/>
+ DEFAULT_PROPERTY_VALUE="31536000000" FREAD_ONLY="0"/>
+ <rhq_system_config ID="56" PROPERTY_KEY="RESOURCE_GENERIC_PROPERTIES_UPGRADE" PROPERTY_VALUE="0"
+ DEFAULT_PROPERTY_VALUE="0" FREAD_ONLY="0"/>
<rhq_plugin/>
<rhq_measurement_def/>
<rhq_measurement_sched/>
commit 7d3e34bd373fca40e499c5692cc6cab3a2b4932d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jun 14 15:55:15 2011 -0400
BZ 644328 - fix deployment view so it doesn't assume a platform is the bundle target.
make the icon dependent on the type of compat group and change the column headers
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index 8ff20ff..03484a4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -338,19 +338,19 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
table.setTitleComponent(new HTMLFlow(MSG.view_bundle_deploy_selectARow()));
// resource icon field
+ ResourceCategory resourceCategory = deployment.getDestination().getGroup().getResourceType().getCategory();
ListGridField resourceIcon = new ListGridField("resourceAvailability");
HashMap<String, String> icons = new HashMap<String, String>();
- icons.put(AvailabilityType.UP.name(), ImageManager.getResourceIcon(ResourceCategory.PLATFORM, Boolean.TRUE));
- icons.put(AvailabilityType.DOWN.name(), ImageManager.getResourceIcon(ResourceCategory.PLATFORM, Boolean.FALSE));
+ icons.put(AvailabilityType.UP.name(), ImageManager.getResourceIcon(resourceCategory, Boolean.TRUE));
+ icons.put(AvailabilityType.DOWN.name(), ImageManager.getResourceIcon(resourceCategory, Boolean.FALSE));
resourceIcon.setValueIcons(icons);
resourceIcon.setValueIconSize(16);
resourceIcon.setType(ListGridFieldType.ICON);
resourceIcon.setWidth(40);
// resource field
- ListGridField resource = new ListGridField("resource", MSG.common_title_platform());
- resource.setAutoFitWidth(true);
- resource.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
+ ListGridField resource = new ListGridField("resource", MSG.common_title_resource());
+ resource.setWidth("*");
resource.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
return "<a href=\"" + LinkManager.getResourceLink(listGridRecord.getAttributeAsInt("resourceId"))
@@ -360,7 +360,7 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
});
// resource version field
- ListGridField resourceVersion = new ListGridField("resourceVersion", MSG.view_bundle_deploy_operatingSystem());
+ ListGridField resourceVersion = new ListGridField("resourceVersion", MSG.common_title_version());
resourceVersion.setAutoFitWidth(true);
resourceVersion.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
@@ -370,7 +370,7 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
status.setValueIconHeight(11);
status.setValueIconWidth(11);
status.setShowValueIconOnly(true);
- status.setWidth("*");
+ status.setWidth(60);
List<ListGridRecord> records = new ArrayList<ListGridRecord>();
for (BundleResourceDeployment rd : deployment.getResourceDeployments()) {
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 1178cea..a66fbd1 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -943,13 +943,12 @@ view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle d
view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
view_bundle_deploy_deployedBy = Deployed By
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms
+view_bundle_deploy_deploymentPlatforms = Deployment Resource
view_bundle_deploy_installDetails = Install Details
view_bundle_deploy_loadBundleFailure = Failed to find bundle
view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
view_bundle_deploy_loadFailure = Failed to load bundle deployment
view_bundle_deploy_name = Deployment Name
-view_bundle_deploy_operatingSystem = Operating System
view_bundle_deploy_selectARow = Select a row to show installation details
view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 938cfd9..ff33d5d 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -801,13 +801,12 @@ view_bundle_deployWizard_selectVersion_select = Select Version from List:~
view_bundle_deployWizard_title = Bundle Deployment Wizard~
view_bundle_deploy_action = Action~
view_bundle_deploy_backButton = Back to Destination~
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms~
+view_bundle_deploy_deploymentPlatforms = Deployment Resource
view_bundle_deploy_installDetails = Install Details~
view_bundle_deploy_loadBundleFailure = Failed to find bundle~
view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments~
view_bundle_deploy_loadFailure = Failed to load bundle deployment~
view_bundle_deploy_name = Deployment Name~
-view_bundle_deploy_operatingSystem = Operating System~
view_bundle_deploy_selectARow = Select a row to show installation details~
view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags~
view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags~
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 919e18f..b20b7c0 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -944,13 +944,12 @@ view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle d
view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
view_bundle_deploy_deployedBy = Deployed By
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms
+view_bundle_deploy_deploymentPlatforms = Deployment Resource
view_bundle_deploy_installDetails = Install Details
view_bundle_deploy_loadBundleFailure = Failed to find bundle
view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
view_bundle_deploy_loadFailure = Failed to load bundle deployment
view_bundle_deploy_name = Deployment Name
-view_bundle_deploy_operatingSystem = Operating System
view_bundle_deploy_selectARow = Select a row to show installation details
view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 1a5974f..68e9552 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -961,13 +961,12 @@ view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle d
view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
view_bundle_deploy_deployedBy = Deployed By
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms~
+view_bundle_deploy_deploymentPlatforms = Deployment Resource
view_bundle_deploy_installDetails = Install Details~
view_bundle_deploy_loadBundleFailure = Failed to find bundle~
view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments~
view_bundle_deploy_loadFailure = Failed to load bundle deployment~
view_bundle_deploy_name = Deployment Name~
-view_bundle_deploy_operatingSystem = Operating System~
view_bundle_deploy_selectARow = Select a row to show installation details~
view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags~
view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags~
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 5902fb6..cde574b 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -949,7 +949,6 @@ view_bundle_deploy_loadBundleFailure = \u67E5\u627Ebundle\u5931\u8D25
view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
view_bundle_deploy_loadFailure = Failed to load bundle deployment
view_bundle_deploy_name = \u53D1\u5E03\u540D
-view_bundle_deploy_operatingSystem = \u64CD\u4F5C\u7CFB\u7EDF
view_bundle_deploy_selectARow = \u9009\u4E2D\u884C\u663E\u793A\u5B89\u88C5\u7EC6\u8282
view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
commit fd7985d3dfd0c8a08ea0e9f8ef67ebbc0aecfa5e
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Tue Jun 14 11:16:01 2011 -0500
Tear down the entire database and rebuild it before running dbunit tests. This will fix FK violations from server/jar tests.
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
index 70f7073..388398c 100644
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
@@ -1,37 +1,326 @@
<dataset>
- <rhq_content_source/>
- <rhq_repo_content_src_map/>
- <rhq_repo/>
- <rhq_config_def/>
- <rhq_config_prop_def/>
- <rhq_conf_prop_def_enum/>
- <rhq_config_prop_constr/>
- <rhq_resource_type/>
- <rhq_resource_type_parents/>
- <rhq_process_scan/>
- <rhq_event_def/>
- <rhq_measurement_def/>
- <rhq_operation_def/>
- <rhq_package_type/>
- <rhq_bundle_type/>
- <rhq_config/>
- <rhq_config_property/>
- <rhq_config_template/>
- <rhq_resource_group_res_exp_map/>
- <rhq_resource_group_res_imp_map/>
- <rhq_resource_subcat/>
- <rhq_resource_group/>
- <rhq_resource/>
- <rhq_prd_ver/>
- <rhq_alert_definition/>
- <rhq_alert_condition/>
- <rhq_alert/>
- <rhq_alert_condition_log/>
- <rhq_alert_notif_log/>
- <rhq_availability/>
- <rhq_measurement_sched/>
- <rhq_package/>
- <rhq_bundle/>
- <rhq_plugin/>
+ <rhq_config_def/>
+ <rhq_config_prop_grp_def/>
+ <rhq_config_prop_def/>
+ <rhq_conf_prop_def_enum/>
+ <rhq_config_prop_constr/>
+ <rhq_config/>
+ <rhq_config_property/>
+ <rhq_config_template/>
+ <rhq_raw_config/>
+ <rhq_affinity_group/>
+ <rhq_server/>
+ <rhq_agent/>
+ <rhq_partition_event/>
+ <rhq_partition_details/>
+ <rhq_failover_list/>
+ <rhq_failover_details/>
+ <rhq_principal id="2" PRINCIPAL="rhqadmin" PASSWORD="x1XwrxKuPvYUILiOnOZTLg=="/>
+ <rhq_subject
+ ID="1"
+ NAME="admin"
+ FIRST_NAME="Super"
+ LAST_NAME="User"
+ FSYSTEM="TRUE"/>
+ <rhq_subject
+ ID="2"
+ NAME="rhqadmin"
+ FIRST_NAME="RHQ"
+ LAST_NAME="Administrator"
+ EMAIL_ADDRESS="nobody@localhost"
+ FSYSTEM="FALSE"/>
+ <rhq_resource_type/>
+ <rhq_resource_subcat/>
+ <rhq_resource_type_parents/>
+ <rhq_process_scan/>
+ <rhq_prd_ver/>
+ <rhq_resource/>
+ <rhq_resource_error/>
+ <rhq_group_def/>
+ <rhq_resource_group/>
+ <rhq_resource_group_res_imp_map/>
+ <rhq_resource_group_res_exp_map/>
+ <rhq_config_group_update/>
+ <rhq_config_update/>
+ <rhq_tagging/>
+ <rhq_tagging_resource_map/>
+ <rhq_tagging_res_group_map/>
+ <rhq_role
+ ID="1"
+ NAME="Super User Role"
+ FSYSTEM="TRUE"
+ DESCRIPTION="System superuser role that provides full access to everything. This role cannot be modified."/>
+ <rhq_role
+ ID="2"
+ NAME="All Resources Role"
+ FSYSTEM="FALSE"
+ DESCRIPTION="Provides full access to all resources in inventory. Cannot modify users, roles or server settings."/>
+ <rhq_role_resource_group_map/>
+ <rhq_role_ldap_group/>
+ <rhq_permission ROLE_ID="1" OPERATION="0"/> <!-- Permission.MANAGE_SECURITY -->
+ <rhq_permission ROLE_ID="1" OPERATION="1"/> <!-- Permission.MANAGE_INVENTORY -->
+ <rhq_permission ROLE_ID="1" OPERATION="2"/> <!-- Permission.MANAGE_SETTINGS -->
+ <rhq_permission ROLE_ID="1" OPERATION="12"/> <!-- Permission.MANAGE_BUNDLE -->
+ <rhq_permission ROLE_ID="1" OPERATION="15"/> <!-- Permission.MANAGE_REPOSITORIES -->
+ <!-- resource permissions start here-->
+ <rhq_permission ROLE_ID="1" OPERATION="3"/> <!-- Permission.VIEW_RESOURCE -->
+ <rhq_permission ROLE_ID="1" OPERATION="4"/> <!-- Permission.MODIFY_RESOURCE -->
+ <rhq_permission ROLE_ID="1" OPERATION="5"/> <!-- Permission.DELETE_RESOURCE -->
+ <rhq_permission ROLE_ID="1" OPERATION="6"/> <!-- Permission.CREATE_CHILD_RESOURCES -->
+ <rhq_permission ROLE_ID="1" OPERATION="7"/> <!-- Permission.MANAGE_ALERTS -->
+ <rhq_permission ROLE_ID="1" OPERATION="8"/> <!-- Permission.MANAGE_MEASUREMENTS -->
+ <rhq_permission ROLE_ID="1" OPERATION="9"/> <!-- Permission.MANAGE_CONTENT -->
+ <rhq_permission ROLE_ID="1" OPERATION="10"/> <!-- Permission.CONTROL -->
+ <rhq_permission ROLE_ID="1" OPERATION="11"/> <!-- Permission.CONFIGURE -->
+ <rhq_permission ROLE_ID="1" OPERATION="14"/> <!-- Permission.MANAGE_EVENTS -->
+
+ <!-- give all-resources-role all permissions (resource perms is mainly just to show on view-role page) -->
+ <rhq_permission ROLE_ID="2" OPERATION="1"/> <!-- Permission.MANAGE_INVENTORY -->
+ <rhq_permission ROLE_ID="2" OPERATION="12"/> <!-- Permission.MANAGE_BUNDLE -->
+ <!-- resource permissions start here-->
+ <rhq_permission ROLE_ID="2" OPERATION="3"/> <!-- Permission.VIEW_RESOURCE -->
+ <rhq_permission ROLE_ID="2" OPERATION="4"/> <!-- Permission.MODIFY_RESOURCE -->
+ <rhq_permission ROLE_ID="2" OPERATION="5"/> <!-- Permission.DELETE_RESOURCE -->
+ <rhq_permission ROLE_ID="2" OPERATION="6"/> <!-- Permission.CREATE_CHILD_RESOURCES -->
+ <rhq_permission ROLE_ID="2" OPERATION="7"/> <!-- Permission.MANAGE_ALERTS -->
+ <rhq_permission ROLE_ID="2" OPERATION="8"/> <!-- Permission.MANAGE_MEASUREMENTS -->
+ <rhq_permission ROLE_ID="2" OPERATION="9"/> <!-- Permission.MANAGE_CONTENT -->
+ <rhq_permission ROLE_ID="2" OPERATION="10"/> <!-- Permission.CONTROL -->
+ <rhq_permission ROLE_ID="2" OPERATION="11"/> <!-- Permission.CONFIGURE -->
+ <rhq_permission ROLE_ID="2" OPERATION="14"/> <!-- Permission.MANAGE_EVENTS -->
+ <rhq_subject_role_map SUBJECT_ID="1" ROLE_ID="1"/>
+ <rhq_subject_role_map SUBJECT_ID="2" ROLE_ID="1"/>
+ <rhq_subject_role_ldap_map/>
+ <rhq_saved_search/>
+ <rhq_dashboard/>
+ <rhq_dashboard_portlet/>
+ <rhq_operation_def/>
+ <rhq_operation_history/>
+ <rhq_operation_schedule/>
+ <rhq_event_def/>
+ <rhq_event_source/>
+ <rhq_event/>
+ <rhq_alert_definition/>
+ <rhq_alert_dampen_event/>
+ <rhq_alert_condition/>
+ <rhq_alert/>
+ <rhq_alert_notif_log/>
+ <rhq_alert_condition_log/>
+ <rhq_alert_notification/>
+ <rhq_system_config ID="1" PROPERTY_KEY="SERVER_VERSION" PROPERTY_VALUE="4.1.0-SNAPSHOT"
+ DEFAULT_PROPERTY_VALUE="4.1.0-SNAPSHOT" FREAD_ONLY="TRUE"/>
+ <rhq_system_config ID="2" PROPERTY_KEY="DB_SCHEMA_VERSION" PROPERTY_VALUE="2.107"
+ DEFAULT_PROPERTY_VALUE="2.107" FREAD_ONLY="TRUE"/>
+ <rhq_system_config ID="3" PROPERTY_KEY="CAM_JAAS_PROVIDER" PROPERTY_VALUE="JDBC"
+ DEFAULT_PROPERTY_VALUE="JDBC" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="4" PROPERTY_KEY="CAM_BASE_URL" PROPERTY_VALUE="http://localhost:7080/"
+ DEFAULT_PROPERTY_VALUE="http://localhost:7080/" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="9" PROPERTY_KEY="CAM_HELP_USER" PROPERTY_VALUE="web"
+ DEFAULT_PROPERTY_VALUE="web" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="10" PROPERTY_KEY="CAM_HELP_PASSWORD" PROPERTY_VALUE="user"
+ DEFAULT_PROPERTY_VALUE="user" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="32" PROPERTY_KEY="CAM_DATA_MAINTENANCE"
+ PROPERTY_VALUE="3600000" DEFAULT_PROPERTY_VALUE="3600000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="34" PROPERTY_KEY="RT_DATA_PURGE" PROPERTY_VALUE="2678400000"
+ DEFAULT_PROPERTY_VALUE="2678400000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="35" PROPERTY_KEY="DATA_REINDEX_NIGHTLY" PROPERTY_VALUE="true"
+ DEFAULT_PROPERTY_VALUE="true" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="36" PROPERTY_KEY="ALERT_PURGE" PROPERTY_VALUE="2678400000"
+ DEFAULT_PROPERTY_VALUE="2678400000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="51" PROPERTY_KEY="EVENT_PURGE" PROPERTY_VALUE="1209600000"
+ DEFAULT_PROPERTY_VALUE="1209600000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="52" PROPERTY_KEY="AGENT_MAX_QUIET_TIME_ALLOWED" PROPERTY_VALUE="900000"
+ DEFAULT_PROPERTY_VALUE="900000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="53" PROPERTY_KEY="ENABLE_AGENT_AUTO_UPDATE" PROPERTY_VALUE="true"
+ DEFAULT_PROPERTY_VALUE="true" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="54" PROPERTY_KEY="TRAIT_PURGE" PROPERTY_VALUE="31536000000"
+ DEFAULT_PROPERTY_VALUE="31536000000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="55" PROPERTY_KEY="AVAILABILITY_PURGE" PROPERTY_VALUE="31536000000"
+ DEFAULT_PROPERTY_VALUE="31536000000" FREAD_ONLY="FALSE"/>
+ <rhq_system_config ID="56" PROPERTY_KEY="RESOURCE_GENERIC_PROPERTIES_UPGRADE" PROPERTY_VALUE="false"
+ DEFAULT_PROPERTY_VALUE="false" FREAD_ONLY="FALSE"/>
+ <rhq_plugin/>
+ <rhq_measurement_def/>
+ <rhq_measurement_sched/>
+ <rhq_measurement_bline/>
+ <rhq_measurement_data_num_1h/>
+ <rhq_measurement_data_num_6h/>
+ <rhq_measurement_data_num_1d/>
+ <rhq_measurement_data_trait/>
+ <rhq_calltime_data_key/>
+ <rhq_calltime_data_value/>
+ <rhq_availability/>
+ <rhq_resource_avail/>
+ <rhq_measurement_oob/>
+ <rhq_measurement_oob_tmp/>
+ <rhq_numbers i="0"/>
+ <rhq_numbers i="1"/>
+ <rhq_numbers i="2"/>
+ <rhq_numbers i="3"/>
+ <rhq_numbers i="4"/>
+ <rhq_numbers i="5"/>
+ <rhq_numbers i="6"/>
+ <rhq_numbers i="7"/>
+ <rhq_numbers i="8"/>
+ <rhq_numbers i="9"/>
+ <rhq_numbers i="10"/>
+ <rhq_numbers i="11"/>
+ <rhq_numbers i="12"/>
+ <rhq_numbers i="13"/>
+ <rhq_numbers i="14"/>
+ <rhq_numbers i="15"/>
+ <rhq_numbers i="16"/>
+ <rhq_numbers i="17"/>
+ <rhq_numbers i="18"/>
+ <rhq_numbers i="19"/>
+ <rhq_numbers i="20"/>
+ <rhq_numbers i="21"/>
+ <rhq_numbers i="22"/>
+ <rhq_numbers i="23"/>
+ <rhq_numbers i="24"/>
+ <rhq_numbers i="25"/>
+ <rhq_numbers i="26"/>
+ <rhq_numbers i="27"/>
+ <rhq_numbers i="28"/>
+ <rhq_numbers i="29"/>
+ <rhq_numbers i="30"/>
+ <rhq_numbers i="31"/>
+ <rhq_numbers i="32"/>
+ <rhq_numbers i="33"/>
+ <rhq_numbers i="34"/>
+ <rhq_numbers i="35"/>
+ <rhq_numbers i="36"/>
+ <rhq_numbers i="37"/>
+ <rhq_numbers i="38"/>
+ <rhq_numbers i="39"/>
+ <rhq_numbers i="40"/>
+ <rhq_numbers i="41"/>
+ <rhq_numbers i="42"/>
+ <rhq_numbers i="43"/>
+ <rhq_numbers i="44"/>
+ <rhq_numbers i="45"/>
+ <rhq_numbers i="46"/>
+ <rhq_numbers i="47"/>
+ <rhq_numbers i="48"/>
+ <rhq_numbers i="49"/>
+ <rhq_numbers i="50"/>
+ <rhq_numbers i="51"/>
+ <rhq_numbers i="52"/>
+ <rhq_numbers i="53"/>
+ <rhq_numbers i="54"/>
+ <rhq_numbers i="55"/>
+ <rhq_numbers i="56"/>
+ <rhq_numbers i="57"/>
+ <rhq_numbers i="58"/>
+ <rhq_numbers i="59"/>
+ <rhq_meas_data_num_r00/>
+ <rhq_meas_data_num_r01/>
+ <rhq_meas_data_num_r02/>
+ <rhq_meas_data_num_r03/>
+ <rhq_meas_data_num_r04/>
+ <rhq_meas_data_num_r05/>
+ <rhq_meas_data_num_r06/>
+ <rhq_meas_data_num_r07/>
+ <rhq_meas_data_num_r08/>
+ <rhq_meas_data_num_r09/>
+ <rhq_meas_data_num_r10/>
+ <rhq_meas_data_num_r11/>
+ <rhq_meas_data_num_r12/>
+ <rhq_meas_data_num_r13/>
+ <rhq_meas_data_num_r14/>
+ <rhq_architecture id="1" name="noarch"/>
+ <rhq_architecture id="2" name="i386"/>
+ <rhq_architecture id="3" name="i486"/>
+ <rhq_architecture id="4" name="i586"/>
+ <rhq_architecture id="5" name="i686"/>
+ <rhq_architecture id="6" name="alpha"/>
+ <rhq_architecture id="7" name="alphaev6"/>
+ <rhq_architecture id="8" name="ia64"/>
+ <rhq_architecture id="9" name="sparc"/>
+ <rhq_architecture id="10" name="sparcv9"/>
+ <rhq_architecture id="11" name="sparc64"/>
+ <rhq_architecture id="12" name="src"/>
+ <rhq_architecture id="13" name="s390"/>
+ <rhq_architecture id="14" name="athlon"/>
+ <rhq_architecture id="15" name="s390x"/>
+ <rhq_architecture id="16" name="ppc"/>
+ <rhq_architecture id="17" name="ppc64"/>
+ <rhq_architecture id="18" name="pSeries"/>
+ <rhq_architecture id="19" name="iSeries"/>
+ <rhq_architecture id="20" name="x86_64"/>
+ <rhq_architecture id="21" name="ppc64iseries"/>
+ <rhq_architecture id="22" name="ppc64pseries"/>
+ <rhq_architecture id="23" name="sparc-solaris"/>
+ <rhq_architecture id="24" name="sparc.sun4u-solaris"/>
+ <rhq_architecture id="25" name="tar"/>
+ <rhq_architecture id="26" name="ia32e"/>
+ <rhq_architecture id="27" name="amd64"/>
+ <rhq_architecture id="28" name="i386-solaris"/>
+ <rhq_architecture id="29" name="nosrc"/>
+ <rhq_architecture id="30" name="sparc-solaris-patch"/>
+ <rhq_architecture id="31" name="i386-solaris-patch"/>
+ <rhq_architecture id="32" name="sparc-solaris-patch-cluster"/>
+ <rhq_architecture id="33" name="i386-solaris-patch-cluster"/>
+ <rhq_architecture id="34" name="noarch-solaris"/>
+ <rhq_architecture id="35" name="noarch-solaris-patch"/>
+ <rhq_architecture id="36" name="noarch-solaris-patch-cluster"/>
+ <rhq_architecture id="37" name="solaris-patch"/>
+ <rhq_architecture id="38" name="solaris-patch-cluster"/>
+ <rhq_repo_group_type id="1" name="family"/>
+ <rhq_repo_group/>
+ <rhq_content_source_type/>
+ <rhq_content_source/>
+ <rhq_repo/>
+ <rhq_repo_relation_type id="1" name="parent"/>
+ <rhq_repo_relation_type id="2" name="clone"/>
+ <rhq_repo_relation/>
+ <rhq_package_type/>
+ <rhq_package/>
+ <rhq_package_bits/>
+ <rhq_package_version/>
+ <rhq_content_req/>
+ <rhq_installed_package/>
+ <rhq_installed_pkg_hist/>
+ <rhq_content_src_sync/>
+ <rhq_repo_sync/>
+ <rhq_package_inst_step/>
+ <rhq_repo_resource_map/>
+ <rhq_repo_content_src_map/>
+ <rhq_repo_repo_group_map/>
+ <rhq_repo_repo_relation_map/>
+ <rhq_repo_pkg_version_map/>
+ <rhq_pkg_ver_content_src_map/>
+ <rhq_pkg_prd_map/>
+ <rhq_distribution_type id="1" name="kickstart" description="Linux kickstart distribution"/>
+ <rhq_distribution_type id="2" name="jumpstart" description="solaris jumpstart distribution"/>
+ <rhq_distribution/>
+ <rhq_repo_distribution/>
+ <rhq_distribution_file/>
+ <rhq_advisory/>
+ <rhq_advisory_package/>
+ <rhq_cve/>
+ <rhq_advisory_cve/>
+ <rhq_advisory_buglist/>
+ <rhq_repo_advisory/>
+ <rhq_bundle_type/>
+ <rhq_bundle/>
+ <rhq_bundle_version/>
+ <rhq_bundle_version_repo/>
+ <rhq_bundle_file/>
+ <rhq_bundle_destination/>
+ <rhq_bundle_deployment/>
+ <rhq_bundle_res_deploy/>
+ <rhq_bundle_res_dep_hist/>
+ <rhq_tagging_bundle_map/>
+ <rhq_tagging_bundle_version_map/>
+ <rhq_tagging_bundle_deploy_map/>
+ <rhq_tagging_bundle_dest_map/>
+ <rhq_create_res_hist/>
+ <rhq_delete_res_hist/>
+ <jms_messages/>
+ <jms_transactions/>
+ <jms_users/>
+ <jms_roles/>
+ <jms_subscriptions/>
</dataset>
commit 448abed3493f91fab365bc3bc050e4dc45ffa848
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jun 14 10:44:44 2011 -0400
BZ 644328 - ant bundle handler tests need to ensure they set the abs dest dir to simulate what the PC would do
diff --git a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
index 18d672f..a772ef0 100644
--- a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
+++ b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
@@ -161,6 +161,7 @@ public class AntBundlePluginComponentTest {
request.setBundleFilesLocation(this.bundleFilesDir);
request.setResourceDeployment(new BundleResourceDeployment(deployment, null));
request.setBundleManagerProvider(new MockBundleManagerProvider());
+ request.setAbsoluteDestinationDirectory(this.destDir);
request.setRevert(true);
BundleDeployResult results = plugin.deployBundle(request);
@@ -276,6 +277,7 @@ public class AntBundlePluginComponentTest {
request.setBundleFilesLocation(this.bundleFilesDir);
request.setResourceDeployment(new BundleResourceDeployment(deployment, null));
request.setBundleManagerProvider(new MockBundleManagerProvider());
+ request.setAbsoluteDestinationDirectory(this.destDir);
BundleDeployResult results = plugin.deployBundle(request);
@@ -361,6 +363,7 @@ public class AntBundlePluginComponentTest {
request.setBundleFilesLocation(this.bundleFilesDir);
request.setResourceDeployment(new BundleResourceDeployment(deployment, null));
request.setBundleManagerProvider(new MockBundleManagerProvider());
+ request.setAbsoluteDestinationDirectory(this.destDir);
BundleDeployResult results = plugin.deployBundle(request);
@@ -444,6 +447,7 @@ public class AntBundlePluginComponentTest {
request.setBundleFilesLocation(this.bundleFilesDir);
request.setResourceDeployment(new BundleResourceDeployment(deployment, null));
request.setBundleManagerProvider(new MockBundleManagerProvider());
+ request.setAbsoluteDestinationDirectory(this.destDir);
BundleDeployResult results = plugin.deployBundle(request);
@@ -473,6 +477,7 @@ public class AntBundlePluginComponentTest {
BundlePurgeRequest purgeRequest = new BundlePurgeRequest();
purgeRequest.setLiveResourceDeployment(new BundleResourceDeployment(deployment, null));
purgeRequest.setBundleManagerProvider(new MockBundleManagerProvider());
+ purgeRequest.setAbsoluteDestinationDirectory(this.destDir);
BundlePurgeResult purgeResults = plugin.purgeBundle(purgeRequest);
assertResultsSuccess(purgeResults);
@@ -556,6 +561,7 @@ public class AntBundlePluginComponentTest {
request.setBundleFilesLocation(this.bundleFilesDir);
request.setResourceDeployment(new BundleResourceDeployment(deployment, null));
request.setBundleManagerProvider(new MockBundleManagerProvider());
+ request.setAbsoluteDestinationDirectory(this.destDir);
request.setCleanDeployment(clean);
BundleDeployResult results = plugin.deployBundle(request);
commit 3f0d99edb790a8877292c31453beac8b56de18d1
Merge: 7590cce 925b384
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jun 14 10:21:53 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
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;
}
commit 7590ccecf2bb79e6b82fd3e47f2b3125dac96201
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 13 17:57:13 2011 -0400
BZ 644328 - finish the unit tests - this tests the fourth kind of context - measurementTraits.
this shows that we can use a trait value as a mechanism to tell the bundle system where
to install a bundle.
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
index 913e951..9942cb3 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
@@ -53,6 +53,13 @@ import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinat
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDataRequest;
+import org.rhq.core.domain.measurement.MeasurementDataTrait;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
@@ -175,8 +182,6 @@ public class BundleManagerTest {
}
- // TODO
- @Test(enabled = false)
public void testNonPlatformBundleDeploy_Trait() throws Exception {
MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
@@ -418,10 +423,21 @@ public class BundleManagerTest {
// using the different contexts that are supported.
Configuration pluginConfiguration = new Configuration();
pluginConfiguration.put(new PropertySimple(BUNDLE_CONFIG_CONTEXT_VALUE_PC, BUNDLE_CONFIG_LOCATION_PC));
+ serverPC.setPluginConfiguration(pluginConfiguration);
+
Configuration resourceConfiguration = new Configuration();
resourceConfiguration.put(new PropertySimple(BUNDLE_CONFIG_CONTEXT_VALUE_RC, BUNDLE_CONFIG_LOCATION_RC));
- serverPC.setPluginConfiguration(pluginConfiguration);
serverRC.setResourceConfiguration(resourceConfiguration);
+
+ MeasurementDefinition definition = new MeasurementDefinition(serverTypeMT, BUNDLE_CONFIG_CONTEXT_VALUE_MT);
+ definition.setDataType(DataType.TRAIT);
+ definition.setId(123);
+ MeasurementSchedule schedule = new MeasurementSchedule(definition, serverMT);
+ schedule.setId(123123);
+ MeasurementScheduleRequest scheduleRequest = new MeasurementScheduleRequest(schedule);
+ Set<MeasurementScheduleRequest> schedules = new HashSet<MeasurementScheduleRequest>(1);
+ schedules.add(scheduleRequest);
+ serverContainerMT.setMeasurementSchedule(schedules);
}
@Override
@@ -443,7 +459,19 @@ public class BundleManagerTest {
}
private class MockMeasurementManager extends MeasurementManager {
-
+ @Override
+ public Set<MeasurementData> getRealTimeMeasurementValue(int resourceId, List<MeasurementDataRequest> requests) {
+ // anytime this method gets called, it means our tests are asking for the test trait value. It will
+ // always be the same value for all tests.
+ MeasurementDataRequest dataRequest = requests.iterator().next();
+ MeasurementScheduleRequest request = new MeasurementScheduleRequest(0, dataRequest.getName(), 0, true,
+ DataType.TRAIT);
+ MeasurementDataTrait data = new MeasurementDataTrait(request,
+ MockInventoryManager.BUNDLE_CONFIG_LOCATION_MT);
+ Set<MeasurementData> values = new HashSet<MeasurementData>();
+ values.add(data);
+ return values;
+ }
}
@SuppressWarnings("unchecked")
commit a46e697ceab00d25eea43c14bb09005725d0dda8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 13 17:37:07 2011 -0400
BZ 644328 - finish up the initial coding of the nonplatform bundle deployment
this also adds several unit tests that exercise 3 of the 4 kinds of "contexts" that can
be used to denote where to deploy things on the resource. you can specify
a fileSystem location (which is for backward compat - this is how the platform plugin
will specify it can be a bundle target), you can specify the name of a plugin configuration
property (whose value is the location of where the bundles go) and you can specify the name
of a resource configuration property. The fourth context, measurementTrait, means you
can have trait whose value is the directory location where the bundles are stored.
this is coded up but i do not have a unit test showing it working. That's coming up next.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index 23cd5e7..b0cd714 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -25,6 +25,7 @@ package org.rhq.core.pc.bundle;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -53,6 +54,10 @@ import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory.Status;
import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDataRequest;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.ContainerService;
@@ -61,6 +66,7 @@ import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.agent.AgentService;
import org.rhq.core.pc.inventory.InventoryManager;
import org.rhq.core.pc.inventory.ResourceContainer;
+import org.rhq.core.pc.measurement.MeasurementManager;
import org.rhq.core.pc.util.ComponentUtil;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
@@ -145,7 +151,7 @@ public class BundleManager extends AgentService implements BundleAgentService, B
final BundleDeployment bundleDeployment = resourceDeployment.getBundleDeployment();
// find the resource that will handle the bundle processing
- InventoryManager im = PluginContainer.getInstance().getInventoryManager();
+ InventoryManager im = getInventoryManager();
BundleType bundleType = bundleDeployment.getBundleVersion().getBundle().getBundleType();
ResourceType resourceType = bundleType.getResourceType();
Set<Resource> resources = im.getResourcesWithType(resourceType);
@@ -230,7 +236,7 @@ public class BundleManager extends AgentService implements BundleAgentService, B
final BundleDeployment bundleDeployment = resourceDeployment.getBundleDeployment();
// find the resource that will purge the bundle
- InventoryManager im = PluginContainer.getInstance().getInventoryManager();
+ InventoryManager im = getInventoryManager();
BundleType bundleType = bundleDeployment.getBundleVersion().getBundle().getBundleType();
ResourceType resourceType = bundleType.getResourceType();
Set<Resource> resources = im.getResourcesWithType(resourceType);
@@ -433,7 +439,7 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
// get the resource entity stored in our local inventory
- InventoryManager im = PluginContainer.getInstance().getInventoryManager();
+ InventoryManager im = getInventoryManager();
Resource resource = bundleResourceDeployment.getResource();
ResourceContainer container = im.getResourceContainer(resource);
resource = container.getResource();
@@ -489,8 +495,11 @@ public class BundleManager extends AgentService implements BundleAgentService, B
break;
}
case measurementTrait: {
- // TODO: find out where we squirrel away traits
- baseLocation = null;
+ baseLocation = getTraitValue(container, destBaseDirValueName);
+ if (baseLocation == null) {
+ throw new IllegalArgumentException("Cannot obtain trait [" + destBaseDirName + "] for resource ["
+ + resource.getName() + "]");
+ }
break;
}
default: {
@@ -502,6 +511,50 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
/**
+ * Given the name of a trait, this will find the value of that trait for the given resource.
+ *
+ * @param resource the resource whose trait value is to be obtained
+ * @param traitName the name of the trait whose value is to be obtained
+ *
+ * @return the value of the trait, or <code>null</code> if unknown
+ */
+ private String getTraitValue(ResourceContainer container, String traitName) {
+ Integer traitScheduleId = null;
+ Set<MeasurementScheduleRequest> schedules = container.getMeasurementSchedule();
+ for (MeasurementScheduleRequest schedule : schedules) {
+ if (schedule.getName().equals(traitName)) {
+ if (schedule.getDataType() != DataType.TRAIT) {
+ throw new IllegalArgumentException("Measurement named [" + traitName + "] for resource ["
+ + container.getResource().getName() + "] is not a trait, it is of type ["
+ + schedule.getDataType() + "]");
+ }
+ traitScheduleId = Integer.valueOf(schedule.getScheduleId());
+ }
+ }
+ if (traitScheduleId == null) {
+ throw new IllegalArgumentException("There is no trait [" + traitName + "] for resource ["
+ + container.getResource().getName() + "]");
+ }
+
+ MeasurementManager mm = getMeasurementManager();
+ String traitValue = mm.getCachedTraitValue(traitScheduleId.intValue());
+ if (traitValue == null) {
+ // the trait hasn't been collected yet, so it isn't cached. We need to get its live value
+ List<MeasurementDataRequest> requests = new ArrayList<MeasurementDataRequest>();
+ requests.add(new MeasurementDataRequest(traitName, DataType.TRAIT));
+ Set<MeasurementData> dataset = mm.getRealTimeMeasurementValue(container.getResource().getId(), requests);
+ if (dataset != null && dataset.size() == 1) {
+ Object value = dataset.iterator().next().getValue();
+ if (value != null) {
+ traitValue = value.toString();
+ }
+ }
+ }
+
+ return traitValue;
+ }
+
+ /**
* If this manager can talk to a server-side {@link BundleServerService}, a proxy to that service is returned.
*
* @return the server-side proxy; <code>null</code> if this manager doesn't have a server to talk to
@@ -527,7 +580,27 @@ public class BundleManager extends AgentService implements BundleAgentService, B
*
* @throws PluginContainerException on error
*/
- private BundleFacet getBundleFacet(int resourceId, long timeout) throws PluginContainerException {
+ protected BundleFacet getBundleFacet(int resourceId, long timeout) throws PluginContainerException {
return ComponentUtil.getComponent(resourceId, BundleFacet.class, FacetLockType.READ, timeout, false, true);
}
+
+ /**
+ * Returns the manager that can provide data on the inventory. This is a separate protected method
+ * so we can extend our manger class to have a mock manager for testing.
+ *
+ * @return the inventory manager
+ */
+ protected InventoryManager getInventoryManager() {
+ return PluginContainer.getInstance().getInventoryManager();
+ }
+
+ /**
+ * Returns the manager that can provide data on the measurements/metrics. This is a separate protected method
+ * so we can extend our manger class to have a mock manager for testing.
+ *
+ * @return the inventory manager
+ */
+ protected MeasurementManager getMeasurementManager() {
+ return PluginContainer.getInstance().getMeasurementManager();
+ }
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java
index 2cf62d1..88bc4e6 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java
@@ -44,7 +44,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.agent.measurement.MeasurementAgentService;
-import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataRequest;
@@ -239,6 +238,21 @@ public class MeasurementManager extends AgentService implements MeasurementAgent
}
}
+ /**
+ * If you want to get a cached value of a trait, pass in its schedule ID.
+ * This is useful if you don't care to obtain the latest-n-greated value of the trait,
+ * and you want to avoid making a live call to the managed resource to obtain its value.
+ * Note that if the trait is not yet cached, this will return null, and the caller will
+ * be forced to make a live call to obtain the trait value, but at least this can help
+ * avoid unnecessarily calling the live resource.
+ *
+ * @param scheduleId the schedule for the trait for a specific resource
+ * @return the trait's cached value, <code>null</code> if not available
+ */
+ public String getCachedTraitValue(int scheduleId) {
+ return traitCache.get(scheduleId);
+ }
+
public void perMinuteItizeData(MeasurementReport report) {
Iterator<MeasurementDataNumeric> iter = report.getNumericData().iterator();
while (iter.hasNext()) {
@@ -428,8 +442,8 @@ public class MeasurementManager extends AgentService implements MeasurementAgent
MeasurementReport report = new MeasurementReport();
Set<MeasurementScheduleRequest> allMeasurements = new HashSet<MeasurementScheduleRequest>();
for (MeasurementDataRequest dataRequest : requests) {
- allMeasurements.add(new MeasurementScheduleRequest(1, dataRequest.getName(), 0, true,
- dataRequest.getType()));
+ allMeasurements
+ .add(new MeasurementScheduleRequest(1, dataRequest.getName(), 0, true, dataRequest.getType()));
}
try {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
new file mode 100644
index 0000000..913e951
--- /dev/null
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/bundle/BundleManagerTest.java
@@ -0,0 +1,455 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.pc.bundle;
+
+import java.io.File;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.clientapi.agent.PluginContainerException;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleRequest;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
+import org.rhq.core.clientapi.server.bundle.BundleServerService;
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
+import org.rhq.core.domain.bundle.BundleDestination;
+import org.rhq.core.domain.bundle.BundleResourceDeployment;
+import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory.Context;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.ServerServices;
+import org.rhq.core.pc.inventory.InventoryManager;
+import org.rhq.core.pc.inventory.ResourceContainer;
+import org.rhq.core.pc.measurement.MeasurementManager;
+import org.rhq.core.pluginapi.bundle.BundleDeployRequest;
+import org.rhq.core.pluginapi.bundle.BundleDeployResult;
+import org.rhq.core.pluginapi.bundle.BundleFacet;
+import org.rhq.core.pluginapi.bundle.BundlePurgeRequest;
+import org.rhq.core.pluginapi.bundle.BundlePurgeResult;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+
+@Test
+public class BundleManagerTest {
+ private MockBundleManager mockBundleManager;
+ private PluginContainerConfiguration pcConfig;
+
+ @BeforeMethod
+ public void beforeMethod() {
+ ServerServices serverServices = new ServerServices();
+ serverServices.setBundleServerService(new MockBundleServerService());
+
+ pcConfig = new PluginContainerConfiguration();
+ pcConfig.setServerServices(serverServices);
+
+ mockBundleManager = new MockBundleManager();
+ mockBundleManager.setConfiguration(pcConfig);
+ mockBundleManager.initialize();
+ }
+
+ @AfterMethod
+ public void afterMethod() {
+ mockBundleManager.shutdown();
+ pcConfig = null;
+ }
+
+ public void testNonPlatformBundleDeploy_FileSystem_AbsolutePath() throws Exception {
+ MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
+
+ BundleType bundleType = new BundleType("bundleTypeName", im.bundleHandlerType);
+ Bundle bundle = new Bundle("bundleName", bundleType, null, null);
+ BundleVersion bundleVersion = new BundleVersion("bundleVersionName", "1.0", bundle, "");
+ BundleDestination destination = new BundleDestination(bundle, "destName", null,
+ MockInventoryManager.BUNDLE_CONFIG_NAME_FS, "/tmp/dest"); // ABSOLUTE PATH
+ BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, destination, "deploymentName");
+ BundleResourceDeployment resourceDeployment = new BundleResourceDeployment(bundleDeployment, im.serverFS);
+ BundleScheduleRequest request = new BundleScheduleRequest(resourceDeployment);
+
+ // No matter what the CONTEXT_VALUE_FS is (i.e. the default context value in the plugin descriptor),
+ // if the user specifies an absolute path for the destination, that will be used explicitly. So here in this test,
+ // the destination was specified with a destDir that had an absolute path of /tmp/dest and it will be used as-is
+ mockBundleManager.absolutePathToAssert = "/tmp/dest";
+ BundleScheduleResponse response = mockBundleManager.schedule(request);
+ assertSuccess(response);
+ assertBundleDeploymentStatus(BundleDeploymentStatus.SUCCESS);
+
+ }
+
+ public void testNonPlatformBundleDeploy_FileSystem_RelativePath() throws Exception {
+ MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
+
+ BundleType bundleType = new BundleType("bundleTypeName", im.bundleHandlerType);
+ Bundle bundle = new Bundle("bundleName", bundleType, null, null);
+ BundleVersion bundleVersion = new BundleVersion("bundleVersionName", "1.0", bundle, "");
+ BundleDestination destination = new BundleDestination(bundle, "destName", null,
+ MockInventoryManager.BUNDLE_CONFIG_NAME_FS, "relative/path"); // RELATIVE PATH
+ BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, destination, "deploymentName");
+ BundleResourceDeployment resourceDeployment = new BundleResourceDeployment(bundleDeployment, im.serverFS);
+ BundleScheduleRequest request = new BundleScheduleRequest(resourceDeployment);
+
+ // in the real world, the context value for fileSystem contexts will probably always be "/" but
+ // to test that we are really using this context value, our tests set it to something other than "/".
+ // That's why we prepend CONTEXT_VALUE_FS to the front of the destination's destDir
+ // note that we expect that relative path converted to absolute
+ mockBundleManager.absolutePathToAssert = MockInventoryManager.BUNDLE_CONFIG_CONTEXT_VALUE_FS + "/relative/path";
+ BundleScheduleResponse response = mockBundleManager.schedule(request);
+ assertSuccess(response);
+ assertBundleDeploymentStatus(BundleDeploymentStatus.SUCCESS);
+
+ }
+
+ public void testNonPlatformBundleDeploy_PluginConfig() throws Exception {
+ MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
+
+ BundleType bundleType = new BundleType("bundleTypeName", im.bundleHandlerType);
+ Bundle bundle = new Bundle("bundleName", bundleType, null, null);
+ BundleVersion bundleVersion = new BundleVersion("bundleVersionName", "1.0", bundle, "");
+ BundleDestination destination = new BundleDestination(bundle, "destName", null,
+ MockInventoryManager.BUNDLE_CONFIG_NAME_PC, "relative/path/pc");
+ BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, destination, "deploymentName");
+ BundleResourceDeployment resourceDeployment = new BundleResourceDeployment(bundleDeployment, im.serverPC);
+ BundleScheduleRequest request = new BundleScheduleRequest(resourceDeployment);
+
+ mockBundleManager.absolutePathToAssert = MockInventoryManager.BUNDLE_CONFIG_LOCATION_PC + "/relative/path/pc";
+ BundleScheduleResponse response = mockBundleManager.schedule(request);
+ assertSuccess(response);
+ assertBundleDeploymentStatus(BundleDeploymentStatus.SUCCESS);
+
+ }
+
+ public void testNonPlatformBundleDeploy_ResourceConfig() throws Exception {
+ MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
+
+ BundleType bundleType = new BundleType("bundleTypeName", im.bundleHandlerType);
+ Bundle bundle = new Bundle("bundleName", bundleType, null, null);
+ BundleVersion bundleVersion = new BundleVersion("bundleVersionName", "1.0", bundle, "");
+ BundleDestination destination = new BundleDestination(bundle, "destName", null,
+ MockInventoryManager.BUNDLE_CONFIG_NAME_RC, "relative/path/rc");
+ BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, destination, "deploymentName");
+ BundleResourceDeployment resourceDeployment = new BundleResourceDeployment(bundleDeployment, im.serverRC);
+ BundleScheduleRequest request = new BundleScheduleRequest(resourceDeployment);
+
+ mockBundleManager.absolutePathToAssert = MockInventoryManager.BUNDLE_CONFIG_LOCATION_RC + "/relative/path/rc";
+ BundleScheduleResponse response = mockBundleManager.schedule(request);
+ assertSuccess(response);
+ assertBundleDeploymentStatus(BundleDeploymentStatus.SUCCESS);
+
+ }
+
+ // TODO
+ @Test(enabled = false)
+ public void testNonPlatformBundleDeploy_Trait() throws Exception {
+ MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
+
+ BundleType bundleType = new BundleType("bundleTypeName", im.bundleHandlerType);
+ Bundle bundle = new Bundle("bundleName", bundleType, null, null);
+ BundleVersion bundleVersion = new BundleVersion("bundleVersionName", "1.0", bundle, "");
+ BundleDestination destination = new BundleDestination(bundle, "destName", null,
+ MockInventoryManager.BUNDLE_CONFIG_NAME_MT, "relative/path/mt");
+ BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, destination, "deploymentName");
+ BundleResourceDeployment resourceDeployment = new BundleResourceDeployment(bundleDeployment, im.serverMT);
+ BundleScheduleRequest request = new BundleScheduleRequest(resourceDeployment);
+
+ mockBundleManager.absolutePathToAssert = MockInventoryManager.BUNDLE_CONFIG_LOCATION_MT + "/relative/path/mt";
+ BundleScheduleResponse response = mockBundleManager.schedule(request);
+ assertSuccess(response);
+ assertBundleDeploymentStatus(BundleDeploymentStatus.SUCCESS);
+
+ }
+
+ public void testNonPlatformBundleDeploy_FileSystem_Failure() throws Exception {
+ MockInventoryManager im = (MockInventoryManager) mockBundleManager.getInventoryManager();
+
+ BundleType bundleType = new BundleType("bundleTypeName", im.bundleHandlerType);
+ Bundle bundle = new Bundle("bundleName", bundleType, null, null);
+ BundleVersion bundleVersion = new BundleVersion("bundleVersionName", "1.0", bundle, "");
+ BundleDestination destination = new BundleDestination(bundle, "destName", null,
+ MockInventoryManager.BUNDLE_CONFIG_NAME_FS, "/tmp/dest"); // ABSOLUTE PATH
+ BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, destination, "deploymentName");
+ BundleResourceDeployment resourceDeployment = new BundleResourceDeployment(bundleDeployment, im.serverFS);
+ BundleScheduleRequest request = new BundleScheduleRequest(resourceDeployment);
+
+ mockBundleManager.absolutePathToAssert = "/should_fail_to_match"; // this will not match the /tmp/dest that we set the destination to
+ BundleScheduleResponse response = mockBundleManager.schedule(request);
+ assertSuccess(response);
+ assertBundleDeploymentStatus(BundleDeploymentStatus.FAILURE);
+
+ }
+
+ private void assertSuccess(BundleScheduleResponse response) {
+ assert response.isSuccess() : response;
+ }
+
+ private void assertBundleDeploymentStatus(BundleDeploymentStatus statusToAssert) throws Exception {
+ MockBundleServerService bundleService;
+ bundleService = (MockBundleServerService) pcConfig.getServerServices().getBundleServerService();
+ assert bundleService.lastStatusLatch.await(30, TimeUnit.SECONDS) : "Test did not complete in a timely manner - is it hung?";
+ assert bundleService.lastStatus == statusToAssert : "Deployment status [" + bundleService.lastStatus
+ + "] did not match what was expected [" + statusToAssert + "]";
+ }
+
+ private class MockBundleManager extends BundleManager {
+ public String absolutePathToAssert;
+
+ @Override
+ protected InventoryManager getInventoryManager() {
+ return new MockInventoryManager();
+ }
+
+ @Override
+ protected MeasurementManager getMeasurementManager() {
+ return new MockMeasurementManager();
+ }
+
+ @Override
+ protected BundleFacet getBundleFacet(int resourceId, long timeout) throws PluginContainerException {
+ return new MockBundleFacet(this);
+ }
+ }
+
+ private class MockBundleFacet implements BundleFacet {
+ MockBundleManager manager;
+
+ public MockBundleFacet(MockBundleManager mbm) {
+ manager = mbm;
+ }
+
+ @Override
+ public BundleDeployResult deployBundle(BundleDeployRequest request) {
+ BundleDeployResult result = new BundleDeployResult();
+ // tests should be setting MockBundleManager.absolutePathToAssert to the path that should be expected
+ if (!request.getAbsoluteDestinationDirectory().equals(new File(manager.absolutePathToAssert))) {
+ result.setErrorMessage("absolute path [" + request.getAbsoluteDestinationDirectory()
+ + "] did not match the expected path [" + manager.absolutePathToAssert + "]");
+ System.out.println(result.getErrorMessage());
+ }
+ return result;
+ }
+
+ @Override
+ public BundlePurgeResult purgeBundle(BundlePurgeRequest request) {
+ BundlePurgeResult result = new BundlePurgeResult();
+ return result;
+ }
+ }
+
+ private class MockBundleServerService implements BundleServerService {
+ public BundleDeploymentStatus lastStatus = null;
+ public CountDownLatch lastStatusLatch = new CountDownLatch(1);
+
+ @Override
+ public void addDeploymentHistory(int bundleDeploymentId, BundleResourceDeploymentHistory history) {
+ return;
+ }
+
+ @Override
+ public long downloadPackageBits(PackageVersion packageVersion, OutputStream outputStream) {
+ return 0;
+ }
+
+ @Override
+ public List<PackageVersion> getAllBundleVersionPackageVersions(int bundleVersionId) {
+ return new ArrayList<PackageVersion>(0);
+ }
+
+ @Override
+ public void setBundleDeploymentStatus(int bundleDeploymentId, BundleDeploymentStatus status) {
+ // only track success or failure status
+ if ((status == BundleDeploymentStatus.SUCCESS) || (status == BundleDeploymentStatus.FAILURE)) {
+ lastStatus = status;
+ lastStatusLatch.countDown();
+ }
+ return;
+ }
+ }
+
+ private class MockInventoryManager extends InventoryManager {
+ private static final String BUNDLE_CONFIG_NAME_FS = "fsBaseDirLocation";
+ private static final String BUNDLE_CONFIG_CONTEXT_VALUE_FS = "/blah";
+
+ private static final String BUNDLE_CONFIG_NAME_PC = "pcBaseDirLocation";
+ private static final String BUNDLE_CONFIG_CONTEXT_VALUE_PC = "pcPropBundle";
+ private static final String BUNDLE_CONFIG_LOCATION_PC = "/pluginconfig/base/dir";
+
+ private static final String BUNDLE_CONFIG_NAME_RC = "rcBaseDirLocation";
+ private static final String BUNDLE_CONFIG_CONTEXT_VALUE_RC = "rcPropBundle";
+ private static final String BUNDLE_CONFIG_LOCATION_RC = "/resourceconfig/base/dir";
+
+ private static final String BUNDLE_CONFIG_NAME_MT = "mtBaseDirLocation";
+ private static final String BUNDLE_CONFIG_CONTEXT_VALUE_MT = "traitBundle";
+ private static final String BUNDLE_CONFIG_LOCATION_MT = "/trait/base/dir";
+
+ // mocking the following:
+ // - one platform type and a platform resource to be used as the root parent
+ // - one bundle handler type and resource to mimic our bundle handler component
+ // - one server resource for each kind of "destination base directory context"
+ // ** FS = fileSystem (the bundle will be deployed directly to the root file system)
+ // ** PC = pluginConfiguration (bundle deployed to a directory specified in a plugin config property)
+ // ** RC = resourceConfiguration (bundle deployed to a directory specified in a resource config property)
+ // ** MT = measurementTrait (bundle deployed to a directory specified in a measurement trait value)
+ public ResourceType platformType;
+ public ResourceType bundleHandlerType;
+ public ResourceType serverTypeFS;
+ public ResourceType serverTypePC;
+ public ResourceType serverTypeRC;
+ public ResourceType serverTypeMT;
+ public Resource platform;
+ public Resource bundleHandler;
+ public Resource serverFS;
+ public Resource serverPC;
+ public Resource serverRC;
+ public Resource serverMT;
+ public HashMap<ResourceType, Resource> typeResourceMap = new HashMap<ResourceType, Resource>();
+ public HashMap<Integer, ResourceContainer> idResourceContainerMap = new HashMap<Integer, ResourceContainer>();
+
+ public MockInventoryManager() {
+ platformType = new ResourceType("platformResourceTypeName", "pluginName", ResourceCategory.PLATFORM, null);
+ bundleHandlerType = new ResourceType("bhRTypeName", "pluginName", ResourceCategory.SERVER, platformType);
+ serverTypeFS = new ResourceType("typeName-fileSystem", "pluginName", ResourceCategory.SERVER, platformType);
+ serverTypePC = new ResourceType("typeName-plugConfig", "pluginName", ResourceCategory.SERVER, platformType);
+ serverTypeRC = new ResourceType("typeName-reSconfig", "pluginName", ResourceCategory.SERVER, platformType);
+ serverTypeMT = new ResourceType("typeName-trait", "pluginName", ResourceCategory.SERVER, platformType);
+
+ int id = 1;
+ platform = new Resource("platformKey", "platformName", platformType);
+ platform.setId(id++);
+ bundleHandler = new Resource("bhKey", "bhName", bundleHandlerType);
+ bundleHandler.setId(id++);
+ bundleHandler.setParentResource(platform);
+ serverFS = new Resource("serverKey-fileSystem", "serverName-fileSystem", serverTypeFS);
+ serverFS.setId(id++);
+ serverFS.setParentResource(platform);
+ serverPC = new Resource("serverKey-plugConfig", "serverName-plugConfig", serverTypePC);
+ serverPC.setId(id++);
+ serverPC.setParentResource(platform);
+ serverRC = new Resource("serverKey-resConfig", "serverName-resConfig", serverTypeRC);
+ serverRC.setId(id++);
+ serverRC.setParentResource(platform);
+ serverMT = new Resource("serverKey-traitConfig", "serverName-traitConfig", serverTypeMT);
+ serverMT.setId(id++);
+ serverMT.setParentResource(platform);
+
+ typeResourceMap.put(platformType, platform);
+ typeResourceMap.put(bundleHandlerType, bundleHandler);
+ typeResourceMap.put(serverTypeFS, serverFS);
+ typeResourceMap.put(serverTypePC, serverPC);
+ typeResourceMap.put(serverTypeRC, serverRC);
+ typeResourceMap.put(serverTypeMT, serverMT);
+
+ ResourceContainer platformContainer = new ResourceContainer(platform, null);
+ ResourceContainer bundleHandlerContainer = new ResourceContainer(bundleHandler, null);
+ ResourceContainer serverContainerFS = new ResourceContainer(serverFS, null);
+ ResourceContainer serverContainerPC = new ResourceContainer(serverPC, null);
+ ResourceContainer serverContainerRC = new ResourceContainer(serverRC, null);
+ ResourceContainer serverContainerMT = new ResourceContainer(serverMT, null);
+ idResourceContainerMap.put(platform.getId(), platformContainer);
+ idResourceContainerMap.put(bundleHandler.getId(), bundleHandlerContainer);
+ idResourceContainerMap.put(serverFS.getId(), serverContainerFS);
+ idResourceContainerMap.put(serverPC.getId(), serverContainerPC);
+ idResourceContainerMap.put(serverRC.getId(), serverContainerRC);
+ idResourceContainerMap.put(serverMT.getId(), serverContainerMT);
+
+ bundleHandlerContainer.setResourceContext(new MockResourceContext(bundleHandler));
+
+ // each different resource type that supports bundle deployments needs to define its
+ // bundle configuration to denote where the base directory location is found.
+ // Today we support four ways: via plugin config property, resource config property,
+ // measurement trait value, or strictly on the root file system (using no resource specific value)
+ ResourceTypeBundleConfiguration rtbc = new ResourceTypeBundleConfiguration(new Configuration());
+ rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_FS, Context.fileSystem.name(),
+ BUNDLE_CONFIG_CONTEXT_VALUE_FS);
+ serverTypeFS.setResourceTypeBundleConfiguration(rtbc);
+
+ rtbc = new ResourceTypeBundleConfiguration(new Configuration());
+ rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_PC, Context.pluginConfiguration.name(),
+ BUNDLE_CONFIG_CONTEXT_VALUE_PC);
+ serverTypePC.setResourceTypeBundleConfiguration(rtbc);
+
+ rtbc = new ResourceTypeBundleConfiguration(new Configuration());
+ rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_RC, Context.resourceConfiguration.name(),
+ BUNDLE_CONFIG_CONTEXT_VALUE_RC);
+ serverTypeRC.setResourceTypeBundleConfiguration(rtbc);
+
+ rtbc = new ResourceTypeBundleConfiguration(new Configuration());
+ rtbc.addBundleDestinationBaseDirectory(BUNDLE_CONFIG_NAME_MT, Context.measurementTrait.name(),
+ BUNDLE_CONFIG_CONTEXT_VALUE_MT);
+ serverTypeMT.setResourceTypeBundleConfiguration(rtbc);
+
+ // each different resource needs to specify where exactly it wants the bundles deployed
+ // using the different contexts that are supported.
+ Configuration pluginConfiguration = new Configuration();
+ pluginConfiguration.put(new PropertySimple(BUNDLE_CONFIG_CONTEXT_VALUE_PC, BUNDLE_CONFIG_LOCATION_PC));
+ Configuration resourceConfiguration = new Configuration();
+ resourceConfiguration.put(new PropertySimple(BUNDLE_CONFIG_CONTEXT_VALUE_RC, BUNDLE_CONFIG_LOCATION_RC));
+ serverPC.setPluginConfiguration(pluginConfiguration);
+ serverRC.setResourceConfiguration(resourceConfiguration);
+ }
+
+ @Override
+ public Set<Resource> getResourcesWithType(ResourceType type) {
+ HashSet<Resource> set = new HashSet<Resource>(1);
+ set.add(typeResourceMap.get(type));
+ return set;
+ }
+
+ @Override
+ public ResourceContainer getResourceContainer(Integer resourceId) {
+ return idResourceContainerMap.get(resourceId);
+ }
+
+ @Override
+ public ResourceContainer getResourceContainer(Resource resource) {
+ return idResourceContainerMap.get(resource.getId());
+ }
+ }
+
+ private class MockMeasurementManager extends MeasurementManager {
+
+ }
+
+ @SuppressWarnings("unchecked")
+ private class MockResourceContext extends ResourceContext {
+ public MockResourceContext(Resource resource) {
+ super(resource, null, null, null, null, null, null, null, null, null, null, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index cffcadd..fa55ec1 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -85,7 +85,7 @@ import org.rhq.core.util.stream.StreamUtil;
import org.rhq.core.util.updater.DeploymentProperties;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
-import org.rhq.enterprise.server.resource.metadata.test.UpdateSubsytemTestBase;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TestAgentClient;
import org.rhq.enterprise.server.test.TestServerCommunicationsService;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -96,7 +96,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
@SuppressWarnings( { "unused" })
@Test
-public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
+public class BundleManagerBeanTest extends AbstractEJB3Test {
private static final boolean TESTS_ENABLED = true;
@@ -115,12 +115,10 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private Subject overlord;
TestServerCommunicationsService agentServiceContainer;
- @Override
@BeforeClass
public void beforeClass() {
- super.beforeClass();
agentServiceContainer = prepareForTestAgents();
- agentServiceContainer.bundleService = new TestAgentClient(null, new TestServerCommunicationsService());
+ agentServiceContainer.bundleService = new TestAgentClient(null, agentServiceContainer);
}
@AfterClass
@@ -863,7 +861,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
}
@Test(enabled = TESTS_ENABLED)
- public void testfindBundlesByCriteria() throws Exception {
+ public void testFindBundlesByCriteria() throws Exception {
Bundle b1 = createBundle("one");
Bundle b2 = createBundle("two");
BundleVersion bv1 = createBundleVersion(b1.getName(), "1.0", b1);
@@ -921,7 +919,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
}
@Test(enabled = TESTS_ENABLED)
- public void testfindBundleVersionsByCriteria() throws Exception {
+ public void testFindBundleVersionsByCriteria() throws Exception {
Bundle b1 = createBundle("one");
BundleVersion bv1 = createBundleVersion(b1.getName(), "1.0", b1);
BundleVersion bv2 = createBundleVersion(b1.getName(), "2.0", b1);
commit 925b384bee787d14701ef1bf1565eccb1a12c435
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Mon Jun 13 13:25:52 2011 -0500
One more attempt to fix FK violations for test runs.
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
index b958a1c..70f7073 100644
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
@@ -1,4 +1,5 @@
<dataset>
+ <rhq_content_source/>
<rhq_repo_content_src_map/>
<rhq_repo/>
<rhq_config_def/>
commit dcfdf741499c67d55ad5e2d4b319f5a8cbd9fe56
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Mon Jun 13 12:52:06 2011 -0500
One more attempt to fix FK violations for dbupgrade test runs.
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
index d419fe5..b958a1c 100644
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
@@ -1,4 +1,6 @@
<dataset>
+ <rhq_repo_content_src_map/>
+ <rhq_repo/>
<rhq_config_def/>
<rhq_config_prop_def/>
<rhq_conf_prop_def_enum/>
@@ -28,8 +30,6 @@
<rhq_availability/>
<rhq_measurement_sched/>
<rhq_package/>
- <rhq_repo_content_src_map/>
- <rhq_repo/>
<rhq_bundle/>
<rhq_plugin/>
</dataset>
commit 8445b4e6fe77a7c866dec1306254410d0dc032a5
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Fri Jun 10 16:56:10 2011 -0500
One more attempt to fix FK violations for test runs. This method is very fragile...
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
index 1777489..d419fe5 100644
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
@@ -14,10 +14,11 @@
<rhq_config/>
<rhq_config_property/>
<rhq_config_template/>
+ <rhq_resource_group_res_exp_map/>
<rhq_resource_group_res_imp_map/>
- <rhq_resource/>
<rhq_resource_subcat/>
<rhq_resource_group/>
+ <rhq_resource/>
<rhq_prd_ver/>
<rhq_alert_definition/>
<rhq_alert_condition/>
commit 5118f46cf1b5734d294f31faf6a89d0a73c5924f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jun 10 17:25:42 2011 -0400
BZ 644328 - agent code to determine where to deploy the bundle under a resource
the only thing left is a TODO to figure out how to get a measurement trait value
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundleDeployRequest.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundleDeployRequest.java
index d70716e..8130ee3 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundleDeployRequest.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundleDeployRequest.java
@@ -23,6 +23,7 @@ import java.io.File;
import java.io.Serializable;
import java.util.Map;
+import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.content.PackageVersion;
@@ -40,11 +41,26 @@ public class BundleDeployRequest implements Serializable {
private Map<PackageVersion, File> packageVersionFiles;
private boolean isCleanDeployment = false;
private boolean isRevert = false;
+ private File absDestDir;
public BundleDeployRequest() {
}
/**
+ * Returns the full, absolute directory as found on the local machine's file system
+ * where the bundle should be deployed. This is the bundle destination's
+ * {@link BundleDestination#getDeployDir() relative destination directory} under the
+ * {@link BundleDestination#getDestinationBaseDirectoryName() destination base directory}.
+ */
+ public File getAbsoluteDestinationDirectory() {
+ return this.absDestDir;
+ }
+
+ public void setAbsoluteDestinationDirectory(File absoluteDestDir) {
+ this.absDestDir = absoluteDestDir;
+ }
+
+ /**
* This returns the location where the plugin container has downloaded the bundle files.
*
* @return the location where the bundle files have been downloaded
@@ -118,6 +134,7 @@ public class BundleDeployRequest implements Serializable {
public String toString() {
StringBuilder str = new StringBuilder(this.getClass() + ": ");
str.append("deployment=[").append(resourceDeployment.toString()).append("], ");
+ str.append("full-deploy-directory=[").append(absDestDir.toString()).append("], ");
str.append("clean=[").append(isCleanDeployment).append("], ");
str.append("revert=[").append(isRevert).append("]");
return str.toString();
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundlePurgeRequest.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundlePurgeRequest.java
index 6f41339..8e9456d 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundlePurgeRequest.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/bundle/BundlePurgeRequest.java
@@ -19,8 +19,10 @@
package org.rhq.core.pluginapi.bundle;
+import java.io.File;
import java.io.Serializable;
+import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
/**
@@ -33,11 +35,26 @@ public class BundlePurgeRequest implements Serializable {
private BundleResourceDeployment resourceDeployment;
private BundleManagerProvider bundleManagerProvider;
+ private File absDestDir;
public BundlePurgeRequest() {
}
/**
+ * Returns the full, absolute directory as found on the local machine's file system
+ * where the bundle should be deployed. This is the bundle destination's
+ * {@link BundleDestination#getDeployDir() relative destination directory} under the
+ * {@link BundleDestination#getDestinationBaseDirectoryName() destination base directory}.
+ */
+ public File getAbsoluteDestinationDirectory() {
+ return this.absDestDir;
+ }
+
+ public void setAbsoluteDestinationDirectory(File absoluteDestDir) {
+ this.absDestDir = absoluteDestDir;
+ }
+
+ /**
* This is information about the last known live resource deployment - this is to be purged.
*
* @return information about the live resource deployment that is to be purged
@@ -62,6 +79,7 @@ public class BundlePurgeRequest implements Serializable {
public String toString() {
StringBuilder str = new StringBuilder(this.getClass() + ": ");
str.append("live-deployment-to-be-purge=[").append(resourceDeployment.toString()).append("], ");
+ str.append("full-deploy-directory=[").append(absDestDir.toString()).append("]");
return str.toString();
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index b945ff1..23cd5e7 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -44,11 +44,14 @@ import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.clientapi.server.bundle.BundleServerService;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentStatus;
+import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory.Status;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
@@ -177,6 +180,8 @@ public class BundleManager extends AgentService implements BundleAgentService, B
auditDeployment(resourceDeployment, AUDIT_DEPLOYMENT_STARTED, bundleDeployment.getName(),
deploymentMessage);
+ File absoluteDestDir = getAbsoluteDestinationDir(request.getBundleResourceDeployment());
+
BundleDeployRequest deployRequest = new BundleDeployRequest();
deployRequest.setBundleManagerProvider(BundleManager.this);
deployRequest.setResourceDeployment(resourceDeployment);
@@ -184,6 +189,7 @@ public class BundleManager extends AgentService implements BundleAgentService, B
deployRequest.setPackageVersionFiles(downloadedFiles);
deployRequest.setCleanDeployment(request.isCleanDeployment());
deployRequest.setRevert(request.isRevert());
+ deployRequest.setAbsoluteDestinationDirectory(absoluteDestDir);
// get the bundle facet object that will process the bundle and call it to start the deployment
int facetMethodTimeout = 4 * 60 * 60 * 1000; // 4 hours is given to the bundle plugin to do its thing
@@ -244,9 +250,12 @@ public class BundleManager extends AgentService implements BundleAgentService, B
+ resourceDeployment.getResource() + "]";
auditDeployment(resourceDeployment, AUDIT_PURGE_STARTED, bundleDeployment.getName(), deploymentMessage);
+ File absoluteDestDir = getAbsoluteDestinationDir(request.getLiveBundleResourceDeployment());
+
org.rhq.core.pluginapi.bundle.BundlePurgeRequest purgeRequest = new org.rhq.core.pluginapi.bundle.BundlePurgeRequest();
purgeRequest.setBundleManagerProvider(this);
purgeRequest.setLiveResourceDeployment(resourceDeployment);
+ purgeRequest.setAbsoluteDestinationDirectory(absoluteDestDir);
// get the bundle facet object that will process the bundle and call it to start the purge
int facetMethodTimeout = 30 * 60 * 1000; // 30 minutes should be enough time for the bundle plugin to purge everything
@@ -406,6 +415,93 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
/**
+ * Given a deployment, this examines the destination and the resource to determine where exactly
+ * the bundle distribution should be written.
+ *
+ * @param bundleResourceDeployment describes where the bundle should be or is deployed
+ *
+ * @return absolute directory location where the bundle should be deployed
+ */
+ private File getAbsoluteDestinationDir(BundleResourceDeployment bundleResourceDeployment) {
+ BundleDestination dest = bundleResourceDeployment.getBundleDeployment().getDestination();
+ String destBaseDirName = dest.getDestinationBaseDirectoryName();
+ String relativeDeployDir = dest.getDeployDir();
+
+ // paranoia, if no deploy dir is given, as assume it will be directly under the base location
+ if (relativeDeployDir == null || relativeDeployDir.trim().length() == 0) {
+ relativeDeployDir = File.separator;
+ }
+
+ // get the resource entity stored in our local inventory
+ InventoryManager im = PluginContainer.getInstance().getInventoryManager();
+ Resource resource = bundleResourceDeployment.getResource();
+ ResourceContainer container = im.getResourceContainer(resource);
+ resource = container.getResource();
+
+ // find out the type of base location that is specified by the bundle destination
+ BundleDestinationBaseDirectory bundleDestBaseDir = null;
+ ResourceTypeBundleConfiguration rtbc = resource.getResourceType().getResourceTypeBundleConfiguration();
+ if (rtbc == null) {
+ throw new IllegalArgumentException("The resource type doesn't support bundle deployments: " + resource);
+ }
+ for (BundleDestinationBaseDirectory bdbd : rtbc.getBundleDestinationBaseDirectories()) {
+ if (bdbd.getName().equals(destBaseDirName)) {
+ bundleDestBaseDir = bdbd;
+ break;
+ }
+ }
+ if (bundleDestBaseDir == null) {
+ throw new IllegalArgumentException(
+ "The resource type doesn't support bundle destination base location named [" + destBaseDirName + "]");
+ }
+
+ // based on the type of destination base location, determine the root base directory
+ String destBaseDirValueName = bundleDestBaseDir.getValueName(); // the name we look up in the given context
+ String baseLocation;
+ switch (bundleDestBaseDir.getValueContext()) {
+ case fileSystem: {
+ if (!new File(relativeDeployDir).isAbsolute()) {
+ // the deploy dir is not absolute; since we need to pin it to something, we assume the top root directory
+ // unless the descriptor told us to go somewhere else differently
+ baseLocation = destBaseDirValueName; // ultimately this came from the plugin descriptor
+ if (baseLocation == null || baseLocation.trim().length() == 0) {
+ baseLocation = File.separator; // paranoia, if the plugin descriptor didn't specify, assume the top root directory
+ }
+ } else {
+ baseLocation = null; // so the relativeDeployDir is processed as an absolute dir
+ }
+ break;
+ }
+ case pluginConfiguration: {
+ baseLocation = resource.getPluginConfiguration().getSimpleValue(destBaseDirValueName, null);
+ if (baseLocation == null) {
+ throw new IllegalArgumentException("Cannot determine the bundle base deployment location - "
+ + "there is no plugin configuration setting for [" + destBaseDirValueName + "]");
+ }
+ break;
+ }
+ case resourceConfiguration: {
+ baseLocation = resource.getResourceConfiguration().getSimpleValue(destBaseDirValueName, null);
+ if (baseLocation == null) {
+ throw new IllegalArgumentException("Cannot determine the bundle base deployment location - "
+ + "there is no resource configuration setting for [" + destBaseDirValueName + "]");
+ }
+ break;
+ }
+ case measurementTrait: {
+ // TODO: find out where we squirrel away traits
+ baseLocation = null;
+ break;
+ }
+ default: {
+ throw new IllegalArgumentException("Unknown bundle destination location context: " + bundleDestBaseDir);
+ }
+ }
+
+ return new File(baseLocation, relativeDeployDir);
+ }
+
+ /**
* If this manager can talk to a server-side {@link BundleServerService}, a proxy to that service is returned.
*
* @return the server-side proxy; <code>null</code> if this manager doesn't have a server to talk to
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index e7f80c6..9ea77f5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -81,7 +81,6 @@ import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
@@ -1007,18 +1006,18 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
ResourceGroup group = destination.getGroup();
// Create and persist updates for each of the group members.
- Set<Resource> platforms = group.getExplicitResources();
- if (platforms.isEmpty()) {
+ Set<Resource> groupMembers = group.getExplicitResources();
+ if (groupMembers.isEmpty()) {
throw new IllegalArgumentException("Destination [" + destination
- + "] group has no platforms. Invalid deployment destination");
+ + "] group has no members. Invalid deployment destination");
}
- for (Resource platform : platforms) {
+ for (Resource groupMember : groupMembers) {
try {
- scheduleBundleResourceDeployment(subject, newDeployment, platform, isCleanDeployment, isRevert);
+ scheduleBundleResourceDeployment(subject, newDeployment, groupMember, isCleanDeployment, isRevert);
} catch (Throwable t) {
- log.error("Failed to complete scheduling of platform deployment to [" + platform
- + "]. Other platforms may have been scheduled. ", t);
+ log.error("Failed to complete scheduling of bundle deployment to [" + groupMember
+ + "]. Other bundle deployments to other resources may have been scheduled. ", t);
}
}
@@ -1057,18 +1056,18 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
private BundleResourceDeployment scheduleBundleResourceDeployment(Subject subject, BundleDeployment deployment,
- Resource platform, boolean isCleanDeployment, boolean isRevert) throws Exception {
+ Resource bundleTarget, boolean isCleanDeployment, boolean isRevert) throws Exception {
- int platformId = platform.getId();
- AgentClient agentClient = agentManager.getAgentClient(subjectManager.getOverlord(), platformId);
+ int bundleTargetResourceId = bundleTarget.getId();
+ AgentClient agentClient = agentManager.getAgentClient(subjectManager.getOverlord(), bundleTargetResourceId);
BundleAgentService bundleAgentService = agentClient.getBundleAgentService();
// The BundleResourceDeployment record must exist in the db before the agent request because the agent may try
// to add History to it during immediate deployments. So, create and persist it (requires a new trans).
BundleResourceDeployment resourceDeployment = bundleManager.createBundleResourceDeployment(subject, deployment
- .getId(), platformId);
+ .getId(), bundleTargetResourceId);
- if (ResourceCategory.PLATFORM.equals(platform.getResourceType().getCategory())) {
+ if (null != bundleTarget.getResourceType().getResourceTypeBundleConfiguration()) {
// Ask the agent to schedule the request. The agent should add history as needed.
try {
@@ -1097,7 +1096,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// fail the unlaunched resource deployment
BundleResourceDeploymentHistory failureHistory = new BundleResourceDeploymentHistory(subject.getName(),
this.AUDIT_ACTION_DEPLOYMENT, deployment.getName(), null,
- BundleResourceDeploymentHistory.Status.FAILURE, "Failed to schedule, agent on [" + platform
+ BundleResourceDeploymentHistory.Status.FAILURE, "Failed to schedule, agent on [" + bundleTarget
+ "] may be down: " + t, null);
bundleManager.addBundleResourceDeploymentHistory(subject, resourceDeployment.getId(), failureHistory);
bundleManager.setBundleResourceDeploymentStatus(subject, resourceDeployment.getId(),
@@ -1109,7 +1108,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
BundleDeploymentStatus.FAILURE);
BundleResourceDeploymentHistory history = new BundleResourceDeploymentHistory(subject.getName(),
AUDIT_ACTION_DEPLOYMENT, deployment.getName(), null, BundleResourceDeploymentHistory.Status.FAILURE,
- "Target resource is not a platform [id=" + platform.getId() + "]. Fix target group for destination ["
+ "Target resource is not of a type that can have bundles deployed to it [resource="
+ + bundleTarget.getName() + "; id=" + bundleTarget.getId() + "]. Fix target group for destination ["
+ deployment.getDestination().getName() + "]", null);
bundleManager.addBundleResourceDeploymentHistory(subject, resourceDeployment.getId(), history);
}
@@ -1362,7 +1362,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// TODO: MANAGE_INVENTORY was too restrictive as a bundle manager could not then
// see his resource deployments. Until we can handle granular authorization checks on
// optionally fetched resource member data, allow a bundle manager to see
- // resouce deployments to any platform.
+ // resource deployments to any resource.
if (!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_BUNDLE)) {
throw new PermissionException("Subject [" + subject.getName()
+ "] requires InventoryManager or BundleManager permission for requested query criteria.");
diff --git a/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
index 201d212..31e01ef 100644
--- a/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
+++ b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
@@ -130,8 +130,7 @@ public class AntBundlePluginComponent implements ResourceComponent, BundleFacet
// Parse and execute the Ant script.
executeDeploymentPhase(recipeFile, antProps, buildListeners, DeploymentPhase.STOP);
- String deployDirString = bundleDeployment.getDestination().getDeployDir();
- File deployDir = new File(deployDirString);
+ File deployDir = request.getAbsoluteDestinationDirectory();
DeploymentsMetadata deployMetadata = new DeploymentsMetadata(deployDir);
DeploymentPhase installPhase = (deployMetadata.isManaged()) ? DeploymentPhase.UPGRADE
: DeploymentPhase.INSTALL;
@@ -175,8 +174,7 @@ public class AntBundlePluginComponent implements ResourceComponent, BundleFacet
BundlePurgeResult result = new BundlePurgeResult();
try {
BundleResourceDeployment deploymentToPurge = request.getLiveResourceDeployment();
- BundleDeployment bundleDeployment = deploymentToPurge.getBundleDeployment();
- File deployDir = new File(bundleDeployment.getDestination().getDeployDir());
+ File deployDir = request.getAbsoluteDestinationDirectory();
String deployDirAbsolutePath = deployDir.getAbsolutePath();
BundleManagerProvider bundleManagerProvider = request.getBundleManagerProvider();
@@ -312,14 +310,11 @@ public class AntBundlePluginComponent implements ResourceComponent, BundleFacet
BundleResourceDeployment resourceDeployment = request.getResourceDeployment();
BundleDeployment bundleDeployment = resourceDeployment.getBundleDeployment();
- String deployDir = bundleDeployment.getDestination().getDeployDir();
- if (deployDir == null) {
- throw new IllegalStateException("Bundle deployment does not specify install dir: " + bundleDeployment);
- }
- antProps.setProperty(DeployPropertyNames.DEPLOY_DIR, deployDir);
-
int deploymentId = bundleDeployment.getId();
+ String deployDir = request.getAbsoluteDestinationDirectory().getAbsolutePath();
+
antProps.setProperty(DeployPropertyNames.DEPLOY_ID, Integer.toString(deploymentId));
+ antProps.setProperty(DeployPropertyNames.DEPLOY_DIR, deployDir);
antProps.setProperty(DeployPropertyNames.DEPLOY_NAME, bundleDeployment.getName());
antProps.setProperty(DeployPropertyNames.DEPLOY_REVERT, String.valueOf(request.isRevert()));
antProps.setProperty(DeployPropertyNames.DEPLOY_CLEAN, String.valueOf(request.isCleanDeployment()));
diff --git a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/FileTemplateBundlePluginServerComponent.java b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/FileTemplateBundlePluginServerComponent.java
index 940a01e..2cf5193 100644
--- a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/FileTemplateBundlePluginServerComponent.java
+++ b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/FileTemplateBundlePluginServerComponent.java
@@ -89,7 +89,7 @@ public class FileTemplateBundlePluginServerComponent implements ResourceComponen
// before processing the recipe, wipe the dest dir if we need to perform a clean deployment
if (request.isCleanDeployment()) {
- File deployDir = new File(bundleDeployment.getDestination().getDeployDir());
+ File deployDir = request.getAbsoluteDestinationDirectory();
if (deployDir.exists()) {
bundleManagerProvider.auditDeployment(resourceDeployment, "Cleaning Deployment", deployDir
.getAbsolutePath(), null, null, "The existing deployment found at ["
@@ -109,7 +109,8 @@ public class FileTemplateBundlePluginServerComponent implements ResourceComponen
bundleDeployment.getName(), null, null, "setting replacement variable values using ["
+ bundleDeployment.getConfiguration().toString(true) + "]", null);
recipeContext.setReplacementVariableValues(bundleDeployment.getConfiguration());
- recipeContext.addReplacementVariableValue(DEPLOY_DIR, bundleDeployment.getDestination().getDeployDir());
+ recipeContext.addReplacementVariableValue(DEPLOY_DIR, request.getAbsoluteDestinationDirectory()
+ .getAbsolutePath());
recipeContext.addReplacementVariableValue(DEPLOY_ID, Integer.toString(bundleDeployment.getId()));
recipeContext.addReplacementVariableValue(DEPLOY_NAME, bundleDeployment.getName());
@@ -130,8 +131,7 @@ public class FileTemplateBundlePluginServerComponent implements ResourceComponen
BundlePurgeResult result = new BundlePurgeResult();
try {
BundleResourceDeployment deploymentToPurge = request.getLiveResourceDeployment();
- BundleDeployment bundleDeployment = deploymentToPurge.getBundleDeployment();
- File deployDir = new File(bundleDeployment.getDestination().getDeployDir());
+ File deployDir = request.getAbsoluteDestinationDirectory();
String deployDirAbsolutePath = deployDir.getAbsolutePath();
BundleManagerProvider bundleManagerProvider = request.getBundleManagerProvider();
commit eb1b80d836a0f0259d8462fb71181dbf3298ce94
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jun 10 14:57:10 2011 -0400
BZ 644328 - start fixing up the server side API. adding dest base dir parameter to API.
diff --git a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java
index 488d673..052d3e3 100644
--- a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java
+++ b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java
@@ -262,7 +262,7 @@ public class MetadataManagerTest {
ResourceTypeBundleConfiguration bundleTargetConfig = serverType.getResourceTypeBundleConfiguration();
assert bundleTargetConfig != null;
Set<ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory> set = bundleTargetConfig
- .getBundleDestinationBaseDirectory();
+ .getBundleDestinationBaseDirectories();
assert set.size() == 2;
for (BundleDestinationBaseDirectory bdbd : set) {
if (bdbd.getName().equals("basedir1")) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java
index 7603d78..c7a8a14 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java
@@ -109,10 +109,12 @@ public class BundleDestination implements Serializable {
// for JPA use
}
- public BundleDestination(Bundle bundle, String name, ResourceGroup group, String deployDir) {
+ public BundleDestination(Bundle bundle, String name, ResourceGroup group, String destinationBaseDirectoryName,
+ String deployDir) {
this.bundle = bundle;
this.name = name;
this.group = group;
+ this.destinationBaseDirectoryName = destinationBaseDirectoryName;
this.deployDir = deployDir;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
index dba31e7..4ab5755 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
@@ -81,7 +81,7 @@ public class ResourceTypeBundleConfiguration implements Serializable {
*
* @return the set of destination base directories that can be targets for bundle deployments
*/
- public Set<BundleDestinationBaseDirectory> getBundleDestinationBaseDirectory() {
+ public Set<BundleDestinationBaseDirectory> getBundleDestinationBaseDirectories() {
if (this.bundleConfiguration == null) {
return null;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index 95f01fd..cdba5cb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -169,7 +169,7 @@ public class GetDestinationStep extends AbstractWizardStep {
String[] menuItems = null;
if (result != null) {
Set<BundleDestinationBaseDirectory> baseDirs;
- baseDirs = result.getBundleDestinationBaseDirectory();
+ baseDirs = result.getBundleDestinationBaseDirectories();
if (baseDirs != null && baseDirs.size() > 0) {
menuItems = new String[baseDirs.size()];
int i = 0;
@@ -247,7 +247,7 @@ public class GetDestinationStep extends AbstractWizardStep {
int selectedGroup = (Integer) this.valForm.getValue("group");
bundleServer.createBundleDestination(wizard.getBundleId(), dest.getName(), dest.getDescription(), dest
- .getDeployDir(), selectedGroup, //
+ .getDestinationBaseDirectoryName(), dest.getDeployDir(), selectedGroup, //
new AsyncCallback<BundleDestination>() {
public void onSuccess(BundleDestination result) {
wizard.setDestination(result);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index ed820ad..3c41a95 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -55,8 +55,8 @@ public interface BundleGWTService extends RemoteService {
Configuration configuration, boolean enforcePolicy, int enforcementInterval, boolean pinToBundle)
throws RuntimeException;
- BundleDestination createBundleDestination(int bundleId, String name, String description, String deployDir,
- int groupId) throws RuntimeException;
+ BundleDestination createBundleDestination(int bundleId, String name, String description, String destBaseDirName,
+ String deployDir, int groupId) throws RuntimeException;
void deleteBundles(int[] bundleIds) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 883f0fb..9d53edb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -95,12 +95,12 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
@Override
- public BundleDestination createBundleDestination(int bundleId, String name, String description, String deployDir,
- int groupId) throws RuntimeException {
+ public BundleDestination createBundleDestination(int bundleId, String name, String description,
+ String destBaseDirName, String deployDir, int groupId) throws RuntimeException {
try {
BundleDestination result = bundleManager.createBundleDestination(getSessionSubject(), bundleId, name,
- description, deployDir, groupId);
+ description, destBaseDirName, deployDir, groupId);
return SerialUtility.prepare(result, "createBundleDestination");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 774cd88..e7f80c6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -303,25 +303,25 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
@Override
@RequiredPermission(Permission.MANAGE_BUNDLE)
public BundleDestination createBundleDestination(Subject subject, int bundleId, String name, String description,
- String deployDir, Integer groupId) throws Exception {
+ String destBaseDirName, String deployDir, Integer groupId) throws Exception {
Bundle bundle = entityManager.find(Bundle.class, bundleId);
if (null == bundle) {
throw new IllegalArgumentException("Invalid bundleId [" + bundleId + "]");
}
- // validate that the group exists and is a platform group
+ // validate that the group exists and is a compatible group that can support bundle deployments
ResourceGroupCriteria c = new ResourceGroupCriteria();
c.addFilterId(groupId);
- c.addFilterExplicitResourceCategory(ResourceCategory.PLATFORM);
+ c.addFilterBundleTargetableOnly(true);
List<ResourceGroup> groups = resourceGroupManager.findResourceGroupsByCriteria(subject, c);
if (null == groups || groups.isEmpty()) {
throw new IllegalArgumentException("Invalid groupId [" + groupId
- + "]. Must exist and contain only platform members.");
+ + "]. It must be an existing compatible group whose members must be able to support bundle deployments");
}
ResourceGroup group = entityManager.find(ResourceGroup.class, groups.get(0).getId());
- BundleDestination dest = new BundleDestination(bundle, name, group, deployDir);
+ BundleDestination dest = new BundleDestination(bundle, name, group, destBaseDirName, deployDir);
dest.setDescription(description);
entityManager.persist(dest);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 6bfa7e4..273f2c2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -158,10 +158,16 @@ public interface BundleManagerRemote {
@WebParam(name = "configuration") Configuration configuration) throws Exception;
/**
+ * Creates a bundle destination that describes a target for the bundle deployments.
+ *
* @param subject user must have MANAGE_INVENTORY permission
* @param BundleId the Bundle to be deployed to this Destination
* @param name a name for this destination. not null or empty
* @param description an optional longer description describing this destination
+ * @param destBaseDirName The name of the base directory location where the bundle will be deployed.
+ * <code>deployDir</code> is relative to the directory that this name refers to.
+ * This name isn't the directory itself, it refers to the named location as
+ * defined in the agent plugin's descriptor for the resource's type
* @param deployDir the root dir for deployments to this destination
* @param groupIf the target platforms for deployments to this destination
* @return the persisted destination
@@ -172,6 +178,7 @@ public interface BundleManagerRemote {
@WebParam(name = "bundleId") int bundleId, //
@WebParam(name = "name") String name, //
@WebParam(name = "description") String description, //
+ @WebParam(name = "destBaseDirName") String destBaseDirName, //
@WebParam(name = "deployDir") String deployDir, //
@WebParam(name = "groupId") Integer groupId) throws Exception;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index fd3bb91..e485abc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -304,8 +304,9 @@ public class WebservicesManagerBean implements WebservicesRemote {
}
public BundleDestination createBundleDestination(Subject subject, int bundleId, String name, String description,
- String deployDir, Integer groupId) throws Exception {
- return bundleManager.createBundleDestination(subject, bundleId, name, description, deployDir, groupId);
+ String destBaseDirName, String deployDir, Integer groupId) throws Exception {
+ return bundleManager.createBundleDestination(subject, bundleId, name, description, destBaseDirName, deployDir,
+ groupId);
}
public BundleVersion createBundleVersionViaRecipe(Subject subject, String recipe) throws Exception {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 624a815..cffcadd 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -53,6 +53,8 @@ import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
@@ -99,6 +101,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private static final boolean TESTS_ENABLED = true;
private static final String TEST_PREFIX = "bundletest";
+ private static final String TEST_BUNDLE_DESTBASEDIR_PROP = TEST_PREFIX + ".destBaseDirProp";
+ private static final String TEST_BUNDLE_DESTBASEDIR_PROP_VALUE = TEST_PREFIX + "/destBaseDir";
+ private static final String TEST_DESTBASEDIR_NAME = TEST_PREFIX + ".destBaseDirName";
private BundleManagerLocal bundleManager;
private ResourceManagerLocal resourceManager;
@@ -954,29 +959,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertTrue(bvOut.getBundleDeployments().isEmpty());
}
- @Test(enabled = DISABLED)
- public void testInsertAndRetrieve() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = DISABLED)
- public void testFindByPlatformId() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = DISABLED)
- public void testFindByBundleId() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = DISABLED)
- public void testFindByBundleResourceDeploymentId() throws Exception {
- assertNotNull(null);
- }
-
private BundleType createBundleType(String name) throws Exception {
final String fullName = TEST_PREFIX + "-type-" + name;
- ResourceType rt = createResourceType(name);
+ ResourceType rt = createResourceTypeForBundleType(name);
BundleType bt = bundleManager.createBundleType(overlord, fullName, rt.getId());
assert bt.getId() > 0;
@@ -1013,10 +998,11 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
throws Exception {
final String fullName = TEST_PREFIX + "-bundledestination-" + name;
BundleDestination bd = bundleManager.createBundleDestination(overlord, bundle.getId(), fullName, fullName,
- deployDir, group.getId());
+ TEST_DESTBASEDIR_NAME, deployDir, group.getId());
assert bd.getId() > 0;
assert bd.getName().endsWith(fullName);
+ assert bd.getDestinationBaseDirectoryName().equals(TEST_DESTBASEDIR_NAME);
return bd;
}
@@ -1031,7 +1017,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
return bd;
}
- private ResourceType createResourceType(String name) throws Exception {
+ private ResourceType createResourceTypeForBundleType(String name) throws Exception {
final String fullName = TEST_PREFIX + "-resourcetype-" + name;
ResourceType rt = new ResourceType(fullName, "BundleManagerBeanTest", ResourceCategory.PLATFORM, null);
@@ -1044,7 +1030,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
return rt;
}
- // lifted from ResourceManagerBeanTest
+ // lifted from ResourceManagerBeanTest, with the addition of adding bundle config to the type
private ResourceGroup createTestResourceGroup() throws Exception {
getTransactionManager().begin();
EntityManager em = getEntityManager();
@@ -1057,20 +1043,51 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
// with the bundle resource type
ResourceType resourceType = new ResourceType(TEST_PREFIX + "-platform-" + System.currentTimeMillis(),
"test", ResourceCategory.PLATFORM, null);
+
+ // we need to make this test type bundle targetable
+ ConfigurationDefinition pcDef = new ConfigurationDefinition(TEST_PREFIX + "-testdef", "bundle test");
+ PropertyDefinitionSimple propDef = new PropertyDefinitionSimple(TEST_BUNDLE_DESTBASEDIR_PROP, "", true,
+ PropertySimpleType.STRING);
+ propDef.setDisplayName(TEST_BUNDLE_DESTBASEDIR_PROP);
+ pcDef.put(propDef);
+ em.persist(pcDef);
+
+ ResourceTypeBundleConfiguration rtbc = new ResourceTypeBundleConfiguration(new Configuration());
+ rtbc.addBundleDestinationBaseDirectory(TEST_DESTBASEDIR_NAME,
+ ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory.Context.pluginConfiguration.name(),
+ TEST_BUNDLE_DESTBASEDIR_PROP);
+ resourceType.setResourceTypeBundleConfiguration(rtbc);
+ resourceType.setPluginConfigurationDefinition(pcDef);
+
em.persist(resourceType);
+ // make sure the bundle config is ok
+ rtbc = resourceType.getResourceTypeBundleConfiguration();
+ assert rtbc != null;
+ assert rtbc.getBundleDestinationBaseDirectories().size() == 1;
+ BundleDestinationBaseDirectory bdbd = rtbc.getBundleDestinationBaseDirectories().iterator().next();
+ assert bdbd.getName().equals(TEST_DESTBASEDIR_NAME);
+ assert bdbd.getValueContext() == ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory.Context.pluginConfiguration;
+ assert bdbd.getValueName().equals(TEST_BUNDLE_DESTBASEDIR_PROP);
+
Agent agent = new Agent(TEST_PREFIX + "-testagent", "testaddress", 1, "", "testtoken");
em.persist(agent);
em.flush();
+ Configuration rc = new Configuration();
+ rc.put(new PropertySimple(TEST_BUNDLE_DESTBASEDIR_PROP, TEST_BUNDLE_DESTBASEDIR_PROP_VALUE));
+ em.persist(rc);
+
resource = new Resource("reskey" + System.currentTimeMillis(), TEST_PREFIX + "-resname", resourceType);
resource.setUuid("" + System.currentTimeMillis());
resource.setInventoryStatus(InventoryStatus.COMMITTED);
resource.setAgent(agent);
+ resource.setResourceConfiguration(rc);
em.persist(resource);
resourceGroup = new ResourceGroup(TEST_PREFIX + "-group-" + System.currentTimeMillis());
resourceGroup.addExplicitResource(resource);
+ resourceGroup.setResourceType(resourceType); // need to tell the group the type it is
em.persist(resourceGroup);
getTransactionManager().commit();
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
index 246ca59..5ad9cdb 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
@@ -69,7 +69,7 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
ResourceTypeBundleConfiguration bundleConfig1 = server1.getResourceTypeBundleConfiguration();
assert bundleConfig1 != null : "server should have been a bundle target";
- Set<BundleDestinationBaseDirectory> baseDirs1 = bundleConfig1.getBundleDestinationBaseDirectory();
+ Set<BundleDestinationBaseDirectory> baseDirs1 = bundleConfig1.getBundleDestinationBaseDirectories();
assert baseDirs1.size() == 2 : "should have been 2 bundle dest base dirs: " + baseDirs1;
for (BundleDestinationBaseDirectory baseDir : baseDirs1) {
@@ -101,7 +101,7 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
ResourceTypeBundleConfiguration bundleConfig2 = server2.getResourceTypeBundleConfiguration();
assert bundleConfig2 != null : "server should have been a bundle target";
- Set<BundleDestinationBaseDirectory> baseDirs2 = bundleConfig2.getBundleDestinationBaseDirectory();
+ Set<BundleDestinationBaseDirectory> baseDirs2 = bundleConfig2.getBundleDestinationBaseDirectories();
assert baseDirs2.size() == 1 : "should have been 1 bundle dest base dir: " + baseDirs2;
BundleDestinationBaseDirectory baseDir = baseDirs2.iterator().next();
diff --git a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
index 9f2c846..18d672f 100644
--- a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
+++ b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
@@ -66,6 +66,8 @@ import org.rhq.core.util.updater.DeploymentsMetadata;
@Test
public class AntBundlePluginComponentTest {
+ private static final String DEST_BASE_DIR_NAME = "Root File System"; // just mimics the real platform plugin types' name
+
private AntBundlePluginComponent plugin;
private File tmpDir;
private File bundleFilesDir;
@@ -126,7 +128,7 @@ public class AntBundlePluginComponentTest {
BundleVersion bundleVersion = new BundleVersion("test-bundle-two", "2.5", bundle,
getRecipeFromFile("test-bundle-two.xml"));
BundleDestination destination = new BundleDestination(bundle, "testSimpleBundle2Dest", new ResourceGroup(
- "testSimpleBundle2Group"), this.destDir.getAbsolutePath());
+ "testSimpleBundle2Group"), DEST_BASE_DIR_NAME, this.destDir.getAbsolutePath());
Configuration config = new Configuration();
String customPropName = "custom.prop";
@@ -241,7 +243,7 @@ public class AntBundlePluginComponentTest {
BundleVersion bundleVersion = new BundleVersion("test-bundle-two", "2.5", bundle,
getRecipeFromFile("test-bundle-two.xml"));
BundleDestination destination = new BundleDestination(bundle, "testSimpleBundle2Dest", new ResourceGroup(
- "testSimpleBundle2Group"), this.destDir.getAbsolutePath());
+ "testSimpleBundle2Group"), DEST_BASE_DIR_NAME, this.destDir.getAbsolutePath());
Configuration config = new Configuration();
String customPropName = "custom.prop";
@@ -323,7 +325,7 @@ public class AntBundlePluginComponentTest {
BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
getRecipeFromFile("test-bundle.xml"));
BundleDestination destination = new BundleDestination(bundle, "testSimpleBundle", new ResourceGroup(
- "testSimpleBundle"), this.destDir.getAbsolutePath());
+ "testSimpleBundle"), DEST_BASE_DIR_NAME, this.destDir.getAbsolutePath());
Configuration config = new Configuration();
String realPropValue = "ABC123";
@@ -389,7 +391,7 @@ public class AntBundlePluginComponentTest {
BundleVersion bundleVersion = new BundleVersion("testNoManageRootDirBundle", "1.0", bundle,
getRecipeFromFile("test-bundle-no-manage-root-dir.xml"));
BundleDestination destination = new BundleDestination(bundle, "testNoManageRootDirBundle", new ResourceGroup(
- "testNoManageRootDirBundle"), this.destDir.getAbsolutePath());
+ "testNoManageRootDirBundle"), DEST_BASE_DIR_NAME, this.destDir.getAbsolutePath());
Configuration config = new Configuration();
BundleDeployment deployment = new BundleDeployment();
@@ -508,7 +510,7 @@ public class AntBundlePluginComponentTest {
BundleVersion bundleVersion = new BundleVersion("test-bundle-two", "3.0", bundle,
getRecipeFromFile("test-bundle-three.xml"));
BundleDestination destination = new BundleDestination(bundle, "testSimpleBundle2Dest", new ResourceGroup(
- "testSimpleBundle2Group"), this.destDir.getAbsolutePath());
+ "testSimpleBundle2Group"), DEST_BASE_DIR_NAME, this.destDir.getAbsolutePath());
Configuration config = new Configuration();
String customPropName = "custom.prop";
diff --git a/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java b/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java
index fd71508..f05eda7 100644
--- a/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java
+++ b/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java
@@ -191,9 +191,10 @@ public class ProcessingRecipeContextTest {
Bundle bundle = new Bundle("name", bundleType, null, null);
BundleVersion bundleVersion = new BundleVersion("bname", "bversion", bundle, "");
String name = "name";
+ String destBaseDirName = "destBaseDirName";
String installDir = "installDir";
BundleDestination bundleDestination = new BundleDestination(bundle, "destName", new ResourceGroup("groupName"),
- installDir);
+ destBaseDirName, installDir);
BundleDeployment bundleDeployment = new BundleDeployment(bundleVersion, bundleDestination, name);
BundleResourceDeployment deployment = new BundleResourceDeployment(bundleDeployment, resource);
commit 6586722934e103511568a54e919887476cdf9704
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jun 10 13:53:19 2011 -0400
log plugin descriptor validation errors at ERROR or WARN level, rather than DEBUG; include line # and column # in validation errors
diff --git a/modules/enterprise/server/xml-schemas/src/main/java/org/rhq/enterprise/server/xmlschema/ServerPluginDescriptorUtil.java b/modules/enterprise/server/xml-schemas/src/main/java/org/rhq/enterprise/server/xmlschema/ServerPluginDescriptorUtil.java
index 00ba663..93a42a2 100644
--- a/modules/enterprise/server/xml-schemas/src/main/java/org/rhq/enterprise/server/xmlschema/ServerPluginDescriptorUtil.java
+++ b/modules/enterprise/server/xml-schemas/src/main/java/org/rhq/enterprise/server/xmlschema/ServerPluginDescriptorUtil.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
@@ -39,6 +39,7 @@ import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
+import javax.xml.bind.ValidationEventLocator;
import javax.xml.bind.util.ValidationEventCollector;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
@@ -55,6 +56,7 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDe
* Utilities for server-side plugin descriptors.
*
* @author John Mazzitelli
+ * @author Ian Springer
*/
public abstract class ServerPluginDescriptorUtil {
private static final Log LOG = LogFactory.getLog(ServerPluginDescriptorUtil.class);
@@ -235,12 +237,9 @@ public abstract class ServerPluginDescriptorUtil {
pluginDescriptor = ((JAXBElement<? extends ServerPluginDescriptorType>) jaxbElement).getValue();
} finally {
if (unmarshaller != null) {
- for (ValidationEvent ev : ((ValidationEventCollector) unmarshaller.getEventHandler())
- .getEvents()) {
- logger.debug("Plugin [" + pluginJarFileUrl + "] descriptor event {Severity: "
- + ev.getSeverity() + ", Message: " + ev.getMessage() + ", Exception: "
- + ev.getLinkedException() + "}");
- }
+ ValidationEventCollector validationEventCollector =
+ (ValidationEventCollector)unmarshaller.getEventHandler();
+ logValidationEvents(pluginJarFileUrl, validationEventCollector);
}
}
}
@@ -319,6 +318,48 @@ public abstract class ServerPluginDescriptorUtil {
}
}
+ private static void logValidationEvents(URL pluginJarFileUrl, ValidationEventCollector validationEventCollector) {
+ for (ValidationEvent event : validationEventCollector.getEvents()) {
+ // First build the message to be logged. The message will look something like this:
+ //
+ // Validation fatal error while parsing [jopr-jboss-as-plugin-4.1.0-SNAPSHOT.jar:META-INF/rhq-plugin.xml]
+ // at line 221, column 94: cvc-minInclusive-valid: Value '20000' is not facet-valid with respect to
+ // minInclusive '30000' for type '#AnonType_defaultIntervalmetric'.
+ //
+ StringBuilder message = new StringBuilder();
+ String severity = null;
+ switch(event.getSeverity()) {
+ case ValidationEvent.WARNING:
+ severity = "warning";
+ break;
+ case ValidationEvent.ERROR:
+ severity = "error";
+ break;
+ case ValidationEvent.FATAL_ERROR:
+ severity = "fatal error";
+ break;
+ }
+ message.append("Validation ").append(severity);
+ File pluginJarFile = new File(pluginJarFileUrl.getPath());
+ message.append(" while parsing [").append(pluginJarFile.getName()).append(":").append(PLUGIN_DESCRIPTOR_PATH).append("]");
+ ValidationEventLocator locator = event.getLocator();
+ message.append(" at line ").append(locator.getLineNumber());
+ message.append(", column ").append(locator.getColumnNumber());
+ message.append(": ").append(event.getMessage());
+
+ // Now write the message to the log at an appropriate level.
+ switch(event.getSeverity()) {
+ case ValidationEvent.WARNING:
+ case ValidationEvent.ERROR:
+ LOG.warn(message);
+ break;
+ case ValidationEvent.FATAL_ERROR:
+ LOG.error(message);
+ break;
+ }
+ }
+ }
+
/**
* Obtains the manifest of the plugin file represented by the given deployment info.
* Use this method rather than calling deploymentInfo.getManifest()
commit dbe68b1790b4bdacd86b23dc6acdd86562fd61fb
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Jun 10 12:51:13 2011 -0400
removing file that was accidentally included in previous commit
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml.orig b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml.orig
deleted file mode 100644
index 6f40805..0000000
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml.orig
+++ /dev/null
@@ -1,101 +0,0 @@
-<dataset>
- <rhq_agent id="1"
- name="TestAgent-dbbt"
- address="0.0.0.0"
- port="16163"
- remote_endpoint="http://here"
- agenttoken="tok"
- backfilled="false"
- ctime="123456"
- mtime="123456"/>
-
- <rhq_config_def/>
- <rhq_config_prop_def/>
- <rhq_conf_prop_def_enum/>
- <rhq_config_prop_constr/>
-
- <rhq_resource_type id="1"
- name="test platform"
- category="PLATFORM"
- creation_data_type="CONFIGURATION"
- create_delete_policy="BOTH"
- supports_manual_add="true"
- singleton="false"
- plugin="test"
- deleted="false"/>
- <rhq_resource_type id="2"
- name="test server"
- category="SERVER"
- creation_data_type="CONFIGURATION"
- create_delete_policy="BOTH"
- supports_manual_add="true"
- singleton="false"
- plugin="test"
- deleted="false"/>
- <rhq_resource_type id="3"
- name="test service 1"
- category="SERVICE"
- creation_data_type="CONFIGURATION"
- create_delete_policy="BOTH"
- supports_manual_add="true"
- singleton="false"
- plugin="test"
- deleted="false"/>
- <rhq_resource_type id="4"
- name="test service 2"
- category="SERVICE"
- creation_data_type="CONFIGURATION"
- create_delete_policy="BOTH"
- supports_manual_add="true"
- singleton="false"
- plugin="test"
- deleted="false"/>
-
- <rhq_resource_type_parents resource_type_id="2"
- parent_resource_type_id="1"/>
- <rhq_resource_type_parents resource_type_id="3"
- parent_resource_type_id="2"/>
- <rhq_resource_type_parents resource_type_id="4"
- parent_resource_type_id="2"/>
-
- <rhq_process_scan/>
- <rhq_event_def/>
- <rhq_measurement_def/>
- <rhq_operation_def/>
- <rhq_package_type/>
- <rhq_bundle_type/>
- <rhq_config/>
- <rhq_config_property/>
- <rhq_config_template/>
- <rhq_resource/>
- <rhq_resource_subcat/>
- <rhq_resource_group/>
- <rhq_prd_ver/>
- <rhq_alert_definition/>
- <rhq_alert_condition/>
- <rhq_alert/>
- <rhq_alert_condition_log/>
- <rhq_alert_notif_log/>
- <rhq_availability/>
- <rhq_measurement_sched/>
-<<<<<<< HEAD
- <rhq_content_source/>
-=======
- <rhq_content_source_type/>
- <rhq_content_source/>
- <rhq_repo_content_src_map/>
->>>>>>> master
- <rhq_package/>
- <rhq_bundle/>
-
- <rhq_plugin id="1"
- deployment="AGENT"
- name="test"
- display_name="test"
- enabled="true"
- status="INSTALLED"
- path="/plugins/test.jar"
- md5="1234567"
- ctime="12345"
- mtime="123456"/>
-</dataset>
commit 13ae6ee73bec0ffb29568c0250c0bd267239258d
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Jun 10 12:38:17 2011 -0400
Fixing test failures that were due to tests not getting updated
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java
index bbffef8..d51798d 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java
@@ -31,6 +31,8 @@ import static org.testng.Assert.*;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.util.exception.ThrowableUtil;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.test.JMockTest;
import org.rhq.test.jmock.PropertyMatcher;
import org.rhq.core.domain.auth.Subject;
@@ -61,9 +63,14 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
static final boolean FROM_STRUCTURED = true;
static final boolean FROM_RAW = false;
+ static final Subject OVERLORD = new Subject("overlord", true, true);
ConfigurationManagerLocal configurationMgrLocal;
+ ResourceManagerLocal resourceMgr;
+
+ SubjectManagerLocal subjectMgr;
+
AgentManagerLocal agentMgr;
AuthorizationManagerLocal authorizationMgr;
@@ -87,6 +94,12 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
entityMgr = context.mock(EntityManager.class);
setField(configurationMgr, "entityManager", entityMgr);
+
+ resourceMgr = context.mock(ResourceManagerLocal.class);
+ setField(configurationMgr, "resourceManager", resourceMgr);
+
+ subjectMgr = context.mock(SubjectManagerLocal.class);
+ setField(configurationMgr, "subjectManager", subjectMgr);
}
static void setField(Object src, String fieldName, Object value) {
@@ -126,6 +139,11 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
expectedUpdate.getConfiguration(), expectedUpdate.getResource().getId());
context.checking(new Expectations() {{
+ allowing(subjectMgr).getOverlord(); will(returnValue(OVERLORD));
+
+ allowing(resourceMgr).getResource(OVERLORD, fixture.resourceId);
+ will(returnValue(fixture.resource));
+
oneOf(authorizationMgr).hasResourcePermission(fixture.subject, CONFIGURE_WRITE, fixture.resourceId);
will(returnValue(true));
@@ -163,6 +181,11 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
expectedUpdate.getConfiguration(), expectedUpdate.getResource().getId());
context.checking(new Expectations() {{
+ allowing(subjectMgr).getOverlord(); will(returnValue(OVERLORD));
+
+ allowing(resourceMgr).getResource(OVERLORD, fixture.resourceId);
+ will(returnValue(fixture.resource));
+
allowing(entityMgr).find(Resource.class, fixture.resourceId); will(returnValue(fixture.resource));
oneOf(authorizationMgr).hasResourcePermission(fixture.subject, CONFIGURE_WRITE, fixture.resourceId);
@@ -197,56 +220,6 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
configurationMgr.updateResourceConfiguration(fixture.subject, fixture.resourceId, fixture.configuration);
}
-// @Test
-// public void updateResourceConfigShouldTranslateStructuredWhenStructredConfigHasEdits() throws Exception {
-// final ResourceConfigUpdateFixture fixture = newStructuredAndRawResourceConfigUpdateFixture();
-//
-// final Configuration translatedConfig = fixture.configuration.deepCopy();
-// translatedConfig.addRawConfiguration(new RawConfiguration());
-//
-// final ResourceConfigurationUpdate expectedUpdate = new ResourceConfigurationUpdate(fixture.resource,
-// translatedConfig, fixture.subject.getName());
-// expectedUpdate.setId(-1);
-//
-// final AgentClient agentClient = context.mock(AgentClient.class);
-// final ConfigurationAgentService configAgentService = context.mock(ConfigurationAgentService.class);
-//
-// final ConfigurationUpdateRequest expectedUpdateRequest = new ConfigurationUpdateRequest(expectedUpdate.getId(),
-// expectedUpdate.getConfiguration(), expectedUpdate.getResource().getId());
-//
-// final Sequence configUdpate = context.sequence("structured-config-update");
-//
-// context.checking(new Expectations() {{
-// allowing(entityMgr).find(Resource.class, fixture.resourceId); will(returnValue(fixture.resource));
-//
-// allowing(authorizationMgr).canViewResource(fixture.subject, fixture.resourceId); will(returnValue(true));
-//
-// oneOf(configAgentService).merge(fixture.configuration, fixture.resourceId, FROM_STRUCTURED);
-// will(returnValue(translatedConfig)); inSequence(configUdpate);
-//
-// oneOf(configurationMgrLocal).persistNewResourceConfigurationUpdateHistory(fixture.subject,
-// fixture.resourceId, translatedConfig, INPROGRESS, fixture.subject.getName(),
-// fixture.isPartOfGroupUpdate);
-// will(returnValue(expectedUpdate));
-// inSequence(configUdpate);
-//
-// allowing(agentMgr).getAgentClient(expectedUpdate.getResource().getAgent()); will(returnValue(agentClient));
-//
-// allowing(agentClient).getConfigurationAgentService(); will(returnValue(configAgentService));
-//
-// oneOf(configAgentService).validate(fixture.configuration, fixture.resourceId, FROM_STRUCTURED);
-// inSequence(configUdpate);
-//
-// oneOf(configAgentService).updateResourceConfiguration(with(matchingUpdateRequest(expectedUpdateRequest)));
-// inSequence(configUdpate);
-// }});
-//
-// ResourceConfigurationUpdate actualUpdate = configurationMgr.updateStructuredOrRawConfiguration(fixture.subject,
-// fixture.resourceId, fixture.configuration, FROM_STRUCTURED);
-//
-// assertSame(actualUpdate, expectedUpdate, "Expected to get back the persisted configuration update");
-// }
-
@Test
public void updateResourceConfigShouldNotTranslateStructuredWhenRawNotSupported() throws Exception {
final ResourceConfigUpdateFixture fixture = newStructuredResourceConfigUpdateFixture();
@@ -364,6 +337,11 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
expectedUpdate.setErrorMessage(ThrowableUtil.getStackAsString(exception));
context.checking(new Expectations() {{
+ allowing(subjectMgr).getOverlord(); will(returnValue(OVERLORD));
+
+ allowing(resourceMgr).getResource(OVERLORD, fixture.resourceId);
+ will(returnValue(fixture.resource));
+
allowing(entityMgr).find(Resource.class, fixture.resourceId); will(returnValue(fixture.resource));
allowing(entityMgr).find(ResourceConfigurationUpdate.class, expectedUpdate.getId());
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml.orig b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml.orig
new file mode 100644
index 0000000..6f40805
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml.orig
@@ -0,0 +1,101 @@
+<dataset>
+ <rhq_agent id="1"
+ name="TestAgent-dbbt"
+ address="0.0.0.0"
+ port="16163"
+ remote_endpoint="http://here"
+ agenttoken="tok"
+ backfilled="false"
+ ctime="123456"
+ mtime="123456"/>
+
+ <rhq_config_def/>
+ <rhq_config_prop_def/>
+ <rhq_conf_prop_def_enum/>
+ <rhq_config_prop_constr/>
+
+ <rhq_resource_type id="1"
+ name="test platform"
+ category="PLATFORM"
+ creation_data_type="CONFIGURATION"
+ create_delete_policy="BOTH"
+ supports_manual_add="true"
+ singleton="false"
+ plugin="test"
+ deleted="false"/>
+ <rhq_resource_type id="2"
+ name="test server"
+ category="SERVER"
+ creation_data_type="CONFIGURATION"
+ create_delete_policy="BOTH"
+ supports_manual_add="true"
+ singleton="false"
+ plugin="test"
+ deleted="false"/>
+ <rhq_resource_type id="3"
+ name="test service 1"
+ category="SERVICE"
+ creation_data_type="CONFIGURATION"
+ create_delete_policy="BOTH"
+ supports_manual_add="true"
+ singleton="false"
+ plugin="test"
+ deleted="false"/>
+ <rhq_resource_type id="4"
+ name="test service 2"
+ category="SERVICE"
+ creation_data_type="CONFIGURATION"
+ create_delete_policy="BOTH"
+ supports_manual_add="true"
+ singleton="false"
+ plugin="test"
+ deleted="false"/>
+
+ <rhq_resource_type_parents resource_type_id="2"
+ parent_resource_type_id="1"/>
+ <rhq_resource_type_parents resource_type_id="3"
+ parent_resource_type_id="2"/>
+ <rhq_resource_type_parents resource_type_id="4"
+ parent_resource_type_id="2"/>
+
+ <rhq_process_scan/>
+ <rhq_event_def/>
+ <rhq_measurement_def/>
+ <rhq_operation_def/>
+ <rhq_package_type/>
+ <rhq_bundle_type/>
+ <rhq_config/>
+ <rhq_config_property/>
+ <rhq_config_template/>
+ <rhq_resource/>
+ <rhq_resource_subcat/>
+ <rhq_resource_group/>
+ <rhq_prd_ver/>
+ <rhq_alert_definition/>
+ <rhq_alert_condition/>
+ <rhq_alert/>
+ <rhq_alert_condition_log/>
+ <rhq_alert_notif_log/>
+ <rhq_availability/>
+ <rhq_measurement_sched/>
+<<<<<<< HEAD
+ <rhq_content_source/>
+=======
+ <rhq_content_source_type/>
+ <rhq_content_source/>
+ <rhq_repo_content_src_map/>
+>>>>>>> master
+ <rhq_package/>
+ <rhq_bundle/>
+
+ <rhq_plugin id="1"
+ deployment="AGENT"
+ name="test"
+ display_name="test"
+ enabled="true"
+ status="INSTALLED"
+ path="/plugins/test.jar"
+ md5="1234567"
+ ctime="12345"
+ mtime="123456"/>
+</dataset>
commit 28f91db14c2ffb367cd93f98b9e9ab2935103a2c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jun 10 12:23:26 2011 -0400
BZ 644328 - put the base location in the GUI deployment view
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index 3542481..8ff20ff 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -177,6 +177,9 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
destinationGroup.setLinkTitle(StringUtility.escapeHtml((deployment.getDestination().getGroup().getName())));
destinationGroup.setTarget("_self");
+ StaticTextItem destBaseDir = new StaticTextItem("destBaseDir", MSG.view_bundle_dest_baseDirName());
+ destBaseDir.setValue(deployment.getDestination().getDestinationBaseDirectoryName());
+
StaticTextItem path = new StaticTextItem("path", MSG.view_bundle_deployDir());
path.setValue(deployment.getDestination().getDeployDir());
@@ -201,8 +204,8 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
});
}
- form.setFields(bundleName, deployed, actionItem, bundleVersionName, deployedBy, destinationGroup, path,
- description, status);
+ form.setFields(bundleName, bundleVersionName, actionItem, deployed, deployedBy, destinationGroup, destBaseDir,
+ description, path, status);
return form;
}
commit 73d16605e7fd7a3933d9c470351905e49fd703f4
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jun 10 12:16:27 2011 -0400
more work on gui perf tests
diff --git a/etc/guiperftests/pom.xml b/etc/guiperftests/pom.xml
index ab81ed0..4ef1107 100644
--- a/etc/guiperftests/pom.xml
+++ b/etc/guiperftests/pom.xml
@@ -18,7 +18,7 @@
inventoried Resources is running on localhost:7080</description>
<properties>
- <!-- explictly specify a default encoding to avoid relying on the LANG env var being set correctly -->
+ <!-- explicitly specify a default encoding to avoid relying on the LANG env var being set correctly -->
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
diff --git a/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java b/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java
index 9116089..ef4d309 100644
--- a/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java
+++ b/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java
@@ -35,6 +35,17 @@ public class GuiPerfTestCase extends TestCase {
super(name);
}
+ public void testLoadResourceTree() {
+ Browser browser = GuiPerfTestSuite.getBrowser();
+
+ browser.link("Inventory").click();
+ browser.cell("Platforms").click();
+ browser.div("Linux Operating System").under(browser.cell("Description")).doubleClick();
+ // check that tree has been drawn
+ assertTrue(browser.table("treeCellSelected").isVisible());
+ }
+
+/*
public void testCreateCompatibleGroup() throws InterruptedException {
Browser browser = GuiPerfTestSuite.getBrowser();
@@ -47,16 +58,24 @@ public class GuiPerfTestCase extends TestCase {
browser.textarea("description").setValue("bleh");
browser.cell("Next").click();
- browser.textbox("search").setValue("RHQ Agent");
- browser.textbox("search").click();
- browser.waitFor(500);
+ //browser.textbox("search").setValue("RHQ Agent");
+ //browser.textbox("search").click();
+
+ browser.cell("Choose a value").click();
+ browser.xy(browser.cell("RHQAgent Plugin"), 3, 3).hover();
+ browser.xy(browser.cell("treeMenuSelected[2]", 3, 3)).click();
+ //browser.xy(browser.cell("RHQ Agent"), 3, 3).near(browser.cell("RHQAgent Plugin")).click();
+
+ browser.waitFor(1000);
browser.div("RHQ Agent[1]").hover();
- browser.waitFor(300);
+ browser.waitFor(1000);
browser.div("RHQ Agent[1]").click();
browser.image("right_Over.png").click();
browser.cell("Finish").click();
}
+*/
+/*
public void testCreateRole() throws InterruptedException {
Browser browser = GuiPerfTestSuite.getBrowser();
@@ -71,6 +90,7 @@ public class GuiPerfTestCase extends TestCase {
browser.image("unchecked.png").near(browser.div("Manage Security")).click();
browser.cell("Save").click();
}
+*/
public static Test suite() {
return new GuiPerfTestSuite(GuiPerfTestCase.class);
commit 11c98ceed96bf24e2397e04d946abb2655e0cfea
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jun 10 12:15:43 2011 -0400
[BZ 712444] make sure fatal validation errors during parsing of an agent plugin descriptor are logged (https://bugzilla.redhat.com/show_bug.cgi?id=712444)
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/descriptor/AgentPluginDescriptorUtil.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/descriptor/AgentPluginDescriptorUtil.java
index 8e41c8b..bdfdd84 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/descriptor/AgentPluginDescriptorUtil.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/descriptor/AgentPluginDescriptorUtil.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.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
+import javax.xml.bind.ValidationEventLocator;
import javax.xml.bind.util.ValidationEventCollector;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
@@ -62,6 +63,7 @@ import org.rhq.core.util.exception.WrappedRemotingException;
* Utilities for agent plugin descriptors.
*
* @author John Mazzitelli
+ * @author Ian Springer
*/
public abstract class AgentPluginDescriptorUtil {
private static final Log LOG = LogFactory.getLog(AgentPluginDescriptorUtil.class);
@@ -282,7 +284,7 @@ public abstract class AgentPluginDescriptorUtil {
/**
* Loads a plugin descriptor from the given plugin jar and returns it.
*
- * This is a static method to provide a convienence method for others to be able to use.
+ * This is a static method to provide a convenience method for others to be able to use.
*
* @param pluginJarFileUrl URL to a plugin jar file
* @return the plugin descriptor found in the given plugin jar file
@@ -308,7 +310,7 @@ public abstract class AgentPluginDescriptorUtil {
JarInputStream jis = null;
JarEntry descriptorEntry = null;
-
+ ValidationEventCollector validationEventCollector = new ValidationEventCollector();
try {
jis = new JarInputStream(pluginJarFileUrl.openStream());
JarEntry nextEntry = jis.getNextJarEntry();
@@ -332,22 +334,14 @@ public abstract class AgentPluginDescriptorUtil {
Schema pluginSchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
pluginSchemaURL);
unmarshaller.setSchema(pluginSchema);
-
- ValidationEventCollector vec = new ValidationEventCollector();
- unmarshaller.setEventHandler(vec);
+ unmarshaller.setEventHandler(validationEventCollector);
PluginDescriptor pluginDescriptor = (PluginDescriptor) unmarshaller.unmarshal(jis);
- for (ValidationEvent event : vec.getEvents()) {
- logger.debug("Plugin [" + pluginDescriptor.getName() + "] descriptor messages {Severity: "
- + event.getSeverity() + ", Message: " + event.getMessage() + ", Exception: "
- + event.getLinkedException() + "}");
- }
-
return pluginDescriptor;
} catch (Exception e) {
throw new PluginContainerException("Could not successfully parse the plugin descriptor ["
- + PLUGIN_DESCRIPTOR_PATH + " found in plugin jar at [" + pluginJarFileUrl + "]",
+ + PLUGIN_DESCRIPTOR_PATH + "] found in plugin jar at [" + pluginJarFileUrl + "].",
new WrappedRemotingException(e));
} finally {
if (jis != null) {
@@ -357,6 +351,51 @@ public abstract class AgentPluginDescriptorUtil {
logger.warn("Cannot close jar stream [" + pluginJarFileUrl + "]. Cause: " + e);
}
}
+
+ logValidationEvents(pluginJarFileUrl, validationEventCollector, logger);
+ }
+ }
+
+ private static void logValidationEvents(URL pluginJarFileUrl, ValidationEventCollector validationEventCollector,
+ Log logger) {
+ for (ValidationEvent event : validationEventCollector.getEvents()) {
+ // First build the message to be logged. The message will look something like this:
+ //
+ // Validation fatal error while parsing [jopr-jboss-as-plugin-4.1.0-SNAPSHOT.jar:META-INF/rhq-plugin.xml]
+ // at line 221, column 94: cvc-minInclusive-valid: Value '20000' is not facet-valid with respect to
+ // minInclusive '30000' for type '#AnonType_defaultIntervalmetric'.
+ //
+ StringBuilder message = new StringBuilder();
+ String severity = null;
+ switch(event.getSeverity()) {
+ case ValidationEvent.WARNING:
+ severity = "warning";
+ break;
+ case ValidationEvent.ERROR:
+ severity = "error";
+ break;
+ case ValidationEvent.FATAL_ERROR:
+ severity = "fatal error";
+ break;
+ }
+ message.append("Validation ").append(severity);
+ File pluginJarFile = new File(pluginJarFileUrl.getPath());
+ message.append(" while parsing [").append(pluginJarFile.getName()).append(":").append(PLUGIN_DESCRIPTOR_PATH).append("]");
+ ValidationEventLocator locator = event.getLocator();
+ message.append(" at line ").append(locator.getLineNumber());
+ message.append(", column ").append(locator.getColumnNumber());
+ message.append(": ").append(event.getMessage());
+
+ // Now write the message to the log at an appropriate level.
+ switch(event.getSeverity()) {
+ case ValidationEvent.WARNING:
+ case ValidationEvent.ERROR:
+ logger.warn(message);
+ break;
+ case ValidationEvent.FATAL_ERROR:
+ logger.error(message);
+ break;
+ }
}
}
commit 224bade5a67f9dbbcc2343090df4609b00c9a517
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jun 10 11:45:38 2011 -0400
fix a bunch of bugs in the recently added config masking code where resourceId was being passed in where resourceTypeId should have been
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..7e7d926 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
@@ -116,7 +116,7 @@ import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.QuartzUtil;
/**
- * The manager responsible for working with resource and plugin configurations.
+ * The manager responsible for working with Resource and plugin configurations.
*
* @author John Mazzitelli
* @author Ian Springer
@@ -928,7 +928,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
for (PluginConfigurationUpdate update : updates) {
Configuration configuration = update.getConfiguration();
ConfigurationDefinition configurationDefinition = getPluginConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), update.getResource().getId());
+ subjectManager.getOverlord(), update.getResource().getResourceType().getId());
ConfigurationMaskingUtility.maskConfiguration(configuration, configurationDefinition);
}
@@ -990,7 +990,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
for (ResourceConfigurationUpdate update : updates) {
Configuration configuration = update.getConfiguration();
ConfigurationDefinition configurationDefinition = getResourceConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), update.getResource().getId());
+ subjectManager.getOverlord(), update.getResource().getResourceType().getId());
ConfigurationMaskingUtility.maskConfiguration(configuration, configurationDefinition);
}
@@ -2272,7 +2272,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
for (ResourceConfigurationUpdate update : updates) {
Configuration configuration = update.getConfiguration();
ConfigurationDefinition configurationDefinition = getResourceConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), update.getResource().getId());
+ subjectManager.getOverlord(), update.getResource().getResourceType().getId());
ConfigurationMaskingUtility.maskConfiguration(configuration, configurationDefinition);
}
@@ -2299,7 +2299,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
for (PluginConfigurationUpdate update : updates) {
Configuration configuration = update.getConfiguration();
ConfigurationDefinition configurationDefinition = getPluginConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), update.getResource().getId());
+ subjectManager.getOverlord(), update.getResource().getResourceType().getId());
ConfigurationMaskingUtility.maskConfiguration(configuration, configurationDefinition);
}
@@ -2331,7 +2331,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
for (ResourceConfigurationUpdate memberUpdate : memberUpdates) {
Configuration configuration = memberUpdate.getConfiguration();
ConfigurationDefinition configurationDefinition = getResourceConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), memberUpdate.getResource().getId());
+ subjectManager.getOverlord(), memberUpdate.getResource().getResourceType().getId());
ConfigurationMaskingUtility.maskConfiguration(configuration, configurationDefinition);
}
}
@@ -2365,7 +2365,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
for (PluginConfigurationUpdate memberUpdate : memberUpdates) {
Configuration configuration = memberUpdate.getConfiguration();
ConfigurationDefinition configurationDefinition = getPluginConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), memberUpdate.getResource().getId());
+ subjectManager.getOverlord(), memberUpdate.getResource().getResourceType().getId());
ConfigurationMaskingUtility.maskConfiguration(configuration, configurationDefinition);
}
}
commit 46705946d33d7049670731144384c2a15e55f207
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Jun 9 10:48:28 2011 -0400
cosmetic: fix a couple typos
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java
index 281beb2..0dfe0bb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java
@@ -48,12 +48,12 @@ import org.rhq.enterprise.server.measurement.MeasurementNotFoundException;
import org.rhq.enterprise.server.util.LookupUtil;
/**
- * This is purposefully not TimeZone sensitive. It makes this easier to deal with in clusters with servers in different
+ * This is purposefully not TimeZone sensitive. It makes it easier for it to deal with clusters with servers in different
* timezones, but it means that we can't rely on table maintenance in the middle of the night. That's ok, we're going to
- * do this like the rest of the maintenance on the hour. It does mean that even with 12 hour tables we may have data in
- * one from 10 am to 10 pm local instead of 12 to 12.
- *
- * <p/>Due to the leap seconds its possible some tables will technically span more than MILLISECONDS_PER_TABLE of real
+ * do this like the rest of the maintenance - on the hour. It does mean that even with 12 hour tables we may have data
+ * in one from 10 am to 10 pm local instead of 12 to 12.
+ * <p/>
+ * Due to the leap seconds, it's possible some tables will technically span more than MILLISECONDS_PER_TABLE of real
* time. This is an irrelevant quirk.
*
* @author Greg Hinkle
@@ -79,7 +79,7 @@ public class MeasurementDataManagerUtility {
private static NumberFormat nf = new DecimalFormat("00");
private static final long MILLISECONDS_PER_DAY = 1000L * 60 * 60 * 24;
- public static final long MILLESECONDS_PER_TABLE = MILLISECONDS_PER_DAY / TABLES_PER_DAY;
+ public static final long MILLISECONDS_PER_TABLE = MILLISECONDS_PER_DAY / TABLES_PER_DAY;
public static final long RAW_PURGE = STORED_DAYS * MILLISECONDS_PER_DAY;
@@ -304,7 +304,6 @@ public class MeasurementDataManagerUtility {
ResultSet rs = null;
try {
connection = datasource.getConnection();
- ;
String table = TABLE_PREFIX + nf.format(index);
String query = "SELECT d.time_stamp, d.value \n" + "FROM " + table + " d \n"
+ "WHERE d.schedule_id = ? \n" + "AND d.time_stamp = ( SELECT MAX(dd.time_stamp) \n" + "FROM "
@@ -506,10 +505,10 @@ public class MeasurementDataManagerUtility {
long day = now / MILLISECONDS_PER_DAY;
long timeOfDay = now - (day * MILLISECONDS_PER_DAY);
- long remaining = MILLESECONDS_PER_TABLE - timeOfDay;
+ long remaining = MILLISECONDS_PER_TABLE - timeOfDay;
long nextRotation = now + remaining;
if (nextRotation < now) {
- nextRotation += MILLESECONDS_PER_TABLE;
+ nextRotation += MILLISECONDS_PER_TABLE;
}
return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.FULL).format(new Date(nextRotation));
@@ -519,7 +518,7 @@ public class MeasurementDataManagerUtility {
long day = time / MILLISECONDS_PER_DAY;
long timeOfDay = time - (day * MILLISECONDS_PER_DAY);
- long table = ((day * TABLES_PER_DAY) + (timeOfDay / MILLESECONDS_PER_TABLE));
+ long table = ((day * TABLES_PER_DAY) + (timeOfDay / MILLISECONDS_PER_TABLE));
long tableIndex = (table % TABLE_COUNT);
return (int) tableIndex;
@@ -530,7 +529,7 @@ public class MeasurementDataManagerUtility {
int result;
try {
- result = Integer.valueOf(indexString).intValue();
+ result = Integer.valueOf(indexString);
} catch (NumberFormatException e) {
LOG.error("Invalid raw table name: " + tableName + ", returning table index 0.");
result = 0;
commit a5c92fa93669e2de24a6067a43116d0565d84632
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Jun 7 10:48:03 2011 -0400
initial cut at a Sahi-based GUI perf test suite
diff --git a/etc/guiperftests/pom.xml b/etc/guiperftests/pom.xml
new file mode 100644
index 0000000..ab81ed0
--- /dev/null
+++ b/etc/guiperftests/pom.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.rhq.guiperftest</groupId>
+ <artifactId>rhq-guiperftest</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>RHQ GUI Performance Tests</name>
+ <description>JunitPerf-based performance tests for the RHQ GUI, which test
+ that load times for various pages are acceptable (less than 10
+ seconds); the tests currently assume an RHQ Server with
+ inventoried Resources is running on localhost:7080</description>
+
+ <properties>
+ <!-- explictly specify a default encoding to avoid relying on the LANG env var being set correctly -->
+ <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.16</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junitperf</groupId>
+ <artifactId>junitperf</artifactId>
+ <version>1.9.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>net.sf</groupId>
+ <artifactId>sahi</artifactId>
+ <version>3.5</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+
+ <build>
+
+ <defaultGoal>test</defaultGoal>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <argLine>-Xms16M -Xmx256M</argLine>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+
+ <plugins>
+
+ <!-- Set the 'maven.version' property to the version of Maven being used,
+ so we can include the Maven version in the jar's MANIFEST.MF file. -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.5</version>
+ <executions>
+ <execution>
+ <phase>initialize</phase>
+ <goals>
+ <goal>maven-version</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.4.3</version>
+ <configuration>
+ <!-- As of v2.4 of this plugin, the default delimiters are @*@ -
+ we want the old default of ${*} instead. -->
+ <useDefaultDelimiters>false</useDefaultDelimiters>
+ <delimiters>
+ <delimiter>${*}</delimiter>
+ </delimiters>
+ </configuration>
+ </plugin>
+
+ <!-- Ensure all code compiles and runs on Java 6 or later. -->
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <!-- invocation options -->
+ <fork>true</fork>
+ <meminitial>64M</meminitial>
+ <maxmem>512M</maxmem>
+
+ <!-- compiler options -->
+ <source>1.6</source>
+ <target>1.6</target>
+ <optimize>false</optimize>
+ <verbose>true</verbose>
+ <compilerArgument>-Xlint</compilerArgument>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.3.1</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ </manifest>
+ <manifestEntries>
+ <Maven-Version>${maven.version}</Maven-Version>
+ <Java-Version>${java.version}</Java-Version>
+ <Java-Vendor>${java.vendor}</Java-Vendor>
+ <Os-Name>${os.name}</Os-Name>
+ <Os-Arch>${os.arch}</Os-Arch>
+ <Os-Version>${os.version}</Os-Version>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>1.0</version>
+ <executions>
+ <execution>
+ <id>enforce-versions</id>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <requireMavenVersion>
+ <version>2.0.10</version>
+ </requireMavenVersion>
+ <requireJavaVersion>
+ <version>[1.6,1.8)</version> <!-- 1.6.x, 1.7.x -->
+ </requireJavaVersion>
+ </rules>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <trimStackTrace>false</trimStackTrace>
+ </configuration>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+ <profiles>
+
+ <profile>
+ <id>test.debug</id>
+ <activation>
+ <property>
+ <name>test.debug</name>
+ </property>
+ </activation>
+
+ <properties>
+ <!-- See: http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#debu... -->
+ <maven.surefire.debug>-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8797,server=y,suspend=y</maven.surefire.debug>
+ </properties>
+ </profile>
+
+ </profiles>
+
+</project>
+
diff --git a/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java b/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java
new file mode 100644
index 0000000..9116089
--- /dev/null
+++ b/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestCase.java
@@ -0,0 +1,101 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.guiperftest;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import net.sf.sahi.client.Browser;
+
+import java.util.UUID;
+
+/**
+ * Performance tests for RHQ GUI.
+ *
+ * @author Ian Springer
+ */
+public class GuiPerfTestCase extends TestCase {
+
+ public GuiPerfTestCase(String name) {
+ super(name);
+ }
+
+ public void testCreateCompatibleGroup() throws InterruptedException {
+ Browser browser = GuiPerfTestSuite.getBrowser();
+
+ browser.link("Inventory").click();
+ browser.cell("Compatible Groups").click();
+ browser.cell("New").click();
+
+ String groupName = "group" + UUID.randomUUID();
+ browser.textbox("name").setValue(groupName);
+ browser.textarea("description").setValue("bleh");
+ browser.cell("Next").click();
+
+ browser.textbox("search").setValue("RHQ Agent");
+ browser.textbox("search").click();
+ browser.waitFor(500);
+ browser.div("RHQ Agent[1]").hover();
+ browser.waitFor(300);
+ browser.div("RHQ Agent[1]").click();
+ browser.image("right_Over.png").click();
+ browser.cell("Finish").click();
+ }
+
+ public void testCreateRole() throws InterruptedException {
+ Browser browser = GuiPerfTestSuite.getBrowser();
+
+ browser.link("Administration").click();
+ browser.cell("Roles").click();
+ browser.cell("New").click();
+
+ String roleName = "role" + UUID.randomUUID();
+ browser.textbox("name").setValue(roleName);
+ browser.textbox("description").setValue("bleh");
+ browser.image(0).near(browser.div("Manage Security")).click();
+ browser.image("unchecked.png").near(browser.div("Manage Security")).click();
+ browser.cell("Save").click();
+ }
+
+ public static Test suite() {
+ return new GuiPerfTestSuite(GuiPerfTestCase.class);
+ /*long maxElapsedTime = 10000;
+
+ TestSuite undecoratedSuite = new TestSuite(GuiPerfTestCase.class);
+ Enumeration undecoratedTests = undecoratedSuite.tests();
+ GuiPerfTestSuite timedSuite = new GuiPerfTestSuite();
+ while (undecoratedTests.hasMoreElements()) {
+ Test undecoratedTest = (Test) undecoratedTests.nextElement();
+ System.out.println("test: " + undecoratedTest);
+ TimedTest timedTest = new TimedTest(undecoratedTest, maxElapsedTime);
+ timedTest.setQuiet();
+ timedSuite.addTest(timedTest);
+ }
+
+ // Run the whole suite 10x concurrently.
+ LoadTest loadTest = new LoadTest(timedSuite, 10);
+ loadTest.setEnforceTestAtomicity(true);
+
+ return loadTest;*/
+ }
+
+ public static void main(String[] args) {
+ junit.textui.TestRunner.run(suite());
+ }
+
+}
diff --git a/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestSuite.java b/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestSuite.java
new file mode 100644
index 0000000..e2818e8
--- /dev/null
+++ b/etc/guiperftests/src/test/java/org/rhq/guiperftest/GuiPerfTestSuite.java
@@ -0,0 +1,80 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.guiperftest;
+
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+import net.sf.sahi.client.Browser;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author Ian Springer
+ */
+public class GuiPerfTestSuite extends TestSuite {
+
+ private static final ThreadLocal<Browser> BROWSERS = new ThreadLocal<Browser>();
+
+ private AtomicInteger threadCount = new AtomicInteger();
+
+ public GuiPerfTestSuite() {
+ SahiUtility.initSahi();
+ }
+
+ public GuiPerfTestSuite(Class<GuiPerfTestCase> testClass) {
+ super(testClass);
+
+ SahiUtility.initSahi();
+ }
+
+ @Override
+ public void run(TestResult result) {
+ Browser browser = BROWSERS.get();
+ if (browser == null) {
+ // Start at 1, so 0 is reserved for manual recording and testing.
+ int browserIndex = this.threadCount.incrementAndGet();
+ System.out.println("browserIndex=" + browserIndex);
+ browser = SahiUtility.createBrowser(browserIndex);
+ BROWSERS.set(browser);
+
+ login(browser);
+ }
+
+ super.run(result);
+
+ logout(browser);
+ browser.close();
+ }
+
+ public static Browser getBrowser() {
+ return BROWSERS.get();
+ }
+
+ private void login(Browser browser) {
+ browser.navigateTo("http://localhost:7080/");
+ browser.textbox("user").setValue("rhqadmin");
+ browser.password("password").setValue("rhqadmin");
+ browser.cell("Login").click();
+ }
+
+ private void logout(Browser browser) {
+ browser.link("Logout").click();
+ }
+
+}
diff --git a/etc/guiperftests/src/test/java/org/rhq/guiperftest/SahiUtility.java b/etc/guiperftests/src/test/java/org/rhq/guiperftest/SahiUtility.java
new file mode 100644
index 0000000..1068c0f
--- /dev/null
+++ b/etc/guiperftests/src/test/java/org/rhq/guiperftest/SahiUtility.java
@@ -0,0 +1,57 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.guiperftest;
+
+import net.sf.sahi.client.Browser;
+import net.sf.sahi.config.Configuration;
+
+/**
+ *
+ */
+public class SahiUtility {
+
+ private static final String SAHI_BASE = "/home/ips/Applications/sahi-3.5";
+ private static final String SAHI_USER_DATA = SAHI_BASE + "/userdata";
+
+ public static void initSahi() {
+ Configuration.initJava(SAHI_BASE, SAHI_USER_DATA);
+ }
+
+ public static Browser createBrowser(int profileIndex) {
+ System.out.println("Creating browser #" + profileIndex + "...");
+ String browserPath = "/usr/bin/firefox";
+ String browserProcessName = "firefox";
+ String firefoxProfile = "sahi" + profileIndex;
+
+ String browserOptions = "-profile " + SAHI_USER_DATA + "/browser/ff/profiles/" + firefoxProfile
+ + " -no-remote";
+ System.out.println("Browser options: " + browserOptions);
+ Browser browser = new Browser(browserPath, browserProcessName, browserOptions);
+ try {
+ browser.open();
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to connect to Sahi proxy - make sure Sahi dashboard is running - cause: "
+ + e);
+ }
+
+
+ return browser;
+ }
+
+}
commit 16ac412aa461a11a23ab929de499c9474aae4c02
Merge: 2f43118 4eb05eb
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jun 10 10:24:46 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
commit 4eb05eb36eb71f6ccf89e99dc6e8953d2224808d
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Fri Jun 10 09:23:37 2011 -0500
Fix for one more FK constraint violation for test runs.
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
index 67c37e2..1777489 100644
--- a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MetadataTest.xml
@@ -27,6 +27,7 @@
<rhq_availability/>
<rhq_measurement_sched/>
<rhq_package/>
+ <rhq_repo_content_src_map/>
<rhq_repo/>
<rhq_bundle/>
<rhq_plugin/>
commit 2f4311816c1acbb057e2c774984e9b58a8ef95a2
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 9 16:41:44 2011 -0400
BZ 644328 - add support to the jboss4 plugin so it supports bundle deployment to either
the install directory or the config set directory (e.g. the "default" directory)
diff --git a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
index 192c7f1..dd1d008 100644
--- a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
@@ -257,6 +257,17 @@
</configuration>
</content>
+ <bundle-target>
+ <destination-base-dir name="Install Directory">
+ <value-context>pluginConfiguration</value-context>
+ <value-name>jbossHomeDir</value-name>
+ </destination-base-dir>
+ <destination-base-dir name="Configuration Set Directory">
+ <value-context>pluginConfiguration</value-context>
+ <value-name>configurationPath</value-name>
+ </destination-base-dir>
+ </bundle-target>
+
<help>
<![CDATA[
<h3>Binding to IP addresses</h3>
commit 9b7363009b2b6d722be733f03bf7894aced195b9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 9 16:40:58 2011 -0400
BZ 644328 - fix the drop down selector
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index b4701a0..95f01fd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -124,6 +124,7 @@ public class GetDestinationStep extends AbstractWizardStep {
destBaseDirItem.setWidth(300);
destBaseDirItem.setRequired(true);
destBaseDirItem.setAllowEmptyValue(false);
+ destBaseDirItem.setMultiple(false);
destBaseDirItem.setDisabled(true);
destBaseDirItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
@@ -156,14 +157,14 @@ public class GetDestinationStep extends AbstractWizardStep {
selectedGroupId = (Integer) event.getValue();
}
+ // new group is, or is in the process of being, selected so forget what the base location was before
+ dest.setDestinationBaseDirectoryName(null);
+ destBaseDirItem.clearValue();
+
if (selectedGroupId != null) {
bundleServer.getResourceTypeBundleConfiguration(selectedGroupId.intValue(),
new AsyncCallback<ResourceTypeBundleConfiguration>() {
public void onSuccess(ResourceTypeBundleConfiguration result) {
- // new group selected, forget what the base location was before
- dest.setDestinationBaseDirectoryName(null);
- destBaseDirItem.clearValue();
-
// populate the base location drop down with all the possible dest base directories
String[] menuItems = null;
if (result != null) {
@@ -176,7 +177,8 @@ public class GetDestinationStep extends AbstractWizardStep {
menuItems[i++] = baseDir.getName();
}
Arrays.sort(menuItems); // just so they are ordered in the drop down list
- destBaseDirItem.setValues(menuItems);
+ destBaseDirItem.setValueMap(menuItems);
+ destBaseDirItem.setValue(menuItems[0]);
dest.setDestinationBaseDirectoryName(menuItems[0]);
}
}
@@ -185,11 +187,13 @@ public class GetDestinationStep extends AbstractWizardStep {
}
public void onFailure(Throwable caught) {
- dest.setDestinationBaseDirectoryName(null);
+ destBaseDirItem.setDisabled(true);
CoreGUI.getErrorHandler().handleError(
MSG.view_bundle_deployWizard_error_noBundleConfig(), caught);
}
});
+ } else {
+ destBaseDirItem.setDisabled(true);
}
}
});
commit 0067ddf223fb3a5a4fd6a28bcad3b2c46ade773d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 9 14:06:16 2011 -0400
BZ 644328 - from the GWT bundle deploy wizard, be able to select any
compatible group whose type can support bundle deployment
and be able to select one of the type's available bundle
destination base locations.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
index 6f99a24..144a71d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
@@ -60,6 +60,7 @@ public class ResourceGroupCriteria extends TaggedCriteria {
private Boolean filterPrivate; /* if true, show only private groups for the calling user */
private Boolean filterVisible = true; /* only show visible groups by default */
private List<Integer> filterIds; // requires overrides
+ private NonBindingOverrideFilter filterBundleTargetableOnly; // requires overrides - finds only those that have bundle config - that is, can be targeted for bundle deployment
private boolean fetchExplicitResources;
private boolean fetchImplicitResources;
@@ -116,6 +117,7 @@ public class ResourceGroupCriteria extends TaggedCriteria {
+ " WHERE resourcegroup.id = explicitGroup.id AND NOT res.resourceType.name = ? )");
filterOverrides.put("groupDefinitionId", "groupDefinition.id = ?");
filterOverrides.put("ids", "id IN ( ? )");
+ filterOverrides.put("bundleTargetableOnly", "resourceType.bundleConfiguration IS NOT NULL");
sortOverrides.put("resourceTypeName", "resourceType.name");
sortOverrides.put("pluginName", "resourceType.plugin");
@@ -238,6 +240,20 @@ public class ResourceGroupCriteria extends TaggedCriteria {
this.filterIds = CriteriaUtils.getListIgnoringNulls(filterIds);
}
+ /**
+ * If true is passed in, only those groups that can be targeted for bundle deployments will
+ * be fetched. By definition, this means no mixed groups are ever fetched and only
+ * compatible groups with resource types that support bundle deployments are fetched.
+ * Technically, what this means is only those compatible groups whose
+ * resource types have non-null bundle configurations are fetched.
+ *
+ * @param filterBundleTargetableOnly
+ */
+ public void addFilterBundleTargetableOnly(boolean filterBundleTargetableOnly) {
+ this.filterBundleTargetableOnly = (filterBundleTargetableOnly ? NonBindingOverrideFilter.ON
+ : NonBindingOverrideFilter.OFF);
+ }
+
public void fetchExplicitResources(boolean fetchExplicitResources) {
this.fetchExplicitResources = fetchExplicitResources;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index 288be78..efb55e4 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@ -81,6 +81,7 @@ import org.rhq.core.domain.util.Summary;
@Table(name = ResourceType.TABLE_NAME)
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_RESOURCE_TYPE_ID_SEQ")
@NamedQueries( {
+ @NamedQuery(name = ResourceType.QUERY_GET_BUNDLE_CONFIG_BY_GROUP_ID, query = "SELECT rg.resourceType.bundleConfiguration FROM ResourceGroup rg WHERE rg.id = :groupId"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_PLUGIN, query = "SELECT rt FROM ResourceType AS rt "
+ "WHERE rt.plugin = :plugin AND rt.deleted = false"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_NAME_AND_PLUGIN, // TODO: QUERY: names are case-sensitive
@@ -248,6 +249,7 @@ public class ResourceType implements Serializable, Comparable<ResourceType> {
public static final ResourceType ANY_PLATFORM_TYPE = null;
+ public static final String QUERY_GET_BUNDLE_CONFIG_BY_GROUP_ID = "ResourceType.getBundleConfigByGroupResourceType";
public static final String QUERY_GET_EXPLICIT_RESOURCE_TYPE_COUNTS_BY_GROUP = "ResourceType.getExplicitResourceTypeCountsByGroup";
public static final String QUERY_GET_IMPLICIT_RESOURCE_TYPE_COUNTS_BY_GROUP = "ResourceType.getImplicitResourceTypeCountsByGroup";
public static final String QUERY_FIND_BY_NAME_AND_PLUGIN = "ResourceType.findByNameAndPlugin";
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index 4a7b5ac..b4701a0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -18,10 +18,14 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
+import java.util.Arrays;
+import java.util.Set;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
@@ -31,8 +35,10 @@ import com.smartgwt.client.widgets.form.validator.Validator;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.BundleDestination;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.bundle.deploy.selection.SinglePlatformResourceGroupSelector;
+import org.rhq.enterprise.gui.coregui.client.bundle.deploy.selection.SingleCompatibleResourceGroupSelector;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
@@ -48,7 +54,7 @@ public class GetDestinationStep extends AbstractWizardStep {
private final BundleDeployWizard wizard;
private VLayout form;
DynamicForm valForm = new LocatableDynamicForm("GetDestinationStepValForm");
- private SinglePlatformResourceGroupSelector selector;
+ private SingleCompatibleResourceGroupSelector selector;
private BundleDestination dest = new BundleDestination();
private boolean createInProgress = false;
@@ -113,14 +119,83 @@ public class GetDestinationStep extends AbstractWizardStep {
}
});
- this.selector = new SinglePlatformResourceGroupSelector("group", MSG.common_title_resource_group());
+ final SelectItem destBaseDirItem = new SelectItem("destBaseDir", MSG
+ .view_bundle_deployWizard_getDest_destBaseDirName());
+ destBaseDirItem.setWidth(300);
+ destBaseDirItem.setRequired(true);
+ destBaseDirItem.setAllowEmptyValue(false);
+ destBaseDirItem.setDisabled(true);
+ destBaseDirItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ Object value = event.getValue();
+ if (value != null && value.toString().length() > 0) {
+ dest.setDestinationBaseDirectoryName(value.toString());
+ } else {
+ dest.setDestinationBaseDirectoryName(null);
+ }
+ }
+ });
+
+ this.selector = new SingleCompatibleResourceGroupSelector("group", MSG.common_title_resource_group());
this.selector.setWidth(300);
this.selector.setRequired(true);
Validator validator = new IsIntegerValidator();
validator.setErrorMessage(MSG.view_bundle_deployWizard_error_8());
this.selector.setValidators(validator);
+ this.selector.addChangedHandler(new ChangedHandler() {
+ @Override
+ public void onChanged(ChangedEvent event) {
+ Integer selectedGroupId = null;
+
+ // if the user is typing in the name of the group, and is only partially
+ // done, the event value will be the String of the partial group name.
+ // If the selection is an actual group name, the event value will be
+ // an integer (the group ID) and that is our indication that the selection
+ // of an actual group has been made
+ if (event.getValue() instanceof Integer) {
+ selectedGroupId = (Integer) event.getValue();
+ }
+
+ if (selectedGroupId != null) {
+ bundleServer.getResourceTypeBundleConfiguration(selectedGroupId.intValue(),
+ new AsyncCallback<ResourceTypeBundleConfiguration>() {
+ public void onSuccess(ResourceTypeBundleConfiguration result) {
+ // new group selected, forget what the base location was before
+ dest.setDestinationBaseDirectoryName(null);
+ destBaseDirItem.clearValue();
+
+ // populate the base location drop down with all the possible dest base directories
+ String[] menuItems = null;
+ if (result != null) {
+ Set<BundleDestinationBaseDirectory> baseDirs;
+ baseDirs = result.getBundleDestinationBaseDirectory();
+ if (baseDirs != null && baseDirs.size() > 0) {
+ menuItems = new String[baseDirs.size()];
+ int i = 0;
+ for (BundleDestinationBaseDirectory baseDir : baseDirs) {
+ menuItems[i++] = baseDir.getName();
+ }
+ Arrays.sort(menuItems); // just so they are ordered in the drop down list
+ destBaseDirItem.setValues(menuItems);
+ dest.setDestinationBaseDirectoryName(menuItems[0]);
+ }
+ }
+
+ destBaseDirItem.setDisabled(menuItems == null);
+ }
+
+ public void onFailure(Throwable caught) {
+ dest.setDestinationBaseDirectoryName(null);
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_bundle_deployWizard_error_noBundleConfig(), caught);
+ }
+ });
+ }
+ }
+ });
- this.valForm.setItems(nameTextItem, descriptionTextAreaItem, deployDirTextItem, selector);
+ this.valForm.setItems(nameTextItem, descriptionTextAreaItem, this.selector, destBaseDirItem,
+ deployDirTextItem);
CanvasItem ci1 = new CanvasItem();
ci1.setShowTitle(false);
ci1.setCanvas(valForm);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java
new file mode 100644
index 0000000..38ac90b
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java
@@ -0,0 +1,63 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.deploy.selection;
+
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.types.TextMatchStyle;
+import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
+import com.smartgwt.client.widgets.grid.ListGridField;
+
+import org.rhq.core.domain.criteria.ResourceGroupCriteria;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
+
+public class SingleCompatibleResourceGroupSelector extends ComboBoxItem {
+
+ public SingleCompatibleResourceGroupSelector(String name, String title) {
+ super(name, title);
+
+ ListGridField nameField = new ListGridField("name");
+ ListGridField descriptionField = new ListGridField("description");
+
+ setOptionDataSource(new CompatibleResourceGroupsDataSource());
+
+ setWidth(240);
+ setTitle(CoreGUI.getMessages().common_title_resource_group());
+
+ setValueField("id");
+ setDisplayField("name");
+ setPickListWidth(450);
+ setPickListFields(nameField, descriptionField);
+ setTextMatchStyle(TextMatchStyle.SUBSTRING);
+ }
+
+ protected class CompatibleResourceGroupsDataSource extends ResourceGroupsDataSource {
+
+ @Override
+ protected ResourceGroupCriteria getFetchCriteria(final DSRequest request) {
+ ResourceGroupCriteria result = super.getFetchCriteria(request);
+ result.addFilterBundleTargetableOnly(true);
+ return result;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index 79166ba..ed820ad 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -30,6 +30,7 @@ import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.BundleCriteria;
@@ -42,6 +43,8 @@ import org.rhq.core.domain.util.PageList;
public interface BundleGWTService extends RemoteService {
+ ResourceTypeBundleConfiguration getResourceTypeBundleConfiguration(int compatGroupId) throws RuntimeException;
+
BundleVersion createBundleVersion(int bundleId, String name, String version, String recipe) throws RuntimeException;
BundleVersion createBundleVersionViaURL(String url) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java
index 10daf03..08128de 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java
@@ -141,7 +141,8 @@ public class SingleGroupDefinitionView extends LocatableVLayout implements Bookm
form.setDataSource(GroupDefinitionDataSource.getInstance());
form.setHiliteRequiredFields(true);
form.setRequiredTitleSuffix(" <span style=\"color: red;\">* </span>:");
- DSOperationType saveOperationType = (groupDefinition.getId() == 0) ? DSOperationType.ADD : DSOperationType.UPDATE;
+ DSOperationType saveOperationType = (groupDefinition.getId() == 0) ? DSOperationType.ADD
+ : DSOperationType.UPDATE;
form.setSaveOperationType(saveOperationType);
final DynaGroupChildrenView dynaGroupChildrenView = new DynaGroupChildrenView(extendLocatorId("DynaGroups"),
@@ -200,7 +201,7 @@ public class SingleGroupDefinitionView extends LocatableVLayout implements Bookm
} else {
Record newRecord = results[0];
GroupDefinition newGroupDefinition = GroupDefinitionDataSource.getInstance().copyValues(
- newRecord);
+ newRecord);
if (recalc) {
recalculate(dynaGroupChildrenView, newGroupDefinition.getId());
}
@@ -350,8 +351,7 @@ public class SingleGroupDefinitionView extends LocatableVLayout implements Bookm
templateSelectorTitleSpacer.setColSpan(1);
templateSelectorTitleSpacer.setEndRow(false);
- // TODO: i18n title
- templateSelector = new SelectItem("templateSelector", "Saved Expression");
+ templateSelector = new SelectItem("templateSelector", MSG.view_dynagroup_exprBuilder_savedExpression());
templateStrings = getTemplates();
templateSelector.setValueMap(templateStrings.keySet().toArray(new String[templateStrings.size()]));
templateSelector.setAllowEmptyValue(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 3d9c312..883f0fb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -28,6 +28,7 @@ import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.BundleCriteria;
@@ -37,7 +38,6 @@ import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleResourceDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.bundle.BundleManagerLocal;
@@ -48,6 +48,19 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
private BundleManagerLocal bundleManager = LookupUtil.getBundleManager();
+ @Override
+ public ResourceTypeBundleConfiguration getResourceTypeBundleConfiguration(int compatGroupId)
+ throws RuntimeException {
+ try {
+ ResourceTypeBundleConfiguration results = bundleManager.getResourceTypeBundleConfiguration(
+ getSessionSubject(), compatGroupId);
+ return SerialUtility.prepare(results, "getResourceTypeBundleConfiguration");
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
public BundleVersion createBundleVersionViaURL(String url) throws RuntimeException {
try {
BundleVersion results = bundleManager.createBundleVersionViaURL(getSessionSubject(), url);
@@ -57,6 +70,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public BundleVersion createBundleVersionViaRecipe(String recipe) throws RuntimeException {
try {
BundleVersion results = bundleManager.createBundleVersionViaRecipe(getSessionSubject(), recipe);
@@ -66,6 +80,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public BundleDeployment createBundleDeployment(int bundleVersionId, int bundleDestinationId, String description,
Configuration configuration, boolean enforcePolicy, int enforcementInterval, boolean pinToBundle)
throws RuntimeException {
@@ -79,6 +94,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public BundleDestination createBundleDestination(int bundleId, String name, String description, String deployDir,
int groupId) throws RuntimeException {
@@ -91,6 +107,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public BundleVersion createBundleVersion(int bundleId, String name, String version, String recipe)
throws RuntimeException {
try {
@@ -102,6 +119,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public void deleteBundles(int[] bundleIds) throws RuntimeException {
try {
bundleManager.deleteBundles(getSessionSubject(), bundleIds);
@@ -110,6 +128,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public void deleteBundle(int bundleId) throws RuntimeException {
try {
bundleManager.deleteBundle(getSessionSubject(), bundleId);
@@ -118,6 +137,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public void deleteBundleDeployment(int bundleDeploymentId) throws RuntimeException {
try {
bundleManager.deleteBundleDeployment(getSessionSubject(), bundleDeploymentId);
@@ -126,6 +146,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public void deleteBundleDestination(int bundleDestinationId) throws RuntimeException {
try {
bundleManager.deleteBundleDestination(getSessionSubject(), bundleDestinationId);
@@ -134,6 +155,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public void deleteBundleVersion(int bundleVersionId, boolean deleteBundleIfEmpty) throws RuntimeException {
try {
bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId, deleteBundleIfEmpty);
@@ -142,6 +164,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public ArrayList<BundleType> getAllBundleTypes() throws RuntimeException {
try {
ArrayList<BundleType> bundleTypes = new ArrayList<BundleType>();
@@ -152,6 +175,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public HashMap<String, Boolean> getAllBundleVersionFilenames(int bundleVersionId) throws RuntimeException {
HashMap<String, Boolean> results = new HashMap<String, Boolean>();
try {
@@ -162,6 +186,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public String getBundleDeploymentName(int bundleDestinationId, int bundleVersionId, int prevDeploymentId)
throws RuntimeException {
String result;
@@ -174,6 +199,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public BundleDeployment scheduleBundleDeployment(int bundleDeploymentId, boolean isCleanDeployment)
throws RuntimeException {
try {
@@ -185,6 +211,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public BundleDeployment scheduleRevertBundleDeployment(int bundleDeploymentId, String deploymentDescription,
boolean isCleanDeployment) throws RuntimeException {
try {
@@ -196,6 +223,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws RuntimeException {
try {
PageList<Bundle> results = bundleManager.findBundlesByCriteria(getSessionSubject(), criteria);
@@ -205,6 +233,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<BundleDeployment> findBundleDeploymentsByCriteria(BundleDeploymentCriteria criteria)
throws RuntimeException {
try {
@@ -216,6 +245,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<BundleDestination> findBundleDestinationsByCriteria(BundleDestinationCriteria criteria)
throws RuntimeException {
try {
@@ -227,6 +257,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<BundleFile> findBundleFilesByCriteria(BundleFileCriteria criteria) throws RuntimeException {
try {
PageList<BundleFile> result = bundleManager.findBundleFilesByCriteria(getSessionSubject(), criteria);
@@ -236,6 +267,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<BundleResourceDeployment> findBundleResourceDeploymentsByCriteria(
BundleResourceDeploymentCriteria criteria) throws RuntimeException {
try {
@@ -247,6 +279,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) throws RuntimeException {
try {
PageList<BundleVersion> results = bundleManager.findBundleVersionsByCriteria(getSessionSubject(), criteria);
@@ -256,6 +289,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public PageList<BundleWithLatestVersionComposite> findBundlesWithLatestVersionCompositesByCriteria(
BundleCriteria criteria) throws RuntimeException {
try {
@@ -267,6 +301,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ @Override
public void purgeBundleDestination(int bundleDestinationId) throws RuntimeException {
try {
bundleManager.purgeBundleDestination(getSessionSubject(), bundleDestinationId);
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index d62e049..1178cea 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -913,11 +913,13 @@ view_bundle_deployWizard_error_6 = Failed to create deployment: {0}
view_bundle_deployWizard_error_7 = Failed to get deployment name.
view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
+view_bundle_deployWizard_error_noBundleConfig = Failed to obtain bundle target information. Is the group you selected a valid compatible group that can be targeted for bundle deployments?
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = New Destination
view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description
+view_bundle_deployWizard_getDest_destBaseDirName = Base Location
view_bundle_deployWizard_getDest_name = Destination Name
view_bundle_deployWizard_getInfoStep = Provide Deployment Information
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
@@ -1150,6 +1152,7 @@ view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparen
view_dynagroup_exprBuilder_resource_parent = Parent
view_dynagroup_exprBuilder_resource_resource = Resource
view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
+view_dynagroup_exprBuilder_savedExpression = Saved Expression
view_dynagroup_exprBuilder_title = Expression Builder
view_dynagroup_exprBuilder_unset = Unset
view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 30def7c..938cfd9 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -776,11 +776,13 @@ view_bundle_deployWizard_error_6 = Failed to create deployment: {0}~
view_bundle_deployWizard_error_7 = Failed to get deployment name.~
view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down~
view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage~
+##view_bundle_deployWizard_error_noBundleConfig = Failed to obtain bundle target information. Is the group you selected a valid compatible group that can be targeted for bundle deployments?
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.~
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
view_bundle_deployWizard_getDestStep = New Destination~
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description~
+##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
view_bundle_deployWizard_getDest_name = Destination Name~
view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)~
@@ -935,6 +937,7 @@ view_dynagroup_definitions = DynaGroup-Definitionen
view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions~
view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions~
view_dynagroup_editing = Editing [{0}]~
+##view_dynagroup_exprBuilder_savedExpression = Saved Expression
view_dynagroup_expression = Ausdruck
view_dynagroup_expressionSet = Expression Set~
view_dynagroup_lastCalculationTime = Zeitpunkt letzte Berechnung
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 837d613..919e18f 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -914,11 +914,13 @@ view_bundle_deployWizard_error_6 = Failed to create deployment: {0}
view_bundle_deployWizard_error_7 = Failed to get deployment name.
view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
+##view_bundle_deployWizard_error_noBundleConfig = Failed to obtain bundle target information. Is the group you selected a valid compatible group that can be targeted for bundle deployments?
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = New Destination
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description
+##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
view_bundle_deployWizard_getDest_name = Destination Name
view_bundle_deployWizard_getInfoStep = Provide Deployment Information
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
@@ -1151,6 +1153,7 @@ view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparen
view_dynagroup_exprBuilder_resource_parent = Parent
view_dynagroup_exprBuilder_resource_resource = Resource
view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
+##view_dynagroup_exprBuilder_savedExpression = Saved Expression
view_dynagroup_exprBuilder_title = Expression Builder
view_dynagroup_exprBuilder_unset = Unset
view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 8313b56..1a5974f 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -931,11 +931,13 @@ view_bundle_deployWizard_error_6 = Failed to create deployment: {0}~
view_bundle_deployWizard_error_7 = Failed to get deployment name.~
view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down~
view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage:~
+##view_bundle_deployWizard_error_noBundleConfig = Failed to obtain bundle target information. Is the group you selected a valid compatible group that can be targeted for bundle deployments?
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.~
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
view_bundle_deployWizard_getDestStep = New Destination~
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description~
+##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
view_bundle_deployWizard_getDest_name = Destination Name~
view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)~
@@ -1174,6 +1176,7 @@ view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparen
view_dynagroup_exprBuilder_resource_parent = Parent
view_dynagroup_exprBuilder_resource_resource = Resource
view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
+##view_dynagroup_exprBuilder_savedExpression = Saved Expression
view_dynagroup_exprBuilder_title = Expression Builder
view_dynagroup_exprBuilder_unset = Unset
view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the " = " operator because of how databases store and query data.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index f488ffc..5902fb6 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -913,11 +913,13 @@ view_bundle_deployWizard_error_6 = \u521B\u5EFA\u53D1\u5E03\u5931\u8D25: {0}
view_bundle_deployWizard_error_7 = Failed to get deployment name.
view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
+##view_bundle_deployWizard_error_noBundleConfig = Failed to obtain bundle target information. Is the group you selected a valid compatible group that can be targeted for bundle deployments?
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = \u65B0\u5EFA\u76EE\u7684\u5730
##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = \u76EE\u7684\u5730\u63CF\u8FF0
+##view_bundle_deployWizard_getDest_destBaseDirName = Base Location
view_bundle_deployWizard_getDest_name = \u76EE\u7684\u5730\u540D
view_bundle_deployWizard_getInfoStep = \u63D0\u4F9B\u53D1\u5E03\u4FE1\u606F
view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
@@ -1150,6 +1152,7 @@ view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparen
view_dynagroup_exprBuilder_resource_parent = Parent
view_dynagroup_exprBuilder_resource_resource = Resource
view_dynagroup_exprBuilder_resource_tooltip = \u9009\u62E9\u8981\u67E5\u8BE2\u8D44\u6E90\u6240\u5728\u7684\u5C42\u7EA7. \u4F8B\u5982, \u9009\u4E2D "parent"\u4F1A\u67E5\u8BE2\u51FA\u7236\u8D44\u6E90\u7684\u6EE1\u8DB3\u5269\u4F59\u8868\u8FBE\u5F0F\u7684\u8D44\u6E90.
+##view_dynagroup_exprBuilder_savedExpression = Saved Expression
view_dynagroup_exprBuilder_title = \u8868\u8FBE\u5F0F\u7F16\u8BD1
view_dynagroup_exprBuilder_unset = \u6062\u590D\u8BBE\u7F6E
view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 5738c64..774cd88 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -37,6 +37,7 @@ import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
+import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
@@ -61,6 +62,7 @@ import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
@@ -147,6 +149,34 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
private ResourceGroupManagerLocal resourceGroupManager;
@Override
+ public ResourceTypeBundleConfiguration getResourceTypeBundleConfiguration(Subject subject, int compatGroupId)
+ throws Exception {
+
+ // Even though its harmless to return metadata (bundle config) about a resource type, we are getting that through
+ // a relationship from a resource group. To prevent someone from probing the inventory to see which groups
+ // are types that support bundles, we only allow someone to traverse the relationship from group to type
+ // if that someone has access to the group.
+ if (authorizationManager.canViewGroup(subject, compatGroupId)) {
+ Query q = entityManager.createNamedQuery(ResourceType.QUERY_GET_BUNDLE_CONFIG_BY_GROUP_ID);
+ q.setParameter("groupId", compatGroupId);
+ ResourceTypeBundleConfiguration bundleConfig = null;
+ try {
+ Configuration config = (Configuration) q.getSingleResult();
+ if (config != null) {
+ bundleConfig = new ResourceTypeBundleConfiguration(config);
+ }
+ } catch (EntityNotFoundException enfe) {
+ // ignore this - this is just a group that isn't a compatible group
+ // or it is, but its type cannot be a target for bundle deployments
+ }
+
+ return bundleConfig;
+ } else {
+ throw new Exception("[" + subject.getName() + "] is not authorized to access the group");
+ }
+ }
+
+ @Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@RequiredPermission(Permission.MANAGE_BUNDLE)
public BundleResourceDeploymentHistory addBundleResourceDeploymentHistory(Subject subject, int bundleDeploymentId,
@@ -1326,7 +1356,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
BundleResourceDeploymentCriteria criteria) {
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
- ;
+
if (!authorizationManager.isInventoryManager(subject)) {
if (criteria.isInventoryManagerRequired()) {
// TODO: MANAGE_INVENTORY was too restrictive as a bundle manager could not then
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 231d4c3..6bfa7e4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -37,6 +37,7 @@ import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.content.Architecture;
@@ -61,6 +62,21 @@ import org.rhq.enterprise.server.system.ServerVersion;
public interface BundleManagerRemote {
/**
+ * Given the ID for a compatible group, this will return the bundle configuration metadata for that group's resource type.
+ * User interfaces will need to use this method in order to find out if a) the group can be a target for a bundle deployment
+ * and/or b) what different destination base locations are supported by the group.
+ *
+ * @param subject the user making the request
+ * @param compatGroupId the ID for a compatible group whose type's bundle config is to be returned
+ * @return the bundle configuration for the group's resource type
+ * @throws Exception
+ */
+ @WebMethod
+ ResourceTypeBundleConfiguration getResourceTypeBundleConfiguration( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "compatGroupId") int compatGroupId) throws Exception;
+
+ /**
* Adds a BundleFile to the BundleVersion and implicitly creates the backing PackageVersion. If the PackageVersion
* already exists use {@link addBundleFile(Subject, int, String, int, boolean)}
*
@@ -73,6 +89,7 @@ public interface BundleManagerRemote {
* @return the new BundleFile
* @throws Exception
*/
+
@WebMethod
BundleFile addBundleFile( //
@WebParam(name = "subject") Subject subject, //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 3ee8cc0..fd3bb91 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -47,6 +47,7 @@ import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.common.ProductInfo;
@@ -269,6 +270,12 @@ public class WebservicesManagerBean implements WebservicesRemote {
//BUNDLEMANAGER: BEGIN ------------------------------------------
+ @Override
+ public ResourceTypeBundleConfiguration getResourceTypeBundleConfiguration(Subject subject, int compatGroupId)
+ throws Exception {
+ return bundleManager.getResourceTypeBundleConfiguration(subject, compatGroupId);
+ }
+
public BundleFile addBundleFile(Subject subject, int bundleVersionId, String name, String version,
Architecture architecture, InputStream fileStream) throws Exception {
return bundleManager.addBundleFile(subject, bundleVersionId, name, version, architecture, fileStream);
commit a86e99ac6f679f3eacf9c59af069a681356fa29e
Merge: 60ba20a a6d2d56
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Jun 8 11:21:49 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
commit 60ba20a7d4391f5de003073b15af01d486b02030
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jun 7 17:52:23 2011 -0400
BZ 644328 - add new attribute to BundleDestination domain object. It now knows which base directory name the user selected to deploy bundles to.
this upgrades the existing database data to use the platform "Root File System" base dir name since all bundles up to this point
have been deployed to that base location.
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index c4c6a6a..e5994fe 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.108</db.schema.version>
+ <db.schema.version>2.109</db.schema.version>
</properties>
<dependencies>
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index 8cd2711..3ade2e9 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -548,6 +548,7 @@
<column name="BUNDLE_ID" type="INTEGER" required="true" references="RHQ_BUNDLE"/>
<column name="GROUP_ID" type="INTEGER" required="true" references="RHQ_RESOURCE_GROUP"/>
<column name="DEPLOY_DIR" size="256" type="VARCHAR2" required="true"/>
+ <column name="DEST_BASE_DIR_NAME" size="200" type="VARCHAR2" required="true"/>
<!-- This index is for constraint, not performance -->
<index name="RHQ_BUNDLE_DESTINATION_UNIQUE" unique="true">
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index c7aa1a6..bbaa066 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3390,6 +3390,7 @@
<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>
@@ -3402,6 +3403,17 @@
</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>
+
</dbupgrade>
</target>
</project>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java
index dc730c7..7603d78 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDestination.java
@@ -79,9 +79,12 @@ public class BundleDestination implements Serializable {
@Column(name = "DESCRIPTION", nullable = true)
private String description;
- @Column(name = "DEPLOY_DIR", nullable = true)
+ @Column(name = "DEPLOY_DIR", nullable = false)
private String deployDir;
+ @Column(name = "DEST_BASE_DIR_NAME", nullable = false)
+ private String destinationBaseDirectoryName;
+
@Column(name = "CTIME")
private Long ctime = System.currentTimeMillis();
@@ -145,6 +148,26 @@ public class BundleDestination implements Serializable {
this.deployDir = deployDir;
}
+ /**
+ * All resource types that can be targets for bundle deployments define one or more
+ * destination base directories. These are given names in the type's plugin descriptor.
+ * This method returns the name of the destination base directory where all bundles
+ * will be destined to be deployed on all resources found in the destination group.
+ *
+ * @return name of the destination base directory - this isn't an actual directory location
+ * (it can't be because it will be different on all individual machines where the bundles
+ * will be deployed), it is the name of the destination location as defined in
+ * the plugin descriptor for the type of resources where the bundle is to be deployed
+ * (i.e. it is the type of the compatible group associated with this destination).
+ */
+ public String getDestinationBaseDirectoryName() {
+ return destinationBaseDirectoryName;
+ }
+
+ public void setDestinationBaseDirectoryName(String destinationBaseDirectoryName) {
+ this.destinationBaseDirectoryName = destinationBaseDirectoryName;
+ }
+
public long getCtime() {
return this.ctime;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationDataSource.java
index 0dab73f..28d64b6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationDataSource.java
@@ -57,6 +57,7 @@ public class BundleDestinationDataSource extends RPCDataSource<BundleDestination
public static final String FIELD_GROUP_ID = "groupId";
public static final String FIELD_GROUP_NAME = "groupName";
public static final String FIELD_DEPLOY_DIR = "deployDir";
+ public static final String FIELD_BASE_DIR_NAME = "baseDirName";
public static final String FIELD_LATEST_DEPLOY_VERSION = "latestDeploymentVersion";
public static final String FIELD_LATEST_DEPLOY_DATE = "latestDeploymentDate";
public static final String FIELD_LATEST_DEPLOY_STATUS = "latestDeploymentStatus";
@@ -88,6 +89,10 @@ public class BundleDestinationDataSource extends RPCDataSource<BundleDestination
DataSourceTextField group = new DataSourceTextField(FIELD_GROUP_NAME, MSG.view_bundle_dest_group());
fields.add(group);
+ DataSourceTextField baseDirName = new DataSourceTextField(FIELD_BASE_DIR_NAME, MSG
+ .view_bundle_dest_baseDirName());
+ fields.add(baseDirName);
+
DataSourceTextField deployDir = new DataSourceTextField(FIELD_DEPLOY_DIR, MSG.view_bundle_dest_deployDir());
fields.add(deployDir);
@@ -204,6 +209,7 @@ public class BundleDestinationDataSource extends RPCDataSource<BundleDestination
record.setAttribute(FIELD_BUNDLE_NAME, from.getBundle().getName());
record.setAttribute(FIELD_GROUP_ID, from.getGroup().getId());
record.setAttribute(FIELD_GROUP_NAME, from.getGroup().getName());
+ record.setAttribute(FIELD_BASE_DIR_NAME, from.getDestinationBaseDirectoryName());
record.setAttribute(FIELD_DEPLOY_DIR, from.getDeployDir());
record.setAttribute("object", from);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationListView.java
index bbd20f6..6e3d4cd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationListView.java
@@ -65,6 +65,8 @@ public class BundleDestinationListView extends Table<BundleDestinationDataSource
.view_bundle_bundle());
ListGridField groupNameField = new ListGridField(BundleDestinationDataSource.FIELD_GROUP_NAME, MSG
.view_bundle_dest_group());
+ ListGridField baseDirNameField = new ListGridField(BundleDestinationDataSource.FIELD_BASE_DIR_NAME, MSG
+ .view_bundle_dest_baseDirName());
ListGridField deployDirField = new ListGridField(BundleDestinationDataSource.FIELD_DEPLOY_DIR, MSG
.view_bundle_dest_deployDir());
ListGridField latestDeploymentVersionField = new ListGridField(
@@ -82,7 +84,7 @@ public class BundleDestinationListView extends Table<BundleDestinationDataSource
Integer bundleId = listGridRecord.getAttributeAsInt(BundleDestinationDataSource.FIELD_BUNDLE_ID);
Integer bundleDestId = listGridRecord.getAttributeAsInt(BundleDestinationDataSource.FIELD_ID);
return "<a href=\"" + LinkManager.getBundleDestinationLink(bundleId, bundleDestId) + "\">"
- + StringUtility.escapeHtml(value.toString()) + "</a>";
+ + StringUtility.escapeHtml(value.toString()) + "</a>";
}
});
@@ -90,7 +92,7 @@ public class BundleDestinationListView extends Table<BundleDestinationDataSource
public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
Integer groupId = listGridRecord.getAttributeAsInt(BundleDestinationDataSource.FIELD_GROUP_ID);
return "<a href=\"" + LinkManager.getResourceGroupLink(groupId) + "\">"
- + StringUtility.escapeHtml(value.toString()) + "</a>";
+ + StringUtility.escapeHtml(value.toString()) + "</a>";
}
});
@@ -98,7 +100,7 @@ public class BundleDestinationListView extends Table<BundleDestinationDataSource
public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
Integer bid = listGridRecord.getAttributeAsInt(BundleDestinationDataSource.FIELD_BUNDLE_ID);
return "<a href=\"" + LinkManager.getBundleLink(bid) + "\">"
- + StringUtility.escapeHtml(value.toString()) + "</a>";
+ + StringUtility.escapeHtml(value.toString()) + "</a>";
}
});
@@ -114,18 +116,19 @@ public class BundleDestinationListView extends Table<BundleDestinationDataSource
latestDeploymentStatusField.setShowValueIconOnly(true);
idField.setWidth(50);
- nameField.setWidth("20%");
- descriptionField.setWidth("25%");
+ nameField.setWidth("15%");
+ descriptionField.setWidth("20%");
bundleNameField.setHidden(true);
groupNameField.setWidth("15%");
- deployDirField.setWidth("20%");
+ baseDirNameField.setWidth("15%");
+ deployDirField.setWidth("15%");
latestDeploymentVersionField.setWidth("10%");
latestDeploymentDateField.setWidth("10%");
latestDeploymentStatusField.setWidth(80);
// XXX there seems to be a bug here - i want to hide the bundle column, but setHidden(true) causes the entire rendering to fail
- setListGridFields(idField, nameField, descriptionField, /*bundleNameField, */groupNameField, deployDirField,
- latestDeploymentVersionField, latestDeploymentDateField, latestDeploymentStatusField);
+ setListGridFields(idField, nameField, descriptionField, /*bundleNameField, */groupNameField, baseDirNameField,
+ deployDirField, latestDeploymentVersionField, latestDeploymentDateField, latestDeploymentStatusField);
setListGridDoubleClickHandler(new DoubleClickHandler() {
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
index 0a805e0..bd0bc67 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
@@ -140,13 +140,16 @@ public class BundleDestinationView extends LocatableVLayout implements Bookmarka
destinationGroup.setLinkTitle(StringUtility.escapeHtml(destination.getGroup().getName()));
destinationGroup.setTarget("_self");
+ StaticTextItem baseDirName = new StaticTextItem("baseDir", MSG.view_bundle_dest_baseDirName());
+ baseDirName.setValue(destination.getDestinationBaseDirectoryName());
+
StaticTextItem path = new StaticTextItem("path", MSG.view_bundle_dest_deployDir());
path.setValue(destination.getDeployDir());
StaticTextItem description = new StaticTextItem("description", MSG.common_title_description());
description.setValue(StringUtility.escapeHtml(destination.getDescription()));
- form.setFields(bundleName, actionItem, created, destinationGroup, path, description);
+ form.setFields(bundleName, actionItem, created, destinationGroup, baseDirName, path, description);
return form;
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index c1e745b..d62e049 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -916,7 +916,7 @@ view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = New Destination
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
+view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description
view_bundle_deployWizard_getDest_name = Destination Name
view_bundle_deployWizard_getInfoStep = Provide Deployment Information
@@ -955,6 +955,7 @@ view_bundle_deploy_time = Deployment Time
view_bundle_deployed = Deployed
view_bundle_deployments = Deployments
view_bundle_dest_backToBundle = Back to Bundle
+view_bundle_dest_baseDirName = Base Location
view_bundle_dest_created = Created
view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 9e1efbd..30def7c 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -779,7 +779,7 @@ view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage~
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.~
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
view_bundle_deployWizard_getDestStep = New Destination~
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)~
+##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description~
view_bundle_deployWizard_getDest_name = Destination Name~
view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
@@ -813,6 +813,7 @@ view_bundle_deploy_time = Deployment Time~
view_bundle_deployed = Deployed
view_bundle_deployments = Deployments
view_bundle_dest_backToBundle = Zurück zum Bundle
+##view_bundle_dest_baseDirName = Base Location
view_bundle_dest_created = Angelegt
view_bundle_dest_deployDir = Deploy-Verzeichnis
view_bundle_dest_group = Gruppe
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 3e43cf4..837d613 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -917,7 +917,7 @@ view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = New Destination
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
+##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description
view_bundle_deployWizard_getDest_name = Destination Name
view_bundle_deployWizard_getInfoStep = Provide Deployment Information
@@ -956,6 +956,7 @@ view_bundle_deploy_time = Deployment Time
view_bundle_deployed = Deployed
view_bundle_deployments = Deployments
view_bundle_dest_backToBundle = Back to Bundle
+##view_bundle_dest_baseDirName = Base Location
view_bundle_dest_created = Created
view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 3dd563c..8313b56 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -934,7 +934,7 @@ view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage:
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.~
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
view_bundle_deployWizard_getDestStep = New Destination~
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)~
+##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = Destination Description~
view_bundle_deployWizard_getDest_name = Destination Name~
view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
@@ -973,6 +973,7 @@ view_bundle_deploy_time = Deployment Time~
view_bundle_deployed = Deployed~
view_bundle_deployments = Deployments~
view_bundle_dest_backToBundle = Back to Bundle~
+##view_bundle_dest_baseDirName = Base Location
view_bundle_dest_created = Created~
view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 2de927f..f488ffc 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -916,7 +916,7 @@ view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
view_bundle_deployWizard_getDestStep = \u65B0\u5EFA\u76EE\u7684\u5730
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
+##view_bundle_deployWizard_getDest_deployDir = Deployment Directory
view_bundle_deployWizard_getDest_desc = \u76EE\u7684\u5730\u63CF\u8FF0
view_bundle_deployWizard_getDest_name = \u76EE\u7684\u5730\u540D
view_bundle_deployWizard_getInfoStep = \u63D0\u4F9B\u53D1\u5E03\u4FE1\u606F
@@ -955,6 +955,7 @@ view_bundle_deploy_time = \u53D1\u5E03\u65F6\u95F4
view_bundle_deployed = \u5DF2\u53D1\u5E03
view_bundle_deployments = \u53D1\u5E03
view_bundle_dest_backToBundle = \u8FD4\u56DEBundle
+##view_bundle_dest_baseDirName = Base Location
view_bundle_dest_created = \u5DF2\u521B\u5EFA
view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
commit c51f62d0ca5118874b3c3ea3d000f06f474af117
Merge: 42c0276 ea15f1e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jun 7 16:26:30 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles-644328
Conflicts:
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
this just removed ^M EOL chars
commit 42c0276d756a82471201834e76ff7140834a557f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Jun 7 15:43:15 2011 -0400
Normalize Resource Bundle Format
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 276c465..2782b79 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -1,1804 +1,1794 @@
-#
-# RHQ GUI i18n Messages - Default (English)
-#
-# Developers: See the following wiki page for how to work with this file:
-#
-# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
-#
-###################################
-
-common_alert_high = High
-common_alert_low = Low
-common_alert_medium = Medium
-common_buildInfo_gwtVersion = ${gwt.version}
-common_button_ack = Acknowledge
-common_button_ack_all = Acknowledge All
-common_button_add = Add
-common_button_advanced = Advanced...
-common_button_apply = Apply
-common_button_cancel = Cancel
-common_button_close = Close
-common_button_compare = Compare
-common_button_create_child = Create Child
-common_button_delete = Delete
-common_button_delete_all = Delete All
-common_button_disable = Disable
-common_button_edit = Edit
-common_button_enable = Enable
-common_button_finish = Finish
-common_button_import = Import
-common_button_new = New
-common_button_next = Next
-common_button_ok = OK
-common_button_previous = Previous
-common_button_purgeAll = Purge All
-common_button_refresh = Refresh
-common_button_reset = Reset
-common_button_save = Save
-common_button_schedule = Schedule
-common_button_search = Search
-common_button_set = Set
-common_button_showDetails = Show Details...
-common_button_uninventory = Uninventory
-common_calendar_april_short = apr
-common_calendar_august_short = aug
-common_calendar_december_short = dec
-common_calendar_february_short = feb
-common_calendar_january_short = jan
-common_calendar_july_short = jul
-common_calendar_june_short = jun
-common_calendar_march_short = mar
-common_calendar_may_short = may
-common_calendar_november_short = nov
-common_calendar_october_short = oct
-common_calendar_september_short = sept
-common_label_ago = ago
-common_label_all = ALL
-common_label_all_resources = all resources
-common_label_day = day
-common_label_days = days
-common_label_hour = hour
-common_label_hours = hours
-common_label_item = item
-common_label_items = items
-common_label_milliseconds = milliseconds
-common_label_minutes = minutes
-common_label_month = month
-common_label_none = none
-common_label_role = role
-common_label_roles = roles
-common_label_scheduled_operations = scheduled operations
-common_label_seconds = seconds
-common_label_selected_resources = selected resources
-common_label_unlimited = unlimited
-common_label_user = user
-common_label_users = users
-common_label_week = week
-common_label_weeks = weeks
-common_label_yesterday = Yesterday
-common_msg_areYouSure = Are You Sure?
-common_msg_asyncTimeout = {0}. This occurred because the server is taking a long time to complete this request. Please be aware that the server may still be processing your request and it may complete shortly. You can check the server logs to see if any abnormal errors occurred.
-common_msg_changeAutoDetected = Change auto-detected
-common_msg_deleteConfirm = Are you sure you want to delete the # selected {0}?
-common_msg_emphasizedNotePrefix = NOTE:
-common_msg_loading = Loading...
-common_msg_noItemsToShow = No items to show
-common_msg_notYetImplemented = Not Yet Implemented
-common_msg_see_more = see more...
-common_msg_step_x_of_y = Step {0} of {1}
-common_severity_debug = Debug
-common_severity_error = Error
-common_severity_fatal = Fatal
-common_severity_info = Info
-common_severity_warn = Warn
-common_status_canceled = Canceled
-common_status_deferred = Deferred
-common_status_failed = Failed
-common_status_inprogress = In Progress
-common_status_nochange = No Change
-common_status_partial = Partial
-common_status_success = Success
-common_status_timedOut = Timed Out
-common_status_unknown = Unknown
-common_title_add_column = Add Column
-common_title_add_graph_to_view = Add Graph to Monitor View
-common_title_add_portlet = Add Portlet
-common_title_address = Address
-common_title_alert_range = Alert Range
-common_title_ancestry = Ancestry
-common_title_availability = Availability
-common_title_available_resources = Available Resources
-common_title_average_metrics = Average Metrics per Minute
-common_title_background = Background
-common_title_bundle = Bundle
-common_title_bundles = Bundles
-common_title_category = Category
-common_title_change_refresh_time = Refresh Interval
-common_title_columns = Columns
-common_title_compare_metrics = Compare Metrics
-common_title_compatibleGroups = Compatible Groups
-common_title_compatibleGroups_total = Compatible Group Total
-common_title_component_errors = Component Errors
-common_title_config_update_status = Update Status
-common_title_configuration = Configuration
-common_title_count = Count
-common_title_custom = Custom
-common_title_dashboard_name = Dashboard Name
-common_title_dateCreated = Date Created
-common_title_dateRange = Date Range
-common_title_default = Default
-common_title_description = Description
-common_title_details = Details
-common_title_display = Display
-common_title_display_name = Display Name
-common_title_duration = Duration
-common_title_edit_mode = Edit Mode
-common_title_enabled = Enabled?
-common_title_end = End
-common_title_error = Error
-common_title_generalProp = General Properties
-common_title_group = Group
-common_title_group_def_total = Group Definition Total
-common_title_group_member_health = Group Member Health
-common_title_groups = Groups
-common_title_help = Help
-common_title_host = Host
-common_title_icon =
-common_title_id = ID
-common_title_id_parent = Parent ID
-common_title_info = Info
-common_title_inventory = Inventory
-common_title_inventorySummary = Inventory Summary
-common_title_lastUpdated = Last Updated
-common_title_lastUpdatedBy = Last Updated By
-common_title_ldapGroups = LDAP Groups
-common_title_mashup = Mashup
-common_title_members_reporting = Members Reporting
-common_title_message = Message
-common_title_metric = Metric
-common_title_metric_chart = Metric Chart
-common_title_mixedGroups = Mixed Groups
-common_title_mixedGroups_total = Mixed Group Total
-common_title_name = Name
-common_title_new_dashboard = New Dashboard
-common_title_numeric_metrics = Numeric Metrics
-common_title_numeric_type = Numeric Type
-common_title_operation_status = Operation Status
-common_title_operations = Operations
-common_title_operations_range = Operation Range
-common_title_over = Over
-common_title_password = Password
-common_title_path = Path
-common_title_permissions = Permissions
-common_title_platform = Platform
-common_title_platform_total = Platform Total
-common_title_plugin = Plugin
-common_title_port = Port
-common_title_providers = Providers
-common_title_recent_alerts = Recent Alerts
-common_title_recent_bundle_deployments = Recent Bundle Deployments
-common_title_recent_configuration_updates = Recent Configuration Updates
-common_title_recent_event_counts = Recent Event Counts
-common_title_recent_measurements = Recent Measurements
-common_title_recent_oob_metrics = Recent Out of Bound metrics
-common_title_recent_operations = Recent Operations
-common_title_recent_pkg_history = Recent Package History
-common_title_recently_added = Recently Added
-common_title_remove_column = Remove Column
-common_title_repositories = Repositories
-common_title_resource = Resource
-common_title_resourceGroups = Resource Groups
-common_title_resource_group = Resource Group
-common_title_resource_id = Resource ID
-common_title_resource_inventory = Resource Inventory
-common_title_resource_key = Resource Key
-common_title_resource_name = Resource Name
-common_title_resource_type = Resource Type
-common_title_resources = Resources
-common_title_results_count = Results Count
-common_title_results_count_tooltip = Displays this number of results
-common_title_role = Role
-common_title_roles = Roles
-common_title_scheduled_operations = Scheduled Operations
-common_title_search = Search
-common_title_selected_resources = Selected Resources
-common_title_server = Server
-common_title_server_total = Server Total
-common_title_service = Service
-common_title_service_total = Service Total
-common_title_settings = Settings
-common_title_show = Show
-common_title_show_more = Show more...
-common_title_sort_order = Sort Order
-common_title_sort_order_tooltip = Sets sort order for results.
-common_title_start = Start
-common_title_status = Status
-common_title_stop = Stop
-common_title_summary = Summary
-common_title_tag_cloud = Tag Cloud
-common_title_the = The
-common_title_timestamp = Date/Time
-common_title_total = Total
-common_title_type = Type
-common_title_units = Units
-common_title_user = User
-common_title_users = Users
-common_title_value = Value
-common_title_version = Version
-common_title_view_mode = View Mode
-common_title_web_address = Web Address
-common_title_welcome = Welcome
-common_unit_days = days
-common_unit_hours = hours
-common_unit_milliseconds = milliseconds
-common_unit_minutes = minutes
-common_unit_months = months
-common_unit_seconds = seconds
-common_unit_times = times
-common_unit_weeks = weeks
-common_unit_years = years
-common_val_for = for
-common_val_n1st = {0}st
-common_val_n2nd = {0}nd
-common_val_n3rd = {0}rd
-common_val_na = N/A
-common_val_never = Never
-common_val_no = No
-common_val_no_lower = no
-common_val_none = None
-common_val_nth = {0}th
-common_val_yes = Yes
-common_val_yes_lower = yes
-
-dataSource_ContentRepoTree_error_load = Error loading repositories
-dataSource_ContentRepoTree_field_parentId = Parent ID
-dataSource_bundle_loadFailed = Failed to load Bundle data
-dataSource_configurationHistory_clickToSeeError = Double click to see error message...
-dataSource_configurationHistory_currentConfig = This is the current configuration
-dataSource_configurationHistory_dateCompleted = Date Completed
-dataSource_configurationHistory_dateSubmitted = Date Submitted
-dataSource_configurationHistory_error_fetchFailure = Unable to load configuration history.
-dataSource_configurationHistory_updateType = Update Type
-dataSource_configurationHistory_updateType_group = Group
-dataSource_configurationHistory_updateType_individual = Individual
-dataSource_definitions_loadFailed = Failed to load metric definitions
-dataSource_measurementOob_error_fetchFailure = Failed to load measurement OOB information
-dataSource_measurementOob_field_factor = Out of Range Factor (%)
-dataSource_measurementOob_field_formattedBaseband = Band
-dataSource_measurementOob_field_formattedOutlier = Outlier
-dataSource_measurementOob_field_parentName = Parent
-dataSource_measurementOob_field_resourceName = Resource
-dataSource_measurementOob_field_scheduleName = Metric
-dataSource_operationHistory_error_fetchFailure = Failure loading operation histories.
-dataSource_operationHistory_field_createdTime = Created Time
-dataSource_operationHistory_field_operationName = Operation Name
-dataSource_operationHistory_field_startedTime = Started Time
-dataSource_operationHistory_field_subject = Requester
-dataSource_operationSchedule_field_description = Notes
-dataSource_operationSchedule_field_id = Schedule ID
-dataSource_operationSchedule_field_nextFireTime = Next Execution
-dataSource_operationSchedule_field_operationDisplayName = Operation
-dataSource_operationSchedule_field_operationName = Operation
-dataSource_operationSchedule_field_subject = Owner
-dataSource_operationSchedule_field_timeout = Timeout (in seconds)
-dataSource_platforms_field_cpu = CPU
-dataSource_platforms_field_memory = Memory
-dataSource_platforms_field_swap = Swap
-dataSource_problemResources_error_fetchFailure = Failed to load Resources with alerts/unavailability.
-dataSource_problemResources_field_alerts = Alerts
-dataSource_problemResources_field_available = Current Availability
-dataSource_recentOperations_error_fetchFailure = Failed to load recently completed operations.
-dataSource_recentOperations_field_location = Location
-dataSource_recentOperations_field_operation = Operation
-dataSource_recentOperations_field_resource = Resource
-dataSource_recentOperations_field_status = Status
-dataSource_recentOperations_field_time = Date/Time
-dataSource_resourceErrors_clickStatusIcon = Click the icon for more details
-dataSource_resourceErrors_deleteFailure = Failed to delete resource errors
-dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
-dataSource_resourceErrors_error_fetchFailure = Failed to find Resource errors for Resource with id [{0}].
-dataSource_resourceErrors_field_errorType = Error Type
-dataSource_resourceErrors_field_summary = Summary
-dataSource_resourceErrors_field_timeOccured = Time
-dataSource_resourceGroups_loadFailed = Failed to load Resource Groups
-dataSource_resources_field_discoveryTime = Discovery Time
-dataSource_resources_field_importTime = Import Time
-dataSource_resources_field_key = Key
-dataSource_resources_field_lastModifiedTime = Last Modified Time
-dataSource_resources_field_lastModifier = Last Modifier
-dataSource_resources_field_location = Location
-dataSource_rpc_error_transformRequestFailure = Failure in datasource while processing {0} request.
-dataSource_rpc_error_unsupportedArrayFilterType = No support for passing array filters of type {0}.
-dataSource_rpc_error_unsupportedEnumType = Please add an appropriate code block for enum {0} to RPCDataSource.getEnumArray(Class)
-dataSource_rpc_no = no
-dataSource_rpc_yes = yes
-dataSource_scheduledOperations_error_fetchFailure = Failed to load scheduled operations.
-dataSource_scheduledOperations_field_location = Location
-dataSource_scheduledOperations_field_operation = Operation
-dataSource_scheduledOperations_field_resource = Resource
-dataSource_scheduledOperations_field_time = Date/Time
-dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
-dataSource_schedules_disableSuccessful_full_group = You have disabled the collection of [{0}] measurements for the resource group with ID [{1}]. The disabled measurements are: [{2}]
-dataSource_schedules_disableSuccessful_full_resource = You have disabled the collection of [{0}] measurements for the resource with ID [{1}]. The disabled measurements are: [{2}]
-dataSource_schedules_enableFailure_group = Failed to enable the collection of [{0}] metrics for group with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_enableFailure_resource = Failed to enable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_enableSuccessful_concise = You have enabled the collection of [{0}] measurements
-dataSource_schedules_enableSuccessful_full_group = You have enabled the collection of [{0}] measurements for the resource group with ID [{1}]. The enabled measurements are: [{2}]
-dataSource_schedules_enableSuccessful_full_resource = You have enabled the collection of [{0}] measurements for the resource with ID [{1}]. The enabled measurements are: [{2}]
-dataSource_schedules_field_resourceGroupId = Group ID
-dataSource_schedules_loadFailed = Failed to load metric schedules
-dataSource_schedules_loadFailedContext = Failed to load metric schedules for context [{0}]
-dataSource_schedules_loadFailedCriteria = Failed to load metric schedules for criteria [{0}]
-dataSource_schedules_updateFailure_group = Failed to set the collection interval of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
-dataSource_schedules_updateFailure_resource = Failed to set the collection interval of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
-dataSource_schedules_updateSuccessful_concise = A new collection interval of [{0}] seconds has been set on [{1}] measurements
-dataSource_schedules_updateSuccessful_full_group = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource group with ID [{2}]. The updated measurements are: [{3}]
-dataSource_schedules_updateSuccessful_full_resource = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource with ID [{2}]. The updated measurements are: [{3}]
-dataSource_traits_failFetch = Failed to fetch traits for criteria [{0}].
-dataSource_traits_field_definitionID = Definition ID
-dataSource_traits_field_lastChanged = Last Changed
-dataSource_traits_field_primaryKey = Primary Key
-dataSource_traits_field_trait = Trait
-dataSource_traits_group_field_groupId = Group ID
-dataSource_users_delete = Deleted user [{0}]
-dataSource_users_deleteFailed = Failed to delete user [{0}]
-dataSource_users_field_department = Department
-dataSource_users_field_emailAddress = Email Address
-dataSource_users_field_factive = Login Enabled?
-dataSource_users_field_firstName = First Name
-dataSource_users_field_id = ID
-dataSource_users_field_lastName = Last Name
-dataSource_users_field_ldap = LDAP Login?
-dataSource_users_field_name = User Name
-dataSource_users_field_password = Password
-dataSource_users_field_passwordVerify = Verify Password
-dataSource_users_field_phoneNumber = Phone Number
-dataSource_users_invalidEmailAddress = Invalid email address.
-dataSource_users_passwordsDoNotMatch = Passwords do not match.
-
-datasource_roles_field_ldapGroups = LDAP Groups
-datasource_roles_field_permissions = Permissions
-datasource_roles_field_resourceGroups = Resource Groups
-datasource_roles_field_subjects = Subjects
-datasource_templateSchedules_disabled = Disabled collection of selected metric [{0}].
-datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_disabled_failed = Failed to disable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled = Enabled collection of selected metric [{0}].
-datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled_failed = Failed to enable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_updated = Updated collection intervals of selected metric [{0}].
-datasource_templateSchedules_updated_detail = Collection interval for metric [{0}] [{1}] by default for ResourceType with id [{2}] set to [{3}] seconds.
-datasource_templateSchedules_updated_failed = Failed to set collection interval to [{0}] seconds for metric [{1}] [{2}] by default for ResourceType with id [{3}].
-
-favorites = Favorites
-
-favorites_groups = Favorite Groups
-favorites_recentlyViewed = Recently Viewed
-favorites_resources = Favorite Resources
-
-group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource
-
-util_ancestry_parentAncestry = Parent Ancestry for:
-util_errorHandler_nullException = exception was null
-util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status.
-util_rpcManager_activeRequests = {0} Active Requests
-util_userPerm_loadFailGlobal = Failed to load your global permissions - none granted.
-util_userPerm_loadFailGroup = Failed to load your permissions for Resource Group with id [{0}] - none granted.
-util_userPerm_loadFailResource = Failed to load your permissions for Resource with id [{0}] - none granted.
-util_userSession_loadFailSubject = UserSessionManager: Failed to load user Subject
-util_userSession_logoutFail = Failed to logout.
-util_widgetsField_unlimited = Unlimited
-
-view_aboutBox_allRightsReserved = All Rights Reserved.
-view_aboutBox_buildNumber = Build Number:
-view_aboutBox_failedToLoad = Failed to load product information.
-view_aboutBox_homepage = Homepage
-view_aboutBox_jbossByRedHat = JBoss by Red Hat
-view_aboutBox_title = About {0}
-view_aboutBox_version = Version:
-view_adminConfig_downloads = Downloads
-view_adminConfig_plugins = Plugins
-view_adminConfig_systemSettings = System Settings
-view_adminConfig_templates = Templates
-view_adminContent_contentSources = Content Sources
-view_adminContent_repositories = Repositories
-view_adminRoles_assignedGroups = Assigned Resource Groups
-view_adminRoles_assignedSubjects = Assigned Subjects
-view_adminRoles_failLdap = Failed to determine if LDAP configured - assuming no LDAP.
-view_adminRoles_failLdapGroups = Failed to retrieve available LDAP groups - assuming no LDAP groups.
-view_adminRoles_failLdapGroupsRole = Failed to load LDAP groups available for role.
-view_adminRoles_failRoles = Failed to fetch roles.
-view_adminRoles_globalPerms = Global Permissions
-view_adminRoles_ldapGroups = LDAP Groups
-view_adminRoles_ldapGroupsReadOnly = LDAP group data is read only
-view_adminRoles_noItems = No items to show
-view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP, go to <a {0}>{1}</a>.
-view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
-view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
-view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
-view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
-view_adminRoles_permissions_globalPermissions = Global Permissions
-view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
-view_adminRoles_permissions_isAuthorized = Authorized?
-view_adminRoles_permissions_isRead = Read?
-view_adminRoles_permissions_isWrite = Write?
-view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
-view_adminRoles_permissions_permDesc_manageInventory = has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; and can import auto-discovered or manually discovered Resources
-view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
-view_adminRoles_permissions_permDesc_manageSecurity = can create, update, or delete users and roles (viewing is implied for everyone)
-view_adminRoles_permissions_permDesc_manageSettings = can modify the RHQ Server configuration and perform any Server-related functionality
-view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
-view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
-view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) view child Resource creation history
-view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view child Resource deletion history
-view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
-view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
-view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
-view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
-view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
-view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
-view_adminRoles_permissions_permWriteDesc_control = execute operations; delete operation execution history items
-view_adminRoles_permissions_permWriteDesc_createChildResources = create new child Resources (for child Resources of types that are creatable)
-view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
-view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
-view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
-view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
-view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
-view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
-view_adminRoles_permissions_perm_configure = Configure
-view_adminRoles_permissions_perm_control = Control
-view_adminRoles_permissions_perm_createChildResources = Create Child Resources
-view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
-view_adminRoles_permissions_perm_inventory = Inventory
-view_adminRoles_permissions_perm_manageAlerts = Manage Alerts
-view_adminRoles_permissions_perm_manageBundles = Manage Bundles
-view_adminRoles_permissions_perm_manageContent = Manage Content
-view_adminRoles_permissions_perm_manageEvents = Manage Events
-view_adminRoles_permissions_perm_manageInventory = Manage Inventory
-view_adminRoles_permissions_perm_manageMeasurements = Manage Measurements
-view_adminRoles_permissions_perm_manageRepositories = Manage Repositories
-view_adminRoles_permissions_perm_manageSecurity = Manage Security
-view_adminRoles_permissions_perm_manageSettings = Manage Settings
-view_adminRoles_permissions_read = Read:
-view_adminRoles_permissions_readAccessImplied = Read access for the {0} permission is implied and cannot be disabled.
-view_adminRoles_permissions_resourcePermissions = Resource Permissions
-view_adminRoles_permissions_write = Write:
-view_adminRoles_perms = Permissions
-view_adminRoles_resourcePerms = Resource Permissions
-view_adminRoles_roleAdded = Role [{0}] added.
-view_adminRoles_roleDeleteFailed = Failed to delete role [{0}].
-view_adminRoles_roleDeleted = Role [{0}] deleted.
-view_adminRoles_roleUpdateFailed = Failed to update role [{0}].
-view_adminRoles_roleUpdated = Role [{0}] updated.
-view_adminSecurity_roles = Roles
-view_adminSecurity_users = Users
-view_adminTemplates_disabledAlertTemplates = Disabled Alert Templates
-view_adminTemplates_disabledMetricTemplates = Disabled Metric Templates
-view_adminTemplates_editAlertTemplate = Edit Alert Template
-view_adminTemplates_editMetricTemplate = Edit Metric Template
-view_adminTemplates_enabledAlertTemplates = Enabled Alert Templates
-view_adminTemplates_enabledMetricTemplates = Enabled Metric Templates
-view_adminTemplates_platformServices = Platform Services
-view_adminTemplates_platforms = Platforms
-view_adminTemplates_prompt_disabledAlertTemplates = Number of alert templates that are created but disabled on this resource type
-view_adminTemplates_prompt_disabledMetricTemplates = Number of metric schedules that are disabled by default on this resource type
-view_adminTemplates_prompt_enabledAlertTemplates = Number of alert templates that are enabled on this resource type
-view_adminTemplates_prompt_enabledMetricTemplates = Number of metric schedules that are enabled by default on this resource type
-view_adminTemplates_servers = Servers
-view_adminTopology_affinityGroups = Affinity Groups
-view_adminTopology_agents = Agents
-view_adminTopology_partitionEvents = Partition Events
-view_adminTopology_remoteAgentInstall = Remote Agent Install
-view_adminTopology_servers = Servers
-view_adminUsersDetails_dataTypeName = user
-view_adminUsersList_dataTypeName = user
-view_adminUsersList_dataTypeNamePlural = users
-view_admin_administration = Administration
-view_admin_configuration = Configuration
-view_admin_content = Content
-view_admin_downloads_agentDownload = Agent Download
-view_admin_downloads_agent_buildNumber = Agent Build
-view_admin_downloads_agent_help = <p> This is the RHQ Agent Update Binary jar file. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>Agent Install</h3> <p> <b>java -jar <agent-download.jar> --install[=<new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>Agent Update</h3> <p> <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
-view_admin_downloads_agent_link_label = Link
-view_admin_downloads_agent_link_value = Download Agent {0} ({1})
-view_admin_downloads_agent_loadError = Cannot get agent version info
-view_admin_downloads_agent_md5 = Agent MD5
-view_admin_downloads_agent_version = Agent Version
-view_admin_downloads_bundleDownload = Bundle Deployer Download
-view_admin_downloads_bundle_help = <p> This is the Bundle Deployer tool. It is for use by developers and packagers of RHQ bundles. This standalone tool allows you to test your bundles and their recipes from a console. </p>
-view_admin_downloads_bundle_link_label = Link
-view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
-view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
-view_admin_downloads_cliDownload = Command Line Client Download
-view_admin_downloads_cli_buildNumber = CLI Build
-view_admin_downloads_cli_help = <p> This is the Command Line Client tool, otherwise known as the CLI. It is a standalone tool that runs from within a console and provides a command line interface to the RHQ Server. You can invoke commands via the CLI as well as run scripts to perform automated tasks. See the documentation for more information on how to install and use the CLI. </p>
-view_admin_downloads_cli_link_label = Link
-view_admin_downloads_cli_link_value = Download CLI {0} ({1})
-view_admin_downloads_cli_loadError = Cannot get CLI version info
-view_admin_downloads_cli_md5 = CLI MD5
-view_admin_downloads_cli_version = CLI Version
-view_admin_downloads_connectorsDownload = Connectors Download
-view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
-view_admin_downloads_connectors_loadError = Cannot get connectors info
-view_admin_downloads_connectors_none = No connectors are available for download
-view_admin_landing = From this section, the RHQ global settings can be administered. This includes configuring security, setting up plugins, and managing RHQ Servers and Agents.
-view_admin_measTemplates_title = Template Metric Collection Schedules
-view_admin_measTemplates_updateExisting_title = Update Existing Schedules
-view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
-view_admin_security = Security
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
-view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
-view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
-view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
-view_admin_systemSettings_BaseURL_name = GUI Console URL
-view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
-view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
-view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
-view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
-view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
-view_admin_systemSettings_DataMaintenance_name = Database Maintenance Period
-view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
-view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
-view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
-view_admin_systemSettings_EnableAgentAutoUpdate_name = Enable Agent Auto-Updates
-view_admin_systemSettings_EnableDebugMode_desc = If enabled, the server will enter debug mode.
-view_admin_systemSettings_EnableDebugMode_name = Enable Debug Mode
-view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
-view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
-view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_EventPurge_name = Delete Events Older Than
-view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
-view_admin_systemSettings_JAASProvider_name = Enable LDAP
-view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou=People,dc=redhat,dc=com
-view_admin_systemSettings_LDAPBaseDN_name = Search Base
-view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn=Manager,dc=redhat,dc=com
-view_admin_systemSettings_LDAPBindDN_name = Username
-view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
-view_admin_systemSettings_LDAPBindPW_name = Password
-view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser=true
-view_admin_systemSettings_LDAPFilter_name = Search Filter
-view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
-view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
-view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
-view_admin_systemSettings_LDAPLoginProperty_name = Login Property
-view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
-view_admin_systemSettings_LDAPProtocol_name = SSL
-view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
-view_admin_systemSettings_LDAPUrl_name = LDAP URL
-view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
-view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
-view_admin_systemSettings_cannotLoadServerDetails = Cannot load server details
-view_admin_systemSettings_cannotLoadSettings = Cannot obtain the current system settings
-view_admin_systemSettings_fixBeforeSaving = Please fix the invalid values before saving
-view_admin_systemSettings_group_baseline = Automatic Baseline Configuration Properties
-view_admin_systemSettings_group_dataMgr = Data Manager Configuration Properties
-view_admin_systemSettings_group_general = General Configuration Properties
-view_admin_systemSettings_group_ldap = LDAP Configuration Properties
-view_admin_systemSettings_saveFailure = Failed to save the system settings
-view_admin_systemSettings_savedSettings = You successfully saved the system properties
-view_admin_systemSettings_serverDetails = Server Details
-view_admin_systemSettings_serverDetails_buildNumber = Build Number
-view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
-view_admin_systemSettings_serverDetails_dbDriverName = Database Driver Name
-view_admin_systemSettings_serverDetails_dbDriverVersion = Database Driver Version
-view_admin_systemSettings_serverDetails_dbName = Database Product Name
-view_admin_systemSettings_serverDetails_dbUrl = Database Connection URL
-view_admin_systemSettings_serverDetails_dbVersion = Database Product Version
-view_admin_systemSettings_serverDetails_installDir = Server Installation Directory
-view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
-view_admin_systemSettings_serverDetails_time = Server Local Time
-view_admin_systemSettings_serverDetails_tz = Server Time Zone
-view_admin_topology = Topology
-view_alert_common_tab_conditions = Conditions
-view_alert_common_tab_conditions_expression = Fire alert when
-view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
-view_alert_common_tab_conditions_modal_title = Add Condition
-view_alert_common_tab_conditions_recovery_disabled = This alert caused its alert definition to be disabled
-view_alert_common_tab_conditions_recovery_enabled = Triggered ''{0}'' to be re-enabled
-view_alert_common_tab_conditions_text = Condition
-view_alert_common_tab_conditions_type_availability = Availability Change
-view_alert_common_tab_conditions_type_availability_down = Went down
-view_alert_common_tab_conditions_type_availability_up = Came up
-view_alert_common_tab_conditions_type_event = Event Detection
-view_alert_common_tab_conditions_type_event_matching = with event source matching
-view_alert_common_tab_conditions_type_metric_baseline = Metric Value Baseline
-view_alert_common_tab_conditions_type_metric_baseline_verb = of
-view_alert_common_tab_conditions_type_metric_calltime_change = Call Time Value Changes
-view_alert_common_tab_conditions_type_metric_calltime_change_verb = by at least
-view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Grows
-view_alert_common_tab_conditions_type_metric_calltime_delta_other = Changes
-view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
-view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
-view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
-view_alert_common_tab_conditions_type_metric_change = Metric Value Change
-view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
-view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
-view_alert_common_tab_conditions_type_operation = Operation Execution
-view_alert_common_tab_conditions_type_operation_status = with result status
-view_alert_common_tab_conditions_type_resource_configuration = Resource Configuration Change
-view_alert_common_tab_conditions_value = Value
-view_alert_common_tab_dampening = Dampening
-view_alert_common_tab_dampening_category_consecutive_count = Consecutive
-view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
-view_alert_common_tab_dampening_category_duration_count = Time Period
-view_alert_common_tab_dampening_category_duration_count_tooltip = An alert is triggered once every X occurrences the condition set is true within a given time period.
-view_alert_common_tab_dampening_category_none = None
-view_alert_common_tab_dampening_category_none_tooltip = Dampening is disabled. Every time the condition set is true, an alert will be triggered.
-view_alert_common_tab_dampening_category_partial_count = Last N Evaluations
-view_alert_common_tab_dampening_category_partial_count_tooltip = An alert is triggered once every X occurrences the condition set is true during the last N evaluations of the condition set.
-view_alert_common_tab_dampening_consecutive_occurrences_label = Occurrences
-view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = The number of times the condition set must be consecutively true before the alert is triggered
-view_alert_common_tab_dampening_duration_occurrences_label = Occurrences
-view_alert_common_tab_dampening_duration_occurrences_label_tooltip = The number of times the condition set must be true during the given time period before the alert is triggered.
-view_alert_common_tab_dampening_duration_period_label = Time Period
-view_alert_common_tab_dampening_duration_period_label_tooltip = The time span in which the condition set will be tested to see if the given number of occurrences are true.
-view_alert_common_tab_dampening_partial_evalatuions_label = Evaluations
-view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = The total number of times the condition set will be tested to see if the given number of occurrences are true.
-view_alert_common_tab_dampening_partial_occurrences_label = Occurrences
-view_alert_common_tab_dampening_partial_occurrences_label_tooltip = The number of times the condition set must be true during the last N evaluations before the alert is triggered.
-view_alert_common_tab_general = General Properties
-view_alert_common_tab_invalid_condition_category = Invalid condition category - please report this as a bug: {0}
-view_alert_common_tab_invalid_dampening_category = Invalid dampening category - please report this as a bug: {0}
-view_alert_common_tab_invalid_time_units = Invalid time units - please report this as a bug: {0}
-view_alert_common_tab_notifications = Notifications
-view_alert_common_tab_notifications_message = Message
-view_alert_common_tab_notifications_sender = Sender
-view_alert_common_tab_notifications_status = Status
-view_alert_common_tab_recovery = Recovery
-view_alert_definition_condition_editor_avilability_option_down = Goes down
-view_alert_definition_condition_editor_avilability_option_up = Comes up
-view_alert_definition_condition_editor_avilability_tooltip = Specify the availability state change that will trigger the condition.
-view_alert_definition_condition_editor_avilability_value = Availability
-view_alert_definition_condition_editor_common_avg = Average
-view_alert_definition_condition_editor_common_max = Maximum
-view_alert_definition_condition_editor_common_min = Minimum
-view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
-view_alert_definition_condition_editor_event_regex = Regular Expression
-view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
-view_alert_definition_condition_editor_event_severity = Event Severity
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
-view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
-view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
-view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
-view_alert_definition_condition_editor_metric_baseline_tooltip = Specify the baseline value that must be violated to trigger the condition. The value you specify is a percentage of the given baseline value.
-view_alert_definition_condition_editor_metric_baseline_value = Baseline
-view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentage Change
-view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = A collected calltime value will trigger this condition when it differs by at least this percentage of the selected calltime limit value
-view_alert_definition_condition_editor_metric_calltime_change_tooltip = Specify the calltime value that, when changed at least a specified amount, triggers the condition. You must specify which calltime limit to check (minimum, maximum or average calltime value) and the percentage of change that must occur.
-view_alert_definition_condition_editor_metric_calltime_common_comparator = Comparator
-view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Changes
-view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Grows
-view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Shrinks
-view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = How a collected calltime value should be compared to the given calltime limit
-view_alert_definition_condition_editor_metric_calltime_common_limit = Call Time Limit
-view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = The calltime limit value that is to be compared with the given value
-view_alert_definition_condition_editor_metric_calltime_common_name = Call Time Metric
-view_alert_definition_condition_editor_metric_calltime_common_regex = Regular Expression
-view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = If specified, this is a regular expression that must match a call destination in order to trigger the condition.
-view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Specify the calltime threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier. You also must specify which calltime limit to compare the value with (minimum, maximum or average calltime value).
-view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Time Value
-view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
-view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
-view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
-view_alert_definition_condition_editor_metric_threshold_comparator_equal = Equal to
-view_alert_definition_condition_editor_metric_threshold_comparator_greater = Greater Than
-view_alert_definition_condition_editor_metric_threshold_comparator_less = Less than
-view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = How a collected metric value should be compared to the given threshold value
-view_alert_definition_condition_editor_metric_threshold_name = Metric
-view_alert_definition_condition_editor_metric_threshold_tooltip = Specify the threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier.
-view_alert_definition_condition_editor_metric_threshold_value = Metric Value
-view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
-view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_trait_change_value = Trait
-view_alert_definition_condition_editor_operation_status = Operation Status
-view_alert_definition_condition_editor_operation_status_canceled = Canceled
-view_alert_definition_condition_editor_operation_status_failure = Failure
-view_alert_definition_condition_editor_operation_status_inprogress = In Progress
-view_alert_definition_condition_editor_operation_status_success = Success
-view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
-view_alert_definition_condition_editor_operation_value = Operation
-view_alert_definition_condition_editor_option_availability = Availability Change
-view_alert_definition_condition_editor_option_event = Event Detection
-view_alert_definition_condition_editor_option_label = Condition Type
-view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
-view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
-view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
-view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
-view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
-view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
-view_alert_definition_condition_editor_option_operation = Operation Execution
-view_alert_definition_condition_editor_option_resource_configuration = Resource Configuration Change
-view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
-view_alert_definition_for_group = View Group Definition
-view_alert_definition_for_type = View Template
-view_alert_definition_notification_cliScript_editor_anotherUser = Another User
-view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
-view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
-view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
-view_alert_definition_notification_cliScript_editor_repository = Repository
-view_alert_definition_notification_cliScript_editor_script = Script
-view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
-view_alert_definition_notification_cliScript_editor_selectRepoFirst = Select a repository first.
-view_alert_definition_notification_cliScript_editor_thisUser = Myself
-view_alert_definition_notification_cliScript_editor_uploadNewScript = Upload New Script
-view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
-view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
-view_alert_definition_notification_editor_delete_confirm = Are you sure you want to delete the selected alert notifications?
-view_alert_definition_notification_editor_field_configuration = Configuration
-view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
-view_alert_definition_notification_editor_field_configuration_not_loaded = Unknown
-view_alert_definition_notification_editor_field_sender = Sender
-view_alert_definition_notification_editor_loadFailed = Cannot get alert senders
-view_alert_definition_notification_editor_loadFailed_single = Cannot get alert sender configuration definition
-view_alert_definition_notification_editor_none_available = No alert senders available
-view_alert_definition_notification_editor_saveFailed = Cannot save the notification configuration
-view_alert_definition_notification_editor_sender = Notification Sender
-view_alert_definition_notification_editor_title_add = Add Notification
-view_alert_definition_notification_editor_title_edit = Edit Notification
-view_alert_definition_notification_operation_editor_common_operation = Operation
-view_alert_definition_notification_operation_editor_mode_relative = Relative Resource
-view_alert_definition_notification_operation_editor_mode_specific = Specific Resource
-view_alert_definition_notification_operation_editor_mode_this = This Resource
-view_alert_definition_notification_operation_editor_mode_title = Resource Selection Mode
-view_alert_definition_notification_operation_editor_mode_unknown = UNKNOWN OPTION - THIS IS A BUG
-view_alert_definition_notification_operation_editor_operations_loadFailed = Failed to load the list of available operations
-view_alert_definition_notification_operation_editor_operations_no_parameters = This operation does not take any parameters
-view_alert_definition_notification_operation_editor_relative_ancestor = Start Search From
-view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = Cannot get type ancestry
-view_alert_definition_notification_operation_editor_relative_ancestor_root = Root Ancestor Type
-view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Select the top of the type hierarchy from which to search its descendant tree for the Filter By type
-view_alert_definition_notification_operation_editor_relative_descendant = Then Filter By
-view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = A specific name to uniquely identify a resource when more than one resource of the selected type might exist. This is optional if there will only ever be one resource of the resource type in the selected type hierarchy.
-view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = Cannot get type descendants
-view_alert_definition_notification_operation_editor_relative_descendant_tooltip = The resource type to search for under the root type defined in the Start Search From selection.
-view_alert_definition_notification_operation_editor_specific_pick_button = Pick
-view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Please pick a resource
-view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Please pick a resource that has one or more operations
-view_alert_definition_notification_operation_editor_specific_pick_text = Pick a resource...
-view_alert_definition_notification_operation_editor_specific_resource = Resource
-view_alert_definition_notification_role_editor_loadFailed = Cannot determine current roles - starting empty
-view_alert_definition_notification_role_editor_restoreFailed = Cannot use current roles - starting empty
-view_alert_definition_notification_role_editor_saveFailed = Cannot save the selected roles
-view_alert_definition_notification_user_editor_loadFailed = Cannot determine current users - starting empty
-view_alert_definition_notification_user_editor_restoreFailed = Cannot use current users - starting empty
-view_alert_definition_notification_user_editor_saveFailed = Cannot save the selected users
-view_alert_definition_recovery_editor_disable_when_fired = Disable When Fired
-view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indicates if this alert will be disabled after it fires. Once disabled, the alert can be manually re-enabled or a recovery alert can be set up to automatically re-enable it. If this alert is a recovery alert itself, this setting cannot be turned on.
-view_alert_definition_recovery_editor_loadFailed = Cannot build recovery menu
-view_alert_definition_recovery_editor_none_available = None
-view_alert_definition_recovery_editor_recovery_alert = Recover Alert
-view_alert_definition_recovery_editor_recovery_alert_tooltip = The target alert that will be recovered (i.e. re-enabled) after this alert triggers. Do not select an alert here if you are not defining a recovery alert.
-view_alert_definitions_create_failure = Alert definition creation failed
-view_alert_definitions_create_success = Alert definition successfully created
-view_alert_definitions_delete_confirm = Delete the selected alert definition(s)?
-view_alert_definitions_delete_failure = Failed to deleted the selected alert definitions
-view_alert_definitions_delete_success = Successfully deleted {0} alert definitions
-view_alert_definitions_disable_confirm = Disable the selected alert definition(s)?
-view_alert_definitions_disable_failure = Failed to disable the selected alert definitions
-view_alert_definitions_disable_success = Successfully disabled {0} alert definitions
-view_alert_definitions_enable_confirm = Enable the selected alert definition(s)?
-view_alert_definitions_enable_failure = Failed to enable the selected alert definitions
-view_alert_definitions_enable_success = Successfully enabled {0} alert definitions
-view_alert_definitions_loadFailed = Failed to fetch alert definition data
-view_alert_definitions_loadFailed_single = Failed to fetch data for alert definition with id {0}
-view_alert_definitions_table_title_group = Group Alert Definitions
-view_alert_definitions_table_title_resource = Resource Alert Definitions
-view_alert_definitions_update_failure = Alert definition update failed
-view_alert_definitions_update_success = Alert definition successfully updated
-view_alert_details_field_ack_at = Acknowledged at
-view_alert_details_field_ack_by = Acknowledged by
-view_alert_details_field_recovery_info = Recovery Info
-view_alert_details_loadFailed = Failed to fetch alert details
-view_alerts_ack_confirm = Acknowledge the selected alert(s)?
-view_alerts_ack_confirm_all = Acknowledge all alerts from this source?
-view_alerts_ack_failure = Failed to acknowledge alerts with id''s: {0}
-view_alerts_ack_failure_all = Failed to acknowledge all alerts from this source
-view_alerts_ack_success = Successfully acknowledged {0} alerts
-view_alerts_delete_confirm = Delete the selected alert(s)?
-view_alerts_delete_confirm_all = Delete all alerts from this source?
-view_alerts_delete_failure = Failed to delete alerts with id''s: {0}
-view_alerts_delete_failure_all = Failed to delete all alerts from this source
-view_alerts_delete_success = Successfully deleted {0} alerts
-view_alerts_field_ack_status = Status
-view_alerts_field_ack_status_ack = Ack ({0})
-view_alerts_field_ack_status_ackHover = Acknowledged by {0} at {1}
-view_alerts_field_ack_status_noAck = No Ack
-view_alerts_field_ack_status_noAckHover = Not yet Acknowledged
-view_alerts_field_ack_subject = Acknowledge Subject
-view_alerts_field_ack_time = Acknowledge Time
-view_alerts_field_condition_text = Condition Text
-view_alerts_field_condition_text_many = Multiple Conditions
-view_alerts_field_condition_text_none = No Conditions
-view_alerts_field_condition_value = Condition Value
-view_alerts_field_created_time = Creation Time
-view_alerts_field_enabled = Enabled
-view_alerts_field_modified_time = Modified Time
-view_alerts_field_name = Name
-view_alerts_field_parent = Parent
-view_alerts_field_priority = Priority
-view_alerts_field_protected = Protected
-view_alerts_field_protected_tooltip = If true, this definition is protected from being changed by the parent definition. In other words, the parent definition settings will not override this definition.
-view_alerts_loadFailed = Failed to fetch alerts data
-view_alerts_table_filter_priority = Priority Filter
-view_alerts_table_title_group = Group Alert History
-view_alerts_table_title_resource = Resource Alert History
-view_autoDiscoveryQ_committed = Committed
-view_autoDiscoveryQ_confirmSelect = Also select the platform children?
-view_autoDiscoveryQ_deleted = Deleted
-view_autoDiscoveryQ_field_discoveryTime = Discovery Time
-view_autoDiscoveryQ_field_inventoryStatus = Inventory Status
-view_autoDiscoveryQ_field_key = Resource Key
-view_autoDiscoveryQ_field_name = Resource Name
-view_autoDiscoveryQ_field_parentId = Parent ID
-view_autoDiscoveryQ_ignore = Ignore
-view_autoDiscoveryQ_ignoreFailure = Failed to ignore resources
-view_autoDiscoveryQ_ignoreSuccessful = You have successfully ignored the selected resources.
-view_autoDiscoveryQ_ignored = Ignored
-view_autoDiscoveryQ_import = Import
-view_autoDiscoveryQ_importFailure = Failed to import resources
-view_autoDiscoveryQ_importSuccessful = You have successfully imported the selected resources.
-view_autoDiscoveryQ_loadFailure = Failed to load the inventory discovery queue
-view_autoDiscoveryQ_new = New
-view_autoDiscoveryQ_newAndIgnored = New and Ignored
-view_autoDiscoveryQ_noItems = No items to show
-view_autoDiscoveryQ_noperm = (You are not authorized to view the auto-discovery queue)
-view_autoDiscoveryQ_showStatus = Show
-view_autoDiscoveryQ_title = Autodiscovery Queue
-view_autoDiscoveryQ_unignore = Unignore
-view_autoDiscoveryQ_unignoreFailure = Failed to unignore resources
-view_autoDiscoveryQ_unignoreSuccessful = You have successfully unignored the selected resources.
-view_autoDiscoveryQ_uninventoried = Uninventoried
-view_bundleVersion_loadFailure = Failed to load bundle version data
-view_bundle_bundle = Bundle
-view_bundle_bundleDeployment = Bundle Deployment
-view_bundle_bundleDeployments = Bundle Deployments
-view_bundle_bundleDestinations = Bundle Destinations
-view_bundle_bundleFiles = Bundle Files
-view_bundle_bundleType = Bundle Type
-view_bundle_bundleVersion = Bundle Version
-view_bundle_bundleVersions = Bundle Versions
-view_bundle_bundles = Bundles
-view_bundle_createWizard_bundleDistro = Bundle Distribution
-view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database
-view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
-view_bundle_createWizard_clickToUploadRecipe = Click to load a recipe file
-view_bundle_createWizard_createFailure = Failed to create the bundle
-view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]
-view_bundle_createWizard_enterRecipe = Please supply a valid recipe
-view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
-view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file
-view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file
-view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server
-view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle
-view_bundle_createWizard_noBundleTypesAvail = No bundle types are available
-view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments
-view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
-view_bundle_createWizard_recipeOption = Recipe
-view_bundle_createWizard_title = Create Bundle
-view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files
-view_bundle_createWizard_uploadOption = Upload
-view_bundle_createWizard_uploadStepName = Upload Bundle Files
-view_bundle_createWizard_urlOption = URL
-view_bundle_createWizard_windowTitle = Bundle Creation Wizard
-view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
-view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted.
-view_bundle_deploy = Deploy
-view_bundle_deployDir = Deploy Directory
-view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms
-view_bundle_deployWizard_deploying = Deploying...
-view_bundle_deployWizard_deploymentCreated = Created Deployment...
-view_bundle_deployWizard_deploymentCreatedDetail = You have created the deployment [{0}] with the description [{1}]
-view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
-view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!
-view_bundle_deployWizard_deploymentScheduledDetail = You have scheduled the bundle deployment [{0}] to the destination group [{1}]
-view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
-view_bundle_deployWizard_destinationCreatedDetail = You have created the destination [{0}] with the description [{1}]
-view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
-view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel
-view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)
-view_bundle_deployWizard_error_11 = Failed to find defined deployments.
-view_bundle_deployWizard_error_12 = Failed to find defined bundles.
-view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel
-view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!
-view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}
-view_bundle_deployWizard_error_5 = Failed to Create Deployment!
-view_bundle_deployWizard_error_6 = Failed to create deployment: {0}
-view_bundle_deployWizard_error_7 = Failed to get deployment name.
-view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
-view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
-view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
-view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
-view_bundle_deployWizard_getDestStep = New Destination
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
-view_bundle_deployWizard_getDest_desc = Destination Description
-view_bundle_deployWizard_getDest_name = Destination Name
-view_bundle_deployWizard_getInfoStep = Provide Deployment Information
-view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
-view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description
-view_bundle_deployWizard_getInfo_deploymentName = Deployment Name
-view_bundle_deployWizard_getOptionsStep = Deploy Options
-view_bundle_deployWizard_getOptions_deployLater = Deploy Later
-view_bundle_deployWizard_getOptions_deployNow = Deploy Now
-view_bundle_deployWizard_getOptions_deployTime = Deployment Time
-view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle
-view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.
-view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version
-view_bundle_deployWizard_selectVersion_latest = Latest Version [{0}]
-view_bundle_deployWizard_selectVersion_live = Live Version [{0}]
-view_bundle_deployWizard_selectVersion_select = Select Version from List:
-view_bundle_deployWizard_title = Bundle Deployment Wizard
-view_bundle_deploy_action = Action
-view_bundle_deploy_backButton = Back to Destination
-view_bundle_deploy_clickForError = Click the icon for the error message
-view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
-view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
-view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
-view_bundle_deploy_deployedBy = Deployed By
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms
-view_bundle_deploy_installDetails = Install Details
-view_bundle_deploy_loadBundleFailure = Failed to find bundle
-view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
-view_bundle_deploy_loadFailure = Failed to load bundle deployment
-view_bundle_deploy_name = Deployment Name
-view_bundle_deploy_operatingSystem = Operating System
-view_bundle_deploy_selectARow = Select a row to show installation details
-view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
-view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
-view_bundle_deploy_time = Deployment Time
-view_bundle_deployed = Deployed
-view_bundle_deployments = Deployments
-view_bundle_dest_backToBundle = Back to Bundle
-view_bundle_dest_created = Created
-view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
-view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
-view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
-view_bundle_dest_deployDir = Deploy Directory
-view_bundle_dest_group = Group
-view_bundle_dest_lastDeployedVersion = Last Deployed Version
-view_bundle_dest_lastDeploymentDate = Last Deployment Date
-view_bundle_dest_lastDeploymentStatus = Last Deployment Status
-view_bundle_dest_loadFailure = Failed to load bundle destinations
-view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information
-view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
-view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
-view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
-view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
-view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
-view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
-view_bundle_destinations = Destinations
-view_bundle_fileListView_fileSize = File Size
-view_bundle_fileListView_loadFailure = Failed to load bundle file data
-view_bundle_fileListView_md5 = MD5
-view_bundle_fileListView_sha256 = SHA256
-view_bundle_files = Files
-view_bundle_latestVersion = Latest Version
-view_bundle_list_backToAll = Back to All Bundles
-view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
-view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
-view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
-view_bundle_list_deletesFailure = Failed to delete the bundles
-view_bundle_list_deletesSuccessful = You successfully deleted the bundles
-view_bundle_list_destinationsCount = Destinations Count
-view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
-view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
-view_bundle_list_error3 = Failed to load bundle
-view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]
-view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data
-view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]
-view_bundle_list_tagUpdateFailure = Failed to update bundle tags
-view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
-view_bundle_list_versionsCount = Versions Count
-view_bundle_purge = Purge
-view_bundle_recipe = Recipe
-view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
-view_bundle_revert = Revert
-view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...
-view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
-view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
-view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation
-view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
-view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
-view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
-view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
-view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment
-view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
-view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
-view_bundle_revertWizard_getInfoStep_name = Provide Revert Information
-view_bundle_revertWizard_getInfoStep_revertDeployDesc = Revert Deploy Description
-view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\\n\\n[REVERT To]\\n{1}
-view_bundle_revertWizard_getInfoStep_revertDeployName = Revert Deploy Name
-view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms
-view_bundle_revertWizard_revertStep_reverting = Reverting...
-view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!
-view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]
-view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!
-view_bundle_revertWizard_title = Bundle Revert
-view_bundle_revertWizard_windowTitle = Bundle Revert Wizard
-view_bundle_tree_loadFailure = Failed to load bundle data
-view_bundle_version_backToBundle = Back to Bundle
-view_bundle_version_bundleVersionTagUpdateFailure = Failed to update bundle version tags
-view_bundle_version_bundleVersionTagUpdateSuccessful = You have successfully updated the bundle version tags
-view_bundle_version_deleteConfirm = Are you sure you want to delete this bundle version?
-view_bundle_version_deleteFailure = Failed to delete the bundle version [{0}]
-view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
-view_bundle_version_loadFailure = Failed to load bundle version
-view_bundle_versions = Versions
-view_configCompare_comparingConfigs = Comparing Configurations
-view_configCompare_configCompare = Configuration Comparison
-view_configEdit_addItem = Add Item to List
-view_configEdit_confirm_1 = Are you sure you want to delete the selected properties from the set?
-view_configEdit_confirm_2 = Are you sure you want to delete this row?
-view_configEdit_confirm_3 = Are you sure you want to delete the [{0}] selected [{1}]?
-view_configEdit_editRow = Edit Row
-view_configEdit_enterPropName = Enter the name of the property to be added.
-view_configEdit_error_1 = Configuration is not supported by this Resource.
-view_configEdit_error_2 = Connection settings are not supported by this Resource.
-view_configEdit_error_3 = Cannot add property named [{0}]. The property name is already used in the set.
-view_configEdit_files = Files
-view_configEdit_hideAll = Hide All
-view_configEdit_jumpToSection = Jump to Section
-view_configEdit_msg_1 = Added property [{0}] to the set.
-view_configEdit_msg_2 = Removed properties from the set.
-view_configEdit_msg_3 = [{0} {1}] deleted from list.
-view_configEdit_msg_4 = Item added to list.
-view_configEdit_properties = Properties
-view_configEdit_tooltip_1 = Delete the selected items from the list.
-view_configEdit_tooltip_2 = Add an item to the list.
-view_configEdit_viewRow = View Row
-view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.
-view_configurationDetails_configNotUpdatedDueToNoChange = Configuration was not updated, since the new configuration is equivalent to the current configuration.
-view_configurationDetails_error_updateFailure = Failed to update configuration.
-view_configurationDetails_messageConcise = Configuration updated - current version is {0}.
-view_configurationDetails_messageDetailed = Configuration updated to version {0} for Resource [{1}].
-view_configurationDetails_noPermission = You do not have permission to edit this Resource''s configuration.
-view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.
-view_configurationHistoryDetails_error_loadFailure = Unable to load configuration history.
-view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
-view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. You must purge that parent group history item before you can delete its individual resource history items.
-view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
-view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
-view_configurationHistoryList_rollback = Rollback
-view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
-view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
-view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
-view_configurationHistoryList_table_statusFailure = This configuration update failed
-view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
-view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
-view_configurationHistoryList_table_statusSuccess = This configuration update was successful
-view_configurationHistoryList_title = Configuration History
-view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.
-view_connectionSettingsDetails_error_updateFailure = Failed to update connection settings.
-view_connectionSettingsDetails_messageConcise_updateSuccess = Connection settings update initiated.
-view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settings update initiated for Resource [{0}].
-view_connectionSettingsDetails_noPermission = You do not have permission to edit this Resource''s connection settings.
-view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.
-view_core_error_1 = New Alerts lookup failed
-view_core_loggedOut = Logged out
-view_core_noRecentAlerts = There are no recent alerts to report
-view_core_recentAlerts = There are [{0}] recent alerts - click to go to the recent alerts report
-view_core_uncaught = Globally uncaught exception
-view_dashboardManager_deleteFail = Failed to delete dashboard.
-view_dashboardManager_deleted = Successfully deleted dashboard {0}
-view_dashboardManager_error = Failed to save dashboard to server
-view_dashboardManager_saved = Saved dashboard {0} to server
-view_dashboardManager_success = Saved dashboard
-view_dashboard_favorites_error1 = Failed to load favorite Resources.
-view_dashboardsManager_error1 = Failed to add new dashboard
-view_dashboardsManager_message_title_details = <h1>Welcome to RHQ</h1>\n<p>The RHQ project is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p>
-view_dashboards_confirm1 = Are you sure you want to delete
-view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh
-view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh
-view_dashboards_portlets_refresh_multiple_min = {0} minutes
-view_dashboards_portlets_refresh_none = No Refresh
-view_dashboards_portlets_refresh_one_min = 1 minute
-view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
-view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
-view_dashboards_title = Dashboard
-view_dynagroup_children = DynaGroup Children
-view_dynagroup_compatible = Compatible
-view_dynagroup_definitionAlreadyExists = A group definition already exists with this name
-view_dynagroup_definitionCreated = You have successfully created a group definition named [{0}]
-view_dynagroup_definitionLoadFailure = Failed to load group definitions
-view_dynagroup_definitions = DynaGroup Definitions
-view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions
-view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions
-view_dynagroup_editing = Editing [{0}]
-view_dynagroup_exprBuilder_addExpression = Add Expression
-view_dynagroup_exprBuilder_comparisonType = Comparison Type
-view_dynagroup_exprBuilder_comparisonType_contains = contains
-view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
-view_dynagroup_exprBuilder_comparisonType_equals = equals
-view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
-view_dynagroup_exprBuilder_comparisonType_tooltip = Comparison Type
-view_dynagroup_exprBuilder_definingPlugin = Defining Plugin
-view_dynagroup_exprBuilder_definingPlugin_tooltip = The plugin to search
-view_dynagroup_exprBuilder_expression = Expression
-view_dynagroup_exprBuilder_expressionType = Expression Type
-view_dynagroup_exprBuilder_expressionType_pluginConfig = Plugin Configuration
-view_dynagroup_exprBuilder_expressionType_resource = Resource
-view_dynagroup_exprBuilder_expressionType_resourceCategory = Resource Category
-view_dynagroup_exprBuilder_expressionType_resourceConfig = Resource Configuration
-view_dynagroup_exprBuilder_expressionType_resourceType = Resource Type
-view_dynagroup_exprBuilder_expressionType_tooltip = The type of property this expression switches on:<br/> <b>Resource</b>: A resource property such as its name or version<br/> <b>Resource Type</b>: Search for resources of a specific type<br/> <b>Resource Category</b>: Search for resources by category: platform, server, service<br/> <b>Trait</b>: Resources that have selected values for a monitored trait<br/> <b>Plugin Configuration</b>: Search by the plugin component configuration setting of the component<br/> <b>Resource Configuration</b>: Search by the configuration setting of the managed resource
-view_dynagroup_exprBuilder_expressionType_trait = Trait
-view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
-view_dynagroup_exprBuilder_groupBy = Group by
-view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
-view_dynagroup_exprBuilder_noPlugins = --No plugins--
-view_dynagroup_exprBuilder_noProperties = --No properties--
-view_dynagroup_exprBuilder_noResourceTypes = --No resource types--
-view_dynagroup_exprBuilder_pluginLoadFailure = Cannot get the list of plugins
-view_dynagroup_exprBuilder_propLoadFailure = Cannot get list of properties
-view_dynagroup_exprBuilder_propertyName = Property Name
-view_dynagroup_exprBuilder_propertyName_tooltip = The name of the property to query. This is defined by the expression type as well as the resource type.
-view_dynagroup_exprBuilder_resTypeLoadFailure = Cannot get list of resource types for plugin [{0}]
-view_dynagroup_exprBuilder_resource = Resource
-view_dynagroup_exprBuilder_resourceType = Resource Type
-view_dynagroup_exprBuilder_resourceType_tooltip = The type of resource
-view_dynagroup_exprBuilder_resource_child = Child
-view_dynagroup_exprBuilder_resource_grandparent = Grandparent
-view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
-view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
-view_dynagroup_exprBuilder_resource_parent = Parent
-view_dynagroup_exprBuilder_resource_resource = Resource
-view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
-view_dynagroup_exprBuilder_title = Expression Builder
-view_dynagroup_exprBuilder_unset = Unset
-view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
-view_dynagroup_exprBuilder_value_tooltip = The string value for the expression to query
-view_dynagroup_expression = Expression
-view_dynagroup_expressionBuilderIconTooltip = Expression Builder...
-view_dynagroup_expressionSet = Expression Set
-view_dynagroup_lastCalculationTime = Last Calculation Time
-view_dynagroup_loadDefinitionFailure = Failed to load group definition [{0}]
-view_dynagroup_loadDefinitionMissing = There is no group definition with the ID of [{0}]
-view_dynagroup_mixed = Mixed
-view_dynagroup_newGroupDefinition = New Group Definition
-view_dynagroup_nextCalculationTime = Next Calculation Time
-view_dynagroup_permDenied = You do not have permission to view group definitions
-view_dynagroup_recalcFailure = Failed to recalculated this group definition
-view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions
-view_dynagroup_recalcSuccessful = You have successfully recalculated this group definition
-view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions
-view_dynagroup_recalculate = Recalculate
-view_dynagroup_recalculationInterval = Recalculation Interval (ms)
-view_dynagroup_recursive = Recursive
-view_dynagroup_saveAndRecalculate = Save & Recalculate
-view_dynagroup_saveFailure = Failed to save the group definition named [{0}]
-view_dynagroup_saveSuccessful = You have successfully saved the group definition named [{0}]
-view_dynagroup_singleSaveFailure = An error occurred - there should have been one created, but instead there were [{0}] created
-view_dynagroup_template_customExpression = Custom Expression...
-view_dynagroup_template_downedResources = All resources currently down
-view_dynagroup_template_jbossas4_clusters = JBossAS 4 - Clusters
-view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
-view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
-view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
-view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
-view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - Clusters
-view_dynagroup_template_platforms = Platform resources in inventory
-view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
-view_groupConfigEdit_member = Member
-view_groupConfigEdit_noListProps = List properties are not currently supported for group configurations.
-view_groupConfigEdit_setAll = Set all values to:
-view_groupConfigEdit_tooltip_1 = Member values differ - click icon to edit them.
-view_groupConfigEdit_unset = Unset
-view_groupConfigEdit_valsDiff = member values differ
-view_groupConfigEdit_valsDiffForProp = Member Values for Property [{0}]
-view_groupCreateWizard_createFailure = Failed to create the resource group
-view_groupCreateWizard_createStepName = Group Settings
-view_groupCreateWizard_createStep_recursive = Recursive
-view_groupCreateWizard_createSuccessful_concise = You have created a new resource group. [<a href="{0}">View Group</a>]
-view_groupCreateWizard_createSuccessful_full = You have created a new [{0}] resource group with the name [{1}] that contains [{2}] member resources
-view_groupCreateWizard_membersStepName = Select Members
-view_groupCreateWizard_title = Create Group
-view_groupCreateWizard_windowTitle = Create Group
-view_groupInventoryMembers_button_updateMembership = Update Membership...
-view_groupInventoryMembers_title_updateMembership = Update Membership
-view_group_detail_failLoad = Failed to load group for group with ID [{0}]
-view_group_detail_failLoadComp = Failed to load group composite for group with ID [{0}]
-view_group_detail_failRecursiveChange = Failed to update the recursive setting for group [{0}]
-view_group_detail_recursiveChange = You successfully changed the recursive setting for group [{0}]
-view_group_inventory_activity_no_recent_metrics = This group has no recent metrics
-view_group_meas_schedules_title = Group Metric Collection Schedules
-view_group_membership_failFetch = Failed to fetch Resource Group
-view_group_membership_saveFailure = Failed to update membership of group [{0}]
-view_group_membership_saveSuccessful = You have updated the membership of group [{0}]
-view_group_operationScheduleDetails_failedToLoadMembers = Failed to load group member Resources.
-view_group_operationScheduleDetails_field_execute = Execute
-view_group_operationScheduleDetails_field_haltOnFailure = Halt on Failure?
-view_group_operationScheduleDetails_memberResource = Member Resource
-view_group_operationScheduleDetails_value_parallel = in parallel
-view_group_operationScheduleDetails_value_sequential = in the order specified below (drag and drop member Resources to change order)
-view_group_pluginConfig_edit_currentGroupProperties = Current Group Properties
-view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]
-view_group_pluginConfig_edit_noperm = You do not have permission to edit this group connection settings
-view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]
-view_group_pluginConfig_edit_saveInitiated_concise = The group connection setting updates have been initiated
-view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]
-view_group_pluginConfig_edit_saveTooltip = Update the connection settings of all group members
-view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved
-view_group_pluginConfig_members_fetchFailure = Failed to get plugin config update history for members of group [{0}]
-view_group_pluginConfig_members_fetchFailureConn = Failed to retrieve member connection settings for [{0}]
-view_group_pluginConfig_members_fetchFailureConnInProgress = A group plugin configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
-view_group_pluginConfig_members_statusDetails = Status Details
-view_group_pluginConfig_members_statusFailure = This configuration update failed for an unknown reason
-view_group_pluginConfig_members_statusInprogress = This configuration update is still in progress
-view_group_pluginConfig_members_statusNochange = No changes were made to this configuration
-view_group_pluginConfig_members_statusSuccess = This configuration update was successful
-view_group_pluginConfig_members_title = Group Connection Settings Member Histories
-view_group_pluginConfig_table_clickStatusIcon = Click the status icon for full details
-view_group_pluginConfig_table_deleteFailure = Failed to delete group plugin config history
-view_group_pluginConfig_table_deleteSuccessful = You have deleted [{0}] history items
-view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
-view_group_pluginConfig_table_msg1 = View Member History for status of each individual resource
-view_group_pluginConfig_table_statusDetails = Status Details
-view_group_pluginConfig_table_statusFailure = This group configuration update failed
-view_group_pluginConfig_table_statusInprogress = This group configuration update is still in progress
-view_group_pluginConfig_table_statusNochange = No changes were made to this group configuration
-view_group_pluginConfig_table_statusSuccess = This group configuration update was successful
-view_group_pluginConfig_table_title = Group Connection Settings History
-view_group_pluginConfig_table_viewMemberHistory = View Member History
-view_group_pluginConfig_table_viewSettings = View Settings
-view_group_pluginConfig_view_groupProperties = Group Properties
-view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings
-view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]
-view_group_resConfig_edit_loadFail = Failed to retrieve member Resource configurations for [{0}]
-view_group_resConfig_edit_noperm = You do not have permission to edit this group configuration
-view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for [{0}] compatible group named [{1}]
-view_group_resConfig_edit_saveInitiated_concise = The group configuration updates have been initiated
-view_group_resConfig_edit_saveInitiated_full = The group configuration updates have been initiated for the [{0}] compatible group named [{1}]
-view_group_resConfig_edit_saveTooltip = Update the configurations of all group members
-view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved
-view_group_resConfig_members_fetchFailure = Failed to get resource config update history for members of group [{0}]
-view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource configuration settings for [{0}]
-view_group_resConfig_members_fetchFailureConfigInProgress = A group resource configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
-view_group_resConfig_members_statusDetails = Status Details
-view_group_resConfig_members_statusFailure = This configuration update failed for an unknown reason
-view_group_resConfig_members_statusInprogress = This configuration update is still in progress
-view_group_resConfig_members_statusNochange = No changes were made to this configuration
-view_group_resConfig_members_statusSuccess = This configuration update was successful
-view_group_resConfig_members_title = Group Resource Configuration Member Histories
-view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
-view_group_resConfig_table_deleteFailure = Failed to delete group resource config history
-view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
-view_group_resConfig_table_failFetch = Failed to get group resource config history
-view_group_resConfig_table_msg1 = View Member History for status of each individual resource
-view_group_resConfig_table_statusDetails = Status Details
-view_group_resConfig_table_statusFailure = This group configuration update failed
-view_group_resConfig_table_statusInprogress = This group configuration update is still in progress
-view_group_resConfig_table_statusNochange = No changes were made to this group configuration
-view_group_resConfig_table_statusSuccess = This group configuration update was successful
-view_group_resConfig_table_title = Group Resource Configuration History
-view_group_resConfig_table_viewMemberHistory = View Member History
-view_group_resConfig_table_viewSettings = View Settings
-view_group_resConfig_view_groupProperties = Group Properties
-view_group_resConfig_view_noperm = You do not have permissions to see the resource configuration settings
-view_group_summary_compatible = Compatible
-view_group_summary_descUpdateFailure = Failed to change the description of the resource group with ID [{0}]
-view_group_summary_descUpdateSuccessful = You have changed the description of this resource group
-view_group_summary_dynamic = Dynamic
-view_group_summary_dynamicNote = Dynamic group names and descriptions are managed, and therefore are not editable
-view_group_summary_groupDefinition = Group Definition
-view_group_summary_memberCount = Member Count
-view_group_summary_memberType = Member Type
-view_group_summary_mixed = Mixed
-view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]
-view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]
-view_group_summary_recursive = Recursive
-view_helpTop_description = This section provides access to documentation, tutorials, version, and other helpful information.
-view_help_section_product = Product
-view_help_section_product_about = About
-view_inventory_adq = Discovery Queue
-view_inventory_allGroups = All Groups
-view_inventory_allResources = All Resources
-view_inventory_collectionInterval = Collection Interval
-view_inventory_dynagroupDefs = Dynagroup Definitions
-view_inventory_eventDetails_loadFailed = An error occurred loading the event details
-view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]
-view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]
-view_inventory_eventHistory_details = Details
-view_inventory_eventHistory_detailsFilter = Details Filter
-view_inventory_eventHistory_groupEventHistory = Group Event History
-view_inventory_eventHistory_purgeFailed = Failed to purge events for [{0}]
-view_inventory_eventHistory_purgeSuccessful = You have successfully purged [{0}] events for [{1}]
-view_inventory_eventHistory_resourceEventHistory = Resource Event History
-view_inventory_eventHistory_severity = Severity
-view_inventory_eventHistory_severityFilter = Severity Filter
-view_inventory_eventHistory_sourceFilter = Source Filter
-view_inventory_eventHistory_sourceLocation = Source Location
-view_inventory_eventHistory_timestamp = Timestamp
-view_inventory_groups = Groups
-view_inventory_groups_children = Children
-view_inventory_groups_deleteFailed = Failed to delete the selected resource groups
-view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
-view_inventory_groups_descendants = Descendants
-view_inventory_groups_loadFailed = Failed to load group composite data
-view_inventory_groups_resourceGroups = Resource Groups
-view_inventory_mixed = mixed
-view_inventory_platforms = Platforms
-view_inventory_problemGroups = Problem Groups
-view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible
-view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?
-view_inventory_resources_deleteFailed = Failed to delete the selected resources
-view_inventory_resources_deleteSuccessful = You have successfully deleted the selected resources
-view_inventory_resources_loadFailed = Failed to load resource composite data
-view_inventory_resources_title = Resources
-view_inventory_resources_title_children = Child Resources
-view_inventory_resources_title_members = Member Resources
-view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
-view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
-view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
-view_inventory_sectionHelp = From this section, newly discovered Resources, inventoried Resources, and Groups can be viewed and managed.
-view_inventory_servers = Servers
-view_inventory_services = Services
-view_inventory_summary_agent_error1 = Failed to locate agent managing resource id
-view_inventory_summary_agent_error2 = Failed to ping agent managing resource id
-view_inventory_summary_agent_error3 = You do not have permission to view details for this Agent.
-view_inventory_summary_agent_fullEnpoint = Full Endpoint
-view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!
-view_inventory_summary_agent_last_title = Last Received Availability Report
-view_inventory_summary_agent_status_title = Agent Communications Status
-view_inventory_summary_agent_title = Agent Managing this Resource
-view_inventory_unavailableServers = Unavailable Servers
-view_leftNav_unknownPage = Unknown page name [{0}] for section [{1}] - URL is invalid.
-view_login_invalidEmail = Invalid e-mail address
-view_login_login = Login
-view_login_logout = Logout
-view_login_noBackend = The backend datasource is unavailable.
-view_login_noLdap = Note: Optional retrieval of ldap details unsuccessful. Manual entry is required.
-view_login_noUser = The username or password provided does not match our records.
-view_login_prompt = Please Login
-view_login_registerLater = (Cancel - Complete registration later.)
-view_login_registerLdapSuccess = Successfully registered the new LDAP User.
-view_login_registerUser = Register User
-view_login_welcome = Welcome
-view_login_welcomeMsg = Welcome to RHQ! <br/><br/> Enter/update the following fields to complete your registration process.<br/> Once you click "OK", you will be logged in.<br/><br/>
-view_measureRange_last = Time Range - Previous
-view_measureRange_simple = Simple...
-view_measureRange_start = Time Range - Start
-view_measureTable_chartMetricValues = Chart Selected Metrics
-view_measureTable_getLive = Get Live Value
-view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
-view_measureTable_live_title = Live Data
-view_measure_nan = --no data available--
-view_measurementOob_title = Suspect Metrics
-view_menuBar_logout = Logout
-view_messageCenter_clearAllMessages = Clear All Messages
-view_messageCenter_lastNMessages = Last {0} Messages
-view_messageCenter_maxMessages = Max Messages
-view_messageCenter_messageBarShowDetails = Show Details
-view_messageCenter_messageDetail = Detail
-view_messageCenter_messageSeverity = Severity
-view_messageCenter_messageTime = Time
-view_messageCenter_messageTitle = Message Center
-view_messageCenter_noRecentMessages = No Recent Messages
-view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
-view_metric_traits = Traits
-view_metric_viewTraitHistory = Value History for Trait [{0}]
-view_operationHistoryDetails_dateCompleted = Date Completed
-view_operationHistoryDetails_dateSubmitted = Date Submitted
-view_operationHistoryDetails_error_fetchFailure = Failure loading operation history.
-view_operationHistoryDetails_noResults = This operation does not return any results.
-view_operationHistoryDetails_operation = Operation
-view_operationHistoryDetails_parameters = Parameters
-view_operationHistoryDetails_requestor = Requestor
-view_operationHistoryDetails_results = Results
-view_operationHistoryDetails_status = Status
-view_operationHistoryList_button_forceDelete = Force Delete
-view_operationHistoryList_button_runOperation = Run Operation
-view_operationHistoryList_notYetStarted = not yet started
-view_operationHistoryList_title = Operation History
-view_operationScheduleDetails_enterParametersBelow = Enter parameters below...
-view_operationScheduleDetails_fieldDefault_description = Select an operation to see its description.
-view_operationScheduleDetails_fieldDefault_parameters = Select an operation to see its parameters.
-view_operationScheduleDetails_fieldHelp_description = an optional description of this scheduled operation (e.g. nightly maintenance app server restart)
-view_operationScheduleDetails_fieldHelp_timeout = a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated
-view_operationScheduleDetails_field_description = Description
-view_operationScheduleDetails_field_parameters = Parameters
-view_operationScheduleDetails_field_timeout = Timeout
-view_operationScheduleDetails_noParameters = This operation does not take any parameters.
-view_operationScheduleDetails_operationSchedule = Operation Schedule
-view_portlet_autodiscovery_setting_platforms = discovered platforms
-view_portlet_configure_definitionDesc = The configuration settings for the portlet.
-view_portlet_configure_definitionTitle = Portlet Configuration
-view_portlet_configure_needed = Click the Settings button to configure this portlet.
-view_portlet_configure_notNeeded = Configuration is not necessary for this portlet.
-view_portlet_defaultName_autodiscovery = Discovery Queue
-view_portlet_defaultName_favoriteResources = Favorite Resources
-view_portlet_defaultName_groupMetric = Resource Group Metric Graph
-view_portlet_defaultName_group_alerts = Group: Alerts
-view_portlet_defaultName_group_bundles = Group: Bundle Deployments
-view_portlet_defaultName_group_config_updates = Group: Configuration Updates
-view_portlet_defaultName_group_events = Group: Event Counts
-view_portlet_defaultName_group_metrics = Group: Metrics
-view_portlet_defaultName_group_oobs = Group: OOB Conditions
-view_portlet_defaultName_group_operations = Group: Operations
-view_portlet_defaultName_group_pkg_hisory = Group: Package History
-view_portlet_defaultName_inventorySummary = Inventory Summary
-view_portlet_defaultName_mashup = Mashup
-view_portlet_defaultName_message = Message
-view_portlet_defaultName_operations = Recent Operations
-view_portlet_defaultName_platformSummary = Platform Utilization
-view_portlet_defaultName_problemResources = Alerted or Unavailable Resources
-view_portlet_defaultName_recentAlerts = Recent Alerts
-view_portlet_defaultName_recentlyAddedResources = Recently Added Resources
-view_portlet_defaultName_resourceMetric = Resource Metric Graph
-view_portlet_defaultName_resource_alerts = Resource: Alerts
-view_portlet_defaultName_resource_bundles = Resource: Bundle Deployments
-view_portlet_defaultName_resource_config_updates = Resource: Configuration Updates
-view_portlet_defaultName_resource_events = Resource: Event Counts
-view_portlet_defaultName_resource_metrics = Resource: Measurements
-view_portlet_defaultName_resource_oobs = Resource: OOB Metrics
-view_portlet_defaultName_resource_operations = Resource: Operations
-view_portlet_defaultName_resource_pkg_hisory = Resource: Package History
-view_portlet_defaultName_tagCloud = Tag Cloud
-view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
-view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
-view_portlet_graph_configure_resource_graph = The resource to graph
-view_portlet_help_autodiscovery = This portlet allows import or ignore of newly discovered resources. Imported resources are added to inventory for monitoring and management. Ignored resources are not imported and are hidden from view unless explicitly unignored.
-view_portlet_help_bundle_deps = This portlet shows relevant bundle deployments based on display criteria configured.
-view_portlet_help_config_updates = This portlet displays recent configuration changes consistent with configuration settings.
-view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
-view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
-view_portlet_help_graph = This portlet displays the resource metric graph.
-view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
-view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
-view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
-view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
-view_portlet_help_none = There is no help available for this portlet.
-view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
-view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
-view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
-view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
-view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
-view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
-view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
-view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
-view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
-view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
-view_portlet_inventory_error1 = Failed to retrieve inventory summary
-view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
-view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
-view_portlet_message_title = The message to display.
-view_portlet_operations_config_completed = completed operations
-view_portlet_operations_config_completed_enable = Whether to enable completed operations results grouping for dashboard.
-view_portlet_operations_config_completed_maximum = Maximum number of Completed operations to display.
-view_portlet_operations_config_scheduled_enable = Whether to enable scheduled operations results grouping for dashboard.
-view_portlet_operations_config_scheduled_maximum = Maximum number of Scheduled operations to display.
-view_portlet_operations_config_show_last = show Last
-view_portlet_operations_config_show_next = show Next
-view_portlet_operations_disabled = (Results currently disabled. Change settings to enable results.
-view_portlet_platform_platform_error_1 = Failed to load platform metrics
-view_portlet_platform_type_error_1 = Could not load type data
-view_portlet_problemResources_config_display_maximum = Maximum number of Problem resources to display.
-view_portlet_problemResources_config_display_range = Show problem resources going back this many hours.
-view_portlet_problemResources_config_display_range2 = From {0} to {1}
-view_portlet_problemResources_maxDisplaySetting = maximum resources.
-view_portlet_recentAlerts_config_members = Select Members
-view_portlet_recentAlerts_config_priority_label = priority Alerts,
-view_portlet_recentAlerts_config_when = within the past
-view_portlet_recentAlerts_fail_msg = Failed to load resources assigned for alert filtering.
-view_portlet_recentlyAdded_error1 = Failed to load recently added resources
-view_portlet_recentlyAdded_setting_addedPlatforms = recently added platforms
-view_portlet_results_empty = No results found using specified criteria.
-view_remoteAgentInstall_agentStatus = Agent Status
-view_remoteAgentInstall_agentStatusDefault = -Click Update Status Button-
-view_remoteAgentInstall_buttonFindAgent = Find Agent
-view_remoteAgentInstall_connInfo = Connection Information
-view_remoteAgentInstall_error_1 = Error occurred while trying to find agent install path
-view_remoteAgentInstall_error_2 = Could not find an agent installed when looking in common locations
-view_remoteAgentInstall_error_3 = Could not find an agent installed at or under [{0}]
-view_remoteAgentInstall_error_4 = Failed to install agent
-view_remoteAgentInstall_error_5 = Failed to start agent
-view_remoteAgentInstall_error_6 = Failed to stop agent
-view_remoteAgentInstall_installAgent = Install Agent
-view_remoteAgentInstall_installInfo = Agent Installation Information
-view_remoteAgentInstall_installPath = Agent Install Path
-view_remoteAgentInstall_owner = Owner
-view_remoteAgentInstall_promptHost = The host where the agent is or will be installed
-view_remoteAgentInstall_promptInstallPath = Where the agent is or will be installed. If you aren''t sure where an agent is installed, enter a parent directory and click the ''Find Agent'' button to scan that directory and below. If you enter an empty path, common locations are searched on the host for an agent install.
-view_remoteAgentInstall_promptPassword = The credentials that are used to authenticate the user on the host via SSH
-view_remoteAgentInstall_promptPort = The port the SSH server is listening to. If not specified, the default is 22
-view_remoteAgentInstall_promptUser = The name of the user whose credentials are passed to the host via SSH
-view_remoteAgentInstall_result = Result
-view_remoteAgentInstall_resultCode = ResultCode
-view_remoteAgentInstall_startAgent = Start Agent
-view_remoteAgentInstall_startAgentResults = Agent start results: [{0}]
-view_remoteAgentInstall_step = Step
-view_remoteAgentInstall_stopAgent = Stop Agent
-view_remoteAgentInstall_stopAgentResults = Agent stop results: [{0}]
-view_remoteAgentInstall_success = Agent installation complete
-view_remoteAgentInstall_updateStatus = Update Status
-view_reportsTop_description = This section provides access to global reports.
-view_reportsTop_title = Reports
-view_reports_alertDefinitions = Alert Definitions
-view_reports_alertDefinitions_parentHover = Click to go to the parent alert definition
-view_reports_alertDefinitions_resTypeLoadError = Cannot get the template resource type - unable to view the alert template.
-view_reports_inventorySummary_failFetch = Failed to get inventory summary
-view_reports_platforms = Platform Utilization
-view_reports_subsystems = Subsystems
-view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.
-view_resourceResourceGroupList_error_updateFailure = Failed to update assigned Resource groups.
-view_resourceResourceGroupList_message_updateSuccess = Group membership updated for [{0}].
-view_resource_inventory_activity_changed_by = Changed by
-view_resource_inventory_activity_criteria_no_recent_events = No event counts based off display criteria.
-view_resource_inventory_activity_no_recent_alerts = No recent alerts
-view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
-view_resource_inventory_activity_no_recent_config_history = No configuration change history
-view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
-view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
-view_resource_inventory_activity_no_recent_oob = No OOB conditions found
-view_resource_inventory_activity_no_recent_operations = No recent operation history
-view_resource_inventory_activity_no_recent_pkg_history = No recent package history
-view_resource_inventory_childhistory_createdChild = Created Child
-view_resource_inventory_childhistory_deletedChild = Deleted Child
-view_resource_inventory_childhistory_filterTitle = Past N Days
-view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
-view_resource_inventory_childhistory_status_invalidConfig = Invalid Configuration
-view_resource_monitor_availability_loadFailed = Failed to load availability history
-view_resource_monitor_calltime_average = Average
-view_resource_monitor_calltime_count = Count
-view_resource_monitor_calltime_destination = Call Destination
-view_resource_monitor_calltime_editFailed = Call time data can not be edited
-view_resource_monitor_calltime_loadFailed = Could not load call time data
-view_resource_monitor_calltime_lookupFailed = Could not load resource for call time
-view_resource_monitor_calltime_maximum = Maximum
-view_resource_monitor_calltime_minimum = Minimum
-view_resource_monitor_calltime_title = Call Time Data
-view_resource_monitor_calltime_total = Total
-view_resource_monitor_detailed_graph_label = Detailed Graph
-view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
-view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
-view_resource_monitor_graphs_loadFailed = Failed to load graph data
-view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
-view_resource_monitor_graphs_noneAvailable = No graphs available
-view_resource_monitor_schedules_title = Resource Metric Collection Schedules
-view_resource_monitor_table_alerts = Alerts
-view_resource_monitor_table_avg = Average
-view_resource_monitor_table_last = Last
-view_resource_monitor_table_max = Maximum
-view_resource_monitor_table_min = Minimum
-view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details
-view_resource_title_tagUpdateFailed = Failed to update resource tags
-view_searchBar_defaultPattern = name your pattern
-view_searchBar_error_selectSavedSearch = ''Error selecting saved search''
-view_searchBar_query = Query
-view_searchBar_resourceGroups = Resource Groups
-view_searchBar_resources = Resources
-view_searchBar_welcomeMessage = search for {0}s
-view_searchGUI_loginStatus = Unable to determine login status, check server status
-view_selector_assigned = Assigned {0}
-view_selector_available = Available {0}
-view_subTab_error_disabled = Cannot select disabled subTab [{0}].
-view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
-view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_traitsLoadFailure = Failed to load traits for {0}.
-view_summaryOverviewForm_field_description = Description
-view_summaryOverviewForm_field_location = Location
-view_summaryOverviewForm_field_name = Name
-view_summaryOverviewForm_field_type = Type
-view_summaryOverviewForm_field_version = Version
-view_summaryOverviewForm_header_summary = Summary
-view_summaryOverviewForm_label_plugin = Plugin:
-view_summaryOverviewForm_label_type = Type:
-view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverview_header_detectedErrors = Detected Errors
-view_summaryOverview_title_errorDetailsWindow = Error Details
-view_summaryOverview_tooltip_detectedErrors = Click on the rows to see the error details.
-view_tableSection_backButton = Back to List
-view_tableSection_error_badId = Can not show detail for [{0}]. Illegal 'id': [{1}]. Please report this bug
-view_tableSection_error_noId = Table [{0}] record is missing 'id' attribute - please report this bug.
-view_table_drawFail = Failed to draw Table [{0}].
-view_table_matchingRows = Matching Rows: {0} (selected: {1})
-view_table_totalRows = Total Rows: {0} (selected: {1})
-view_tabs_common_activity = Activity
-view_tabs_common_agent = Agent
-view_tabs_common_alerts = Alerts
-view_tabs_common_availability = Availability
-view_tabs_common_calltime = Calltime
-view_tabs_common_child_history = Child History
-view_tabs_common_child_resources = Child Resources
-view_tabs_common_configuration = Configuration
-view_tabs_common_connectionSettings = Connection Settings
-view_tabs_common_connectionSettingsHistory = Connection Settings History
-view_tabs_common_content = Content
-view_tabs_common_current = Current
-view_tabs_common_dashboard = Dashboard
-view_tabs_common_definitions = Definitions
-view_tabs_common_deployed = Deployed
-view_tabs_common_events = Events
-view_tabs_common_graphs = Graphs
-view_tabs_common_group_members = Group Members
-view_tabs_common_group_membership = Group Membership
-view_tabs_common_groups = Groups
-view_tabs_common_history = History
-view_tabs_common_inventory = Inventory
-view_tabs_common_members = Members
-view_tabs_common_monitoring = Monitoring
-view_tabs_common_new = New
-view_tabs_common_operations = Operations
-view_tabs_common_overview = Overview
-view_tabs_common_schedule = Schedule
-view_tabs_common_schedules = Schedules
-view_tabs_common_subscriptions = Subscriptions
-view_tabs_common_summary = Summary
-view_tabs_common_tables = Tables
-view_tabs_common_timeline = Timeline
-view_tabs_common_traits = Traits
-view_tabs_invalidSubTab = Invalid subtab: {0}
-view_tabs_invalidTab = Invalid tab: {0}
-view_tagCloud_deleteTag = Delete Tag
-view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
-view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
-view_tagCloud_error_fetchFailure = Failed to load tags.
-view_tagCloud_error_tagUsedCount = Tag used {0} times.
-view_tagCloud_title = Tag Cloud
-view_taggedResources_title = Resources
-view_tags_error_1 = Failed to load Tags
-view_tags_tags = Tags
-view_tags_tooltip_1 = Click to remove this Tag
-view_tags_tooltip_2 = Click to edit Tags
-view_tags_tooltip_3 = Enter a Tag in the format: (namespace:)(semantic=)tagname (e.g. it:env=QA, or owner=John)
-view_testTop_description = This section contains pages for testing various GUI components.
-view_testTop_title = Test
-view_titleBar_common_addedFav = You have added [{0}] as a favorite
-view_titleBar_common_addedFavFailure = Failed to add [{0}] as a favorite
-view_titleBar_common_clickToAddFav = Click to add this as a favorite
-view_titleBar_common_clickToRemoveFav = Click to remove this as a favorite
-view_titleBar_common_loadTagsFailure = Failed to load the tags for [{0}]
-view_titleBar_common_removedFav = You have removed [{0}] as one of your favorites
-view_titleBar_common_removedFavFailure = Failed to remove [{0}] as one of your favorites
-view_titleBar_common_updateTagsFailure = Failed to update the tags for [{0}]
-view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have been updated
-view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
-view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
-view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
-view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]
-view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration
-view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource Configuration
-view_tree_common_contextMenu_groupGraph = Group Metric Graph
-view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
-view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboards
-view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
-view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
-view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children
-view_tree_common_contextMenu_measurements = Measurements
-view_tree_common_contextMenu_operations = Operations
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
-view_tree_common_contextMenu_resourceConfiguration = Resource Configuration
-view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
-view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard
-view_tree_common_contextMenu_saveChartToDashboardSuccessful = You have saved dashboard [{0}]
-view_tree_common_contextMenu_type_name_label = Type: {0}
-view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
-view_tree_common_loadFailed_children = Failed to load children for node
-view_tree_common_loadFailed_create = Failed to create view for this node
-view_tree_common_loadFailed_descendants = Failed to load descendants for tree
-view_tree_common_loadFailed_generic = Failed to load data for tree
-view_tree_common_loadFailed_group = Failed to load group with id [{0}]
-view_tree_common_loadFailed_groupTree = Failed to load group tree
-view_tree_common_loadFailed_node = Failed to load data for this node
-view_tree_common_loadFailed_root = Failed to load root for tree
-view_tree_common_loadFailed_selection = Failed to select this node
-view_tree_common_loadFailed_update = Failed to update view for this node
-view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
-view_type_parentId = Parent ID
-view_type_resourceTypes = Resource Types
-view_type_typeTreeLoadFailure = Failed to load resource type tree data
-view_upload_alreadyUploaded = File has already been uploaded
-view_upload_bundleDistFile = Distribution File
-view_upload_error_bundleDistFile = Error uploading Bundle Distribution File
-view_upload_error_file = Error uploading file
-view_upload_error_fileName = Error uploading file [{0}]
-view_upload_error_fileName_2 = Error uploading file [{0}], check for invalid file path.
-view_upload_error_packageVersionFile = Error uploading Package Version File
-view_upload_error_results = Error uploading file, unexpected results: [{0}]
-view_upload_inProgress = Can not submit, upload is currently in progress
-view_upload_prompt_1 = Please select a file to upload [{0}]
-view_upload_prompt_2 = File to Upload
-view_upload_success = File successfully uploaded
-view_upload_tooltip_1a = Select a file to upload, then click Upload or Next
-view_upload_tooltip_1b = Select a file to upload, then click Next
-view_upload_tooltip_2 = File upload had previously failed
-view_upload_upload = Upload
-view_upload_uploadFile = UploadFile
-
-widget_colorPicker_tooltip = Click to select a new color
-widget_durationItem_inputUnitLessThanTargetUnit = Input unit is less than target unit.
-widget_durationItem_unitTypeNotSupported = Unit type [{0}] is not supported by this DurationItem.
-widget_jobTriggerEditor_fieldHelp_repeatDuration = keep running this operation this many times or until this amount of time has elapsed
-widget_jobTriggerEditor_fieldHelp_repeatInterval = how often the operation should be executed
-widget_jobTriggerEditor_fieldHelp_startDelay = start executing the operation after this amount of time has elapsed
-widget_jobTriggerEditor_field_cronExpression = Cron Expression
-widget_jobTriggerEditor_field_mode = Schedule using
-widget_jobTriggerEditor_field_repeatInterval_later = Repeat every
-widget_jobTriggerEditor_field_repeatInterval_now = Run now and every
-widget_jobTriggerEditor_field_startType = Run
-widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = End time must be after start time.
-widget_jobTriggerEditor_message_endTimeMustBeInFuture = End time must be in the future.
-widget_jobTriggerEditor_message_startTimeMustBeInFuture = Start time must be in the future.
-widget_jobTriggerEditor_tab_examples = Examples
-widget_jobTriggerEditor_tab_format = Format
-widget_jobTriggerEditor_value_calendar = Calendar
-widget_jobTriggerEditor_value_cronExpression = Cron Expression
-widget_jobTriggerEditor_value_for = For
-widget_jobTriggerEditor_value_in = in
-widget_jobTriggerEditor_value_indefinitely = Indefinitely
-widget_jobTriggerEditor_value_later = Later
-widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
-widget_jobTriggerEditor_value_now = Now
-widget_jobTriggerEditor_value_nowAndRepeat = Now & Repeat
-widget_jobTriggerEditor_value_on = on
-widget_jobTriggerEditor_value_until = Until
-widget_recordEditor_error_invalidViewPath = Invalid view path: [{0}]
-widget_recordEditor_error_multipleRecords = Multiple records were returned - expected exactly one.
-widget_recordEditor_error_noRecords = No records were returned - expected exactly one.
-widget_recordEditor_error_operation = Operation failed. An error occurred
-widget_recordEditor_error_operationInvalidValues = Operation failed - one or more fields have invalid values
-widget_recordEditor_error_permissionCreate = You do not have the permissions required to create a new [{0}]
-widget_recordEditor_error_unsupportedOperationType = Unsupported operation type: [{0}]
-widget_recordEditor_info_recordCreatedConcise = {0} created.
-widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created.
-widget_recordEditor_info_recordUpdatedConcise = {0} updated.
-widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
-widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
-widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
-widget_recordEditor_label_loading = Loading...
-widget_recordEditor_title_edit = Edit {0} [{1}]
-widget_recordEditor_title_new = Create New {0}
-widget_recordEditor_title_view = View {0} [{1}]
-widget_recordEditor_warn_validation = One or more fields have invalid values. This [{0}] cannot be saved until these values are corrected
-widget_resourceFactoryWizard_archPrompt = Package Architecture
-widget_resourceFactoryWizard_configTemplatePrompt = Resource Configuration Templates
-widget_resourceFactoryWizard_contentTemplatePrompt = Deployment Time Configuration Templates
-widget_resourceFactoryWizard_createSubmit = A request to create a resource with the name of [{0}] has been submitted successfully.
-widget_resourceFactoryWizard_createSubmitType = A request to create a resource of type [{0}] has been submitted successfully.
-widget_resourceFactoryWizard_createWizardTitle = Create New Resource of Type [{0}]
-widget_resourceFactoryWizard_createWizardWindowTitle = Resource Create Wizard
-widget_resourceFactoryWizard_editConfigStepName = Deployment Options
-widget_resourceFactoryWizard_execute1 = Failed to create a new resource - there is no package version
-widget_resourceFactoryWizard_execute2 = Failed to create a new resource
-widget_resourceFactoryWizard_failedToDeleteVersion = Failed to delete package version while canceling a resource create
-widget_resourceFactoryWizard_failedToGetType = Failed to get backing package type for new resource
-widget_resourceFactoryWizard_importFailure = Failed to manually import resource
-widget_resourceFactoryWizard_importSubmitted = A request to import a new resource of type [{0}] has been submitted
-widget_resourceFactoryWizard_importWizardTitle = Import Resource of Type [{0}]
-widget_resourceFactoryWizard_importWizardWindowTitle = Resource Import Wizard
-widget_resourceFactoryWizard_infoStepName = Resource Information
-widget_resourceFactoryWizard_infoStep_loadFail = Failed to get available Architectures
-widget_resourceFactoryWizard_namePrompt = New Resource Name
-widget_resourceFactoryWizard_templatePrompt = Connection Settings Template
-widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
-widget_resourceFactoryWizard_uploadFailure = Failed to upload file
-widget_resourceFactoryWizard_uploadFileStepName = Upload Resource Content File
-widget_resourceFactoryWizard_uploadInProgress = The upload is in progress... This can take several minutes to complete for large distribution files.
-widget_resourceFactoryWizard_versionPrompt = Package Version
-widget_resourceSelector_groupCategory = Group Category
-widget_resourceSelector_pleaseSelectMultipleResource = Please select one or more resources
-widget_resourceSelector_pleaseSelectResource = Please select a resource
-widget_resourceSelector_selectMultipleResources = Select Resources
-widget_resourceSelector_selectResource = Select a Resource
-widget_typeCache_loadFail = Failed to load resource type metadata
-widget_typeTree_badTemplateType = Invalid URL. Unknown template type [{0}]
-widget_typeTree_badTypeId = Invalid URL. Bad resource type ID [{0}]
-widget_typeTree_loadFail = Failed to load resource types
+#
+# RHQ GUI i18n Messages - Default (English)
+#
+# Developers: See the following wiki page for how to work with this file:
+#
+# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
+#
+###################################
+common_alert_high = High
+common_alert_low = Low
+common_alert_medium = Medium
+common_buildInfo_gwtVersion = ${gwt.version}
+common_button_ack = Acknowledge
+common_button_ack_all = Acknowledge All
+common_button_add = Add
+common_button_advanced = Advanced...
+common_button_apply = Apply
+common_button_cancel = Cancel
+common_button_close = Close
+common_button_compare = Compare
+common_button_create_child = Create Child
+common_button_delete = Delete
+common_button_delete_all = Delete All
+common_button_disable = Disable
+common_button_edit = Edit
+common_button_enable = Enable
+common_button_finish = Finish
+common_button_import = Import
+common_button_new = New
+common_button_next = Next
+common_button_ok = OK
+common_button_previous = Previous
+common_button_purgeAll = Purge All
+common_button_refresh = Refresh
+common_button_reset = Reset
+common_button_save = Save
+common_button_schedule = Schedule
+common_button_search = Search
+common_button_set = Set
+common_button_showDetails = Show Details...
+common_button_uninventory = Uninventory
+common_calendar_april_short = apr
+common_calendar_august_short = aug
+common_calendar_december_short = dec
+common_calendar_february_short = feb
+common_calendar_january_short = jan
+common_calendar_july_short = jul
+common_calendar_june_short = jun
+common_calendar_march_short = mar
+common_calendar_may_short = may
+common_calendar_november_short = nov
+common_calendar_october_short = oct
+common_calendar_september_short = sept
+common_label_ago = ago
+common_label_all = ALL
+common_label_all_resources = all resources
+common_label_day = day
+common_label_days = days
+common_label_hour = hour
+common_label_hours = hours
+common_label_item = item
+common_label_items = items
+common_label_milliseconds = milliseconds
+common_label_minutes = minutes
+common_label_month = month
+common_label_none = none
+common_label_role = role
+common_label_roles = roles
+common_label_scheduled_operations = scheduled operations
+common_label_seconds = seconds
+common_label_selected_resources = selected resources
+common_label_unlimited = unlimited
+common_label_user = user
+common_label_users = users
+common_label_week = week
+common_label_weeks = weeks
+common_label_yesterday = Yesterday
+common_msg_areYouSure = Are You Sure?
+common_msg_asyncTimeout = {0}. This occurred because the server is taking a long time to complete this request. Please be aware that the server may still be processing your request and it may complete shortly. You can check the server logs to see if any abnormal errors occurred.
+common_msg_changeAutoDetected = Change auto-detected
+common_msg_deleteConfirm = Are you sure you want to delete the # selected {0}?
+common_msg_emphasizedNotePrefix = NOTE:
+common_msg_loading = Loading...
+common_msg_noItemsToShow = No items to show
+common_msg_notYetImplemented = Not Yet Implemented
+common_msg_see_more = see more...
+common_msg_step_x_of_y = Step {0} of {1}
+common_severity_debug = Debug
+common_severity_error = Error
+common_severity_fatal = Fatal
+common_severity_info = Info
+common_severity_warn = Warn
+common_status_canceled = Canceled
+common_status_deferred = Deferred
+common_status_failed = Failed
+common_status_inprogress = In Progress
+common_status_nochange = No Change
+common_status_partial = Partial
+common_status_success = Success
+common_status_timedOut = Timed Out
+common_status_unknown = Unknown
+common_title_add_column = Add Column
+common_title_add_graph_to_view = Add Graph to Monitor View
+common_title_add_portlet = Add Portlet
+common_title_address = Address
+common_title_alert_range = Alert Range
+common_title_ancestry = Ancestry
+common_title_availability = Availability
+common_title_available_resources = Available Resources
+common_title_average_metrics = Average Metrics per Minute
+common_title_background = Background
+common_title_bundle = Bundle
+common_title_bundles = Bundles
+common_title_category = Category
+common_title_change_refresh_time = Refresh Interval
+common_title_columns = Columns
+common_title_compare_metrics = Compare Metrics
+common_title_compatibleGroups = Compatible Groups
+common_title_compatibleGroups_total = Compatible Group Total
+common_title_component_errors = Component Errors
+common_title_config_update_status = Update Status
+common_title_configuration = Configuration
+common_title_count = Count
+common_title_custom = Custom
+common_title_dashboard_name = Dashboard Name
+common_title_dateCreated = Date Created
+common_title_dateRange = Date Range
+common_title_default = Default
+common_title_description = Description
+common_title_details = Details
+common_title_display = Display
+common_title_display_name = Display Name
+common_title_duration = Duration
+common_title_edit_mode = Edit Mode
+common_title_enabled = Enabled?
+common_title_end = End
+common_title_error = Error
+common_title_generalProp = General Properties
+common_title_group = Group
+common_title_group_def_total = Group Definition Total
+common_title_group_member_health = Group Member Health
+common_title_groups = Groups
+common_title_help = Help
+common_title_host = Host
+common_title_id = ID
+common_title_id_parent = Parent ID
+common_title_info = Info
+common_title_inventory = Inventory
+common_title_inventorySummary = Inventory Summary
+common_title_lastUpdated = Last Updated
+common_title_lastUpdatedBy = Last Updated By
+common_title_ldapGroups = LDAP Groups
+common_title_mashup = Mashup
+common_title_members_reporting = Members Reporting
+common_title_message = Message
+common_title_metric = Metric
+common_title_metric_chart = Metric Chart
+common_title_mixedGroups = Mixed Groups
+common_title_mixedGroups_total = Mixed Group Total
+common_title_name = Name
+common_title_new_dashboard = New Dashboard
+common_title_numeric_metrics = Numeric Metrics
+common_title_numeric_type = Numeric Type
+common_title_operation_status = Operation Status
+common_title_operations = Operations
+common_title_operations_range = Operation Range
+common_title_over = Over
+common_title_password = Password
+common_title_path = Path
+common_title_permissions = Permissions
+common_title_platform = Platform
+common_title_platform_total = Platform Total
+common_title_plugin = Plugin
+common_title_port = Port
+common_title_providers = Providers
+common_title_recent_alerts = Recent Alerts
+common_title_recent_bundle_deployments = Recent Bundle Deployments
+common_title_recent_configuration_updates = Recent Configuration Updates
+common_title_recent_event_counts = Recent Event Counts
+common_title_recent_measurements = Recent Measurements
+common_title_recent_oob_metrics = Recent Out of Bound metrics
+common_title_recent_operations = Recent Operations
+common_title_recent_pkg_history = Recent Package History
+common_title_recently_added = Recently Added
+common_title_remove_column = Remove Column
+common_title_repositories = Repositories
+common_title_resource = Resource
+common_title_resourceGroups = Resource Groups
+common_title_resource_group = Resource Group
+common_title_resource_id = Resource ID
+common_title_resource_inventory = Resource Inventory
+common_title_resource_key = Resource Key
+common_title_resource_name = Resource Name
+common_title_resource_type = Resource Type
+common_title_resources = Resources
+common_title_results_count = Results Count
+common_title_results_count_tooltip = Displays this number of results
+common_title_role = Role
+common_title_roles = Roles
+common_title_scheduled_operations = Scheduled Operations
+common_title_search = Search
+common_title_selected_resources = Selected Resources
+common_title_server = Server
+common_title_server_total = Server Total
+common_title_service = Service
+common_title_service_total = Service Total
+common_title_settings = Settings
+common_title_show = Show
+common_title_show_more = Show more...
+common_title_sort_order = Sort Order
+common_title_sort_order_tooltip = Sets sort order for results.
+common_title_start = Start
+common_title_status = Status
+common_title_stop = Stop
+common_title_summary = Summary
+common_title_tag_cloud = Tag Cloud
+common_title_the = The
+common_title_timestamp = Date/Time
+common_title_total = Total
+common_title_type = Type
+common_title_units = Units
+common_title_user = User
+common_title_users = Users
+common_title_value = Value
+common_title_version = Version
+common_title_view_mode = View Mode
+common_title_web_address = Web Address
+common_title_welcome = Welcome
+common_unit_days = days
+common_unit_hours = hours
+common_unit_milliseconds = milliseconds
+common_unit_minutes = minutes
+common_unit_months = months
+common_unit_seconds = seconds
+common_unit_times = times
+common_unit_weeks = weeks
+common_unit_years = years
+common_val_for = for
+common_val_n1st = {0}st
+common_val_n2nd = {0}nd
+common_val_n3rd = {0}rd
+common_val_na = N/A
+common_val_never = Never
+common_val_no = No
+common_val_no_lower = no
+common_val_none = None
+common_val_nth = {0}th
+common_val_yes = Yes
+common_val_yes_lower = yes
+dataSource_ContentRepoTree_error_load = Error loading repositories
+dataSource_ContentRepoTree_field_parentId = Parent ID
+dataSource_bundle_loadFailed = Failed to load Bundle data
+dataSource_configurationHistory_clickToSeeError = Double click to see error message...
+dataSource_configurationHistory_currentConfig = This is the current configuration
+dataSource_configurationHistory_dateCompleted = Date Completed
+dataSource_configurationHistory_dateSubmitted = Date Submitted
+dataSource_configurationHistory_error_fetchFailure = Unable to load configuration history.
+dataSource_configurationHistory_updateType = Update Type
+dataSource_configurationHistory_updateType_group = Group
+dataSource_configurationHistory_updateType_individual = Individual
+dataSource_definitions_loadFailed = Failed to load metric definitions
+dataSource_measurementOob_error_fetchFailure = Failed to load measurement OOB information
+dataSource_measurementOob_field_factor = Out of Range Factor (%)
+dataSource_measurementOob_field_formattedBaseband = Band
+dataSource_measurementOob_field_formattedOutlier = Outlier
+dataSource_measurementOob_field_parentName = Parent
+dataSource_measurementOob_field_resourceName = Resource
+dataSource_measurementOob_field_scheduleName = Metric
+dataSource_operationHistory_error_fetchFailure = Failure loading operation histories.
+dataSource_operationHistory_field_createdTime = Created Time
+dataSource_operationHistory_field_operationName = Operation Name
+dataSource_operationHistory_field_startedTime = Started Time
+dataSource_operationHistory_field_subject = Requester
+dataSource_operationSchedule_field_description = Notes
+dataSource_operationSchedule_field_id = Schedule ID
+dataSource_operationSchedule_field_nextFireTime = Next Execution
+dataSource_operationSchedule_field_operationDisplayName = Operation
+dataSource_operationSchedule_field_operationName = Operation
+dataSource_operationSchedule_field_subject = Owner
+dataSource_operationSchedule_field_timeout = Timeout (in seconds)
+dataSource_platforms_field_cpu = CPU
+dataSource_platforms_field_memory = Memory
+dataSource_platforms_field_swap = Swap
+dataSource_problemResources_error_fetchFailure = Failed to load Resources with alerts/unavailability.
+dataSource_problemResources_field_alerts = Alerts
+dataSource_problemResources_field_available = Current Availability
+dataSource_recentOperations_error_fetchFailure = Failed to load recently completed operations.
+dataSource_recentOperations_field_location = Location
+dataSource_recentOperations_field_operation = Operation
+dataSource_recentOperations_field_resource = Resource
+dataSource_recentOperations_field_status = Status
+dataSource_recentOperations_field_time = Date/Time
+dataSource_resourceErrors_clickStatusIcon = Click the icon for more details
+dataSource_resourceErrors_deleteFailure = Failed to delete resource errors
+dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
+dataSource_resourceErrors_error_fetchFailure = Failed to find Resource errors for Resource with id [{0}].
+dataSource_resourceErrors_field_errorType = Error Type
+dataSource_resourceErrors_field_summary = Summary
+dataSource_resourceErrors_field_timeOccured = Time
+dataSource_resourceGroups_loadFailed = Failed to load Resource Groups
+dataSource_resources_field_discoveryTime = Discovery Time
+dataSource_resources_field_importTime = Import Time
+dataSource_resources_field_key = Key
+dataSource_resources_field_lastModifiedTime = Last Modified Time
+dataSource_resources_field_lastModifier = Last Modifier
+dataSource_resources_field_location = Location
+dataSource_rpc_error_transformRequestFailure = Failure in datasource while processing {0} request.
+dataSource_rpc_error_unsupportedArrayFilterType = No support for passing array filters of type {0}.
+dataSource_rpc_error_unsupportedEnumType = Please add an appropriate code block for enum {0} to RPCDataSource.getEnumArray(Class)
+dataSource_rpc_no = no
+dataSource_rpc_yes = yes
+dataSource_scheduledOperations_error_fetchFailure = Failed to load scheduled operations.
+dataSource_scheduledOperations_field_location = Location
+dataSource_scheduledOperations_field_operation = Operation
+dataSource_scheduledOperations_field_resource = Resource
+dataSource_scheduledOperations_field_time = Date/Time
+dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
+dataSource_schedules_disableSuccessful_full_group = You have disabled the collection of [{0}] measurements for the resource group with ID [{1}]. The disabled measurements are: [{2}]
+dataSource_schedules_disableSuccessful_full_resource = You have disabled the collection of [{0}] measurements for the resource with ID [{1}]. The disabled measurements are: [{2}]
+dataSource_schedules_enableFailure_group = Failed to enable the collection of [{0}] metrics for group with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_enableFailure_resource = Failed to enable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_enableSuccessful_concise = You have enabled the collection of [{0}] measurements
+dataSource_schedules_enableSuccessful_full_group = You have enabled the collection of [{0}] measurements for the resource group with ID [{1}]. The enabled measurements are: [{2}]
+dataSource_schedules_enableSuccessful_full_resource = You have enabled the collection of [{0}] measurements for the resource with ID [{1}]. The enabled measurements are: [{2}]
+dataSource_schedules_field_resourceGroupId = Group ID
+dataSource_schedules_loadFailed = Failed to load metric schedules
+dataSource_schedules_loadFailedContext = Failed to load metric schedules for context [{0}]
+dataSource_schedules_loadFailedCriteria = Failed to load metric schedules for criteria [{0}]
+dataSource_schedules_updateFailure_group = Failed to set the collection interval of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
+dataSource_schedules_updateFailure_resource = Failed to set the collection interval of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
+dataSource_schedules_updateSuccessful_concise = A new collection interval of [{0}] seconds has been set on [{1}] measurements
+dataSource_schedules_updateSuccessful_full_group = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource group with ID [{2}]. The updated measurements are: [{3}]
+dataSource_schedules_updateSuccessful_full_resource = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource with ID [{2}]. The updated measurements are: [{3}]
+dataSource_traits_failFetch = Failed to fetch traits for criteria [{0}].
+dataSource_traits_field_definitionID = Definition ID
+dataSource_traits_field_lastChanged = Last Changed
+dataSource_traits_field_primaryKey = Primary Key
+dataSource_traits_field_trait = Trait
+dataSource_traits_group_field_groupId = Group ID
+dataSource_users_delete = Deleted user [{0}]
+dataSource_users_deleteFailed = Failed to delete user [{0}]
+dataSource_users_field_department = Department
+dataSource_users_field_emailAddress = Email Address
+dataSource_users_field_factive = Login Enabled?
+dataSource_users_field_firstName = First Name
+dataSource_users_field_id = ID
+dataSource_users_field_lastName = Last Name
+dataSource_users_field_ldap = LDAP Login?
+dataSource_users_field_name = User Name
+dataSource_users_field_password = Password
+dataSource_users_field_passwordVerify = Verify Password
+dataSource_users_field_phoneNumber = Phone Number
+dataSource_users_invalidEmailAddress = Invalid email address.
+dataSource_users_passwordsDoNotMatch = Passwords do not match.
+datasource_roles_field_ldapGroups = LDAP Groups
+datasource_roles_field_permissions = Permissions
+datasource_roles_field_resourceGroups = Resource Groups
+datasource_roles_field_subjects = Subjects
+datasource_templateSchedules_disabled = Disabled collection of selected metric [{0}].
+datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_disabled_failed = Failed to disable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled = Enabled collection of selected metric [{0}].
+datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled_failed = Failed to enable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_updated = Updated collection intervals of selected metric [{0}].
+datasource_templateSchedules_updated_detail = Collection interval for metric [{0}] [{1}] by default for ResourceType with id [{2}] set to [{3}] seconds.
+datasource_templateSchedules_updated_failed = Failed to set collection interval to [{0}] seconds for metric [{1}] [{2}] by default for ResourceType with id [{3}].
+favorites = Favorites
+favorites_groups = Favorite Groups
+favorites_recentlyViewed = Recently Viewed
+favorites_resources = Favorite Resources
+group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource
+util_ancestry_parentAncestry = Parent Ancestry for:
+util_errorHandler_nullException = exception was null
+util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status.
+util_rpcManager_activeRequests = {0} Active Requests
+util_userPerm_loadFailGlobal = Failed to load your global permissions - none granted.
+util_userPerm_loadFailGroup = Failed to load your permissions for Resource Group with id [{0}] - none granted.
+util_userPerm_loadFailResource = Failed to load your permissions for Resource with id [{0}] - none granted.
+util_userSession_loadFailSubject = UserSessionManager: Failed to load user Subject
+util_userSession_logoutFail = Failed to logout.
+util_widgetsField_unlimited = Unlimited
+view_aboutBox_allRightsReserved = All Rights Reserved.
+view_aboutBox_buildNumber = Build Number:
+view_aboutBox_failedToLoad = Failed to load product information.
+view_aboutBox_homepage = Homepage
+view_aboutBox_jbossByRedHat = JBoss by Red Hat
+view_aboutBox_title = About {0}
+view_aboutBox_version = Version:
+view_adminConfig_downloads = Downloads
+view_adminConfig_plugins = Plugins
+view_adminConfig_systemSettings = System Settings
+view_adminConfig_templates = Templates
+view_adminContent_contentSources = Content Sources
+view_adminContent_repositories = Repositories
+view_adminRoles_assignedGroups = Assigned Resource Groups
+view_adminRoles_assignedSubjects = Assigned Subjects
+view_adminRoles_failLdap = Failed to determine if LDAP configured - assuming no LDAP.
+view_adminRoles_failLdapGroups = Failed to retrieve available LDAP groups - assuming no LDAP groups.
+view_adminRoles_failLdapGroupsRole = Failed to load LDAP groups available for role.
+view_adminRoles_failRoles = Failed to fetch roles.
+view_adminRoles_globalPerms = Global Permissions
+view_adminRoles_ldapGroups = LDAP Groups
+view_adminRoles_ldapGroupsReadOnly = LDAP group data is read only
+view_adminRoles_noItems = No items to show
+view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP, go to <a {0}>{1}</a>.
+view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
+view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
+view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
+view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
+view_adminRoles_permissions_globalPermissions = Global Permissions
+view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
+view_adminRoles_permissions_isAuthorized = Authorized?
+view_adminRoles_permissions_isRead = Read?
+view_adminRoles_permissions_isWrite = Write?
+view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
+view_adminRoles_permissions_permDesc_manageInventory = has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; and can import auto-discovered or manually discovered Resources
+view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
+view_adminRoles_permissions_permDesc_manageSecurity = can create, update, or delete users and roles (viewing is implied for everyone)
+view_adminRoles_permissions_permDesc_manageSettings = can modify the RHQ Server configuration and perform any Server-related functionality
+view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
+view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
+view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) view child Resource creation history
+view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view child Resource deletion history
+view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
+view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
+view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
+view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
+view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
+view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
+view_adminRoles_permissions_permWriteDesc_control = execute operations; delete operation execution history items
+view_adminRoles_permissions_permWriteDesc_createChildResources = create new child Resources (for child Resources of types that are creatable)
+view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
+view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
+view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
+view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
+view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
+view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
+view_adminRoles_permissions_perm_configure = Configure
+view_adminRoles_permissions_perm_control = Control
+view_adminRoles_permissions_perm_createChildResources = Create Child Resources
+view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
+view_adminRoles_permissions_perm_inventory = Inventory
+view_adminRoles_permissions_perm_manageAlerts = Manage Alerts
+view_adminRoles_permissions_perm_manageBundles = Manage Bundles
+view_adminRoles_permissions_perm_manageContent = Manage Content
+view_adminRoles_permissions_perm_manageEvents = Manage Events
+view_adminRoles_permissions_perm_manageInventory = Manage Inventory
+view_adminRoles_permissions_perm_manageMeasurements = Manage Measurements
+view_adminRoles_permissions_perm_manageRepositories = Manage Repositories
+view_adminRoles_permissions_perm_manageSecurity = Manage Security
+view_adminRoles_permissions_perm_manageSettings = Manage Settings
+view_adminRoles_permissions_read = Read:
+view_adminRoles_permissions_readAccessImplied = Read access for the {0} permission is implied and cannot be disabled.
+view_adminRoles_permissions_resourcePermissions = Resource Permissions
+view_adminRoles_permissions_write = Write:
+view_adminRoles_perms = Permissions
+view_adminRoles_resourcePerms = Resource Permissions
+view_adminRoles_roleAdded = Role [{0}] added.
+view_adminRoles_roleDeleteFailed = Failed to delete role [{0}].
+view_adminRoles_roleDeleted = Role [{0}] deleted.
+view_adminRoles_roleUpdateFailed = Failed to update role [{0}].
+view_adminRoles_roleUpdated = Role [{0}] updated.
+view_adminSecurity_roles = Roles
+view_adminSecurity_users = Users
+view_adminTemplates_disabledAlertTemplates = Disabled Alert Templates
+view_adminTemplates_disabledMetricTemplates = Disabled Metric Templates
+view_adminTemplates_editAlertTemplate = Edit Alert Template
+view_adminTemplates_editMetricTemplate = Edit Metric Template
+view_adminTemplates_enabledAlertTemplates = Enabled Alert Templates
+view_adminTemplates_enabledMetricTemplates = Enabled Metric Templates
+view_adminTemplates_platformServices = Platform Services
+view_adminTemplates_platforms = Platforms
+view_adminTemplates_prompt_disabledAlertTemplates = Number of alert templates that are created but disabled on this resource type
+view_adminTemplates_prompt_disabledMetricTemplates = Number of metric schedules that are disabled by default on this resource type
+view_adminTemplates_prompt_enabledAlertTemplates = Number of alert templates that are enabled on this resource type
+view_adminTemplates_prompt_enabledMetricTemplates = Number of metric schedules that are enabled by default on this resource type
+view_adminTemplates_servers = Servers
+view_adminTopology_affinityGroups = Affinity Groups
+view_adminTopology_agents = Agents
+view_adminTopology_partitionEvents = Partition Events
+view_adminTopology_remoteAgentInstall = Remote Agent Install
+view_adminTopology_servers = Servers
+view_adminUsersDetails_dataTypeName = user
+view_adminUsersList_dataTypeName = user
+view_adminUsersList_dataTypeNamePlural = users
+view_admin_administration = Administration
+view_admin_configuration = Configuration
+view_admin_content = Content
+view_admin_downloads_agentDownload = Agent Download
+view_admin_downloads_agent_buildNumber = Agent Build
+view_admin_downloads_agent_help = <p> This is the RHQ Agent Update Binary jar file. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>Agent Install</h3> <p> <b>java -jar <agent-download.jar> --install[=<new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>Agent Update</h3> <p> <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
+view_admin_downloads_agent_link_label = Link
+view_admin_downloads_agent_link_value = Download Agent {0} ({1})
+view_admin_downloads_agent_loadError = Cannot get agent version info
+view_admin_downloads_agent_md5 = Agent MD5
+view_admin_downloads_agent_version = Agent Version
+view_admin_downloads_bundleDownload = Bundle Deployer Download
+view_admin_downloads_bundle_help = <p> This is the Bundle Deployer tool. It is for use by developers and packagers of RHQ bundles. This standalone tool allows you to test your bundles and their recipes from a console. </p>
+view_admin_downloads_bundle_link_label = Link
+view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
+view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
+view_admin_downloads_cliDownload = Command Line Client Download
+view_admin_downloads_cli_buildNumber = CLI Build
+view_admin_downloads_cli_help = <p> This is the Command Line Client tool, otherwise known as the CLI. It is a standalone tool that runs from within a console and provides a command line interface to the RHQ Server. You can invoke commands via the CLI as well as run scripts to perform automated tasks. See the documentation for more information on how to install and use the CLI. </p>
+view_admin_downloads_cli_link_label = Link
+view_admin_downloads_cli_link_value = Download CLI {0} ({1})
+view_admin_downloads_cli_loadError = Cannot get CLI version info
+view_admin_downloads_cli_md5 = CLI MD5
+view_admin_downloads_cli_version = CLI Version
+view_admin_downloads_connectorsDownload = Connectors Download
+view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
+view_admin_downloads_connectors_loadError = Cannot get connectors info
+view_admin_downloads_connectors_none = No connectors are available for download
+view_admin_landing = From this section, the RHQ global settings can be administered. This includes configuring security, setting up plugins, and managing RHQ Servers and Agents.
+view_admin_measTemplates_title = Template Metric Collection Schedules
+view_admin_measTemplates_updateExisting_title = Update Existing Schedules
+view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
+view_admin_security = Security
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
+view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
+view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
+view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
+view_admin_systemSettings_BaseURL_name = GUI Console URL
+view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
+view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
+view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
+view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
+view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
+view_admin_systemSettings_DataMaintenance_name = Database Maintenance Period
+view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
+view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
+view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
+view_admin_systemSettings_EnableAgentAutoUpdate_name = Enable Agent Auto-Updates
+view_admin_systemSettings_EnableDebugMode_desc = If enabled, the server will enter debug mode.
+view_admin_systemSettings_EnableDebugMode_name = Enable Debug Mode
+view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
+view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
+view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_EventPurge_name = Delete Events Older Than
+view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
+view_admin_systemSettings_JAASProvider_name = Enable LDAP
+view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou=People,dc=redhat,dc=com
+view_admin_systemSettings_LDAPBaseDN_name = Search Base
+view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn=Manager,dc=redhat,dc=com
+view_admin_systemSettings_LDAPBindDN_name = Username
+view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
+view_admin_systemSettings_LDAPBindPW_name = Password
+view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser=true
+view_admin_systemSettings_LDAPFilter_name = Search Filter
+view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
+view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
+view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
+view_admin_systemSettings_LDAPLoginProperty_name = Login Property
+view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
+view_admin_systemSettings_LDAPProtocol_name = SSL
+view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
+view_admin_systemSettings_LDAPUrl_name = LDAP URL
+view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
+view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
+view_admin_systemSettings_cannotLoadServerDetails = Cannot load server details
+view_admin_systemSettings_cannotLoadSettings = Cannot obtain the current system settings
+view_admin_systemSettings_fixBeforeSaving = Please fix the invalid values before saving
+view_admin_systemSettings_group_baseline = Automatic Baseline Configuration Properties
+view_admin_systemSettings_group_dataMgr = Data Manager Configuration Properties
+view_admin_systemSettings_group_general = General Configuration Properties
+view_admin_systemSettings_group_ldap = LDAP Configuration Properties
+view_admin_systemSettings_saveFailure = Failed to save the system settings
+view_admin_systemSettings_savedSettings = You successfully saved the system properties
+view_admin_systemSettings_serverDetails = Server Details
+view_admin_systemSettings_serverDetails_buildNumber = Build Number
+view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
+view_admin_systemSettings_serverDetails_dbDriverName = Database Driver Name
+view_admin_systemSettings_serverDetails_dbDriverVersion = Database Driver Version
+view_admin_systemSettings_serverDetails_dbName = Database Product Name
+view_admin_systemSettings_serverDetails_dbUrl = Database Connection URL
+view_admin_systemSettings_serverDetails_dbVersion = Database Product Version
+view_admin_systemSettings_serverDetails_installDir = Server Installation Directory
+view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
+view_admin_systemSettings_serverDetails_time = Server Local Time
+view_admin_systemSettings_serverDetails_tz = Server Time Zone
+view_admin_topology = Topology
+view_alert_common_tab_conditions = Conditions
+view_alert_common_tab_conditions_expression = Fire alert when
+view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
+view_alert_common_tab_conditions_modal_title = Add Condition
+view_alert_common_tab_conditions_recovery_disabled = This alert caused its alert definition to be disabled
+view_alert_common_tab_conditions_recovery_enabled = Triggered ''{0}'' to be re-enabled
+view_alert_common_tab_conditions_text = Condition
+view_alert_common_tab_conditions_type_availability = Availability Change
+view_alert_common_tab_conditions_type_availability_down = Went down
+view_alert_common_tab_conditions_type_availability_up = Came up
+view_alert_common_tab_conditions_type_event = Event Detection
+view_alert_common_tab_conditions_type_event_matching = with event source matching
+view_alert_common_tab_conditions_type_metric_baseline = Metric Value Baseline
+view_alert_common_tab_conditions_type_metric_baseline_verb = of
+view_alert_common_tab_conditions_type_metric_calltime_change = Call Time Value Changes
+view_alert_common_tab_conditions_type_metric_calltime_change_verb = by at least
+view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Grows
+view_alert_common_tab_conditions_type_metric_calltime_delta_other = Changes
+view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
+view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
+view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
+view_alert_common_tab_conditions_type_metric_change = Metric Value Change
+view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
+view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
+view_alert_common_tab_conditions_type_operation = Operation Execution
+view_alert_common_tab_conditions_type_operation_status = with result status
+view_alert_common_tab_conditions_type_resource_configuration = Resource Configuration Change
+view_alert_common_tab_conditions_value = Value
+view_alert_common_tab_dampening = Dampening
+view_alert_common_tab_dampening_category_consecutive_count = Consecutive
+view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
+view_alert_common_tab_dampening_category_duration_count = Time Period
+view_alert_common_tab_dampening_category_duration_count_tooltip = An alert is triggered once every X occurrences the condition set is true within a given time period.
+view_alert_common_tab_dampening_category_none = None
+view_alert_common_tab_dampening_category_none_tooltip = Dampening is disabled. Every time the condition set is true, an alert will be triggered.
+view_alert_common_tab_dampening_category_partial_count = Last N Evaluations
+view_alert_common_tab_dampening_category_partial_count_tooltip = An alert is triggered once every X occurrences the condition set is true during the last N evaluations of the condition set.
+view_alert_common_tab_dampening_consecutive_occurrences_label = Occurrences
+view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = The number of times the condition set must be consecutively true before the alert is triggered
+view_alert_common_tab_dampening_duration_occurrences_label = Occurrences
+view_alert_common_tab_dampening_duration_occurrences_label_tooltip = The number of times the condition set must be true during the given time period before the alert is triggered.
+view_alert_common_tab_dampening_duration_period_label = Time Period
+view_alert_common_tab_dampening_duration_period_label_tooltip = The time span in which the condition set will be tested to see if the given number of occurrences are true.
+view_alert_common_tab_dampening_partial_evalatuions_label = Evaluations
+view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = The total number of times the condition set will be tested to see if the given number of occurrences are true.
+view_alert_common_tab_dampening_partial_occurrences_label = Occurrences
+view_alert_common_tab_dampening_partial_occurrences_label_tooltip = The number of times the condition set must be true during the last N evaluations before the alert is triggered.
+view_alert_common_tab_general = General Properties
+view_alert_common_tab_invalid_condition_category = Invalid condition category - please report this as a bug: {0}
+view_alert_common_tab_invalid_dampening_category = Invalid dampening category - please report this as a bug: {0}
+view_alert_common_tab_invalid_time_units = Invalid time units - please report this as a bug: {0}
+view_alert_common_tab_notifications = Notifications
+view_alert_common_tab_notifications_message = Message
+view_alert_common_tab_notifications_sender = Sender
+view_alert_common_tab_notifications_status = Status
+view_alert_common_tab_recovery = Recovery
+view_alert_definition_condition_editor_avilability_option_down = Goes down
+view_alert_definition_condition_editor_avilability_option_up = Comes up
+view_alert_definition_condition_editor_avilability_tooltip = Specify the availability state change that will trigger the condition.
+view_alert_definition_condition_editor_avilability_value = Availability
+view_alert_definition_condition_editor_common_avg = Average
+view_alert_definition_condition_editor_common_max = Maximum
+view_alert_definition_condition_editor_common_min = Minimum
+view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+view_alert_definition_condition_editor_event_regex = Regular Expression
+view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
+view_alert_definition_condition_editor_event_severity = Event Severity
+view_alert_definition_condition_editor_event_severity_debug = Debug
+view_alert_definition_condition_editor_event_severity_error = Error
+view_alert_definition_condition_editor_event_severity_fatal = Fatal
+view_alert_definition_condition_editor_event_severity_info = Info
+view_alert_definition_condition_editor_event_severity_warn = Warn
+view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
+view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
+view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
+view_alert_definition_condition_editor_metric_baseline_tooltip = Specify the baseline value that must be violated to trigger the condition. The value you specify is a percentage of the given baseline value.
+view_alert_definition_condition_editor_metric_baseline_value = Baseline
+view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentage Change
+view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = A collected calltime value will trigger this condition when it differs by at least this percentage of the selected calltime limit value
+view_alert_definition_condition_editor_metric_calltime_change_tooltip = Specify the calltime value that, when changed at least a specified amount, triggers the condition. You must specify which calltime limit to check (minimum, maximum or average calltime value) and the percentage of change that must occur.
+view_alert_definition_condition_editor_metric_calltime_common_comparator = Comparator
+view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Changes
+view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Grows
+view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Shrinks
+view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = How a collected calltime value should be compared to the given calltime limit
+view_alert_definition_condition_editor_metric_calltime_common_limit = Call Time Limit
+view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = The calltime limit value that is to be compared with the given value
+view_alert_definition_condition_editor_metric_calltime_common_name = Call Time Metric
+view_alert_definition_condition_editor_metric_calltime_common_regex = Regular Expression
+view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = If specified, this is a regular expression that must match a call destination in order to trigger the condition.
+view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Specify the calltime threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier. You also must specify which calltime limit to compare the value with (minimum, maximum or average calltime value).
+view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Time Value
+view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
+view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
+view_alert_definition_condition_editor_metric_threshold_comparator_equal = Equal to
+view_alert_definition_condition_editor_metric_threshold_comparator_greater = Greater Than
+view_alert_definition_condition_editor_metric_threshold_comparator_less = Less than
+view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = How a collected metric value should be compared to the given threshold value
+view_alert_definition_condition_editor_metric_threshold_name = Metric
+view_alert_definition_condition_editor_metric_threshold_tooltip = Specify the threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier.
+view_alert_definition_condition_editor_metric_threshold_value = Metric Value
+view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
+view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_trait_change_value = Trait
+view_alert_definition_condition_editor_operation_status = Operation Status
+view_alert_definition_condition_editor_operation_status_canceled = Canceled
+view_alert_definition_condition_editor_operation_status_failure = Failure
+view_alert_definition_condition_editor_operation_status_inprogress = In Progress
+view_alert_definition_condition_editor_operation_status_success = Success
+view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
+view_alert_definition_condition_editor_operation_value = Operation
+view_alert_definition_condition_editor_option_availability = Availability Change
+view_alert_definition_condition_editor_option_event = Event Detection
+view_alert_definition_condition_editor_option_label = Condition Type
+view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
+view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
+view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
+view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
+view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
+view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
+view_alert_definition_condition_editor_option_operation = Operation Execution
+view_alert_definition_condition_editor_option_resource_configuration = Resource Configuration Change
+view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
+view_alert_definition_for_group = View Group Definition
+view_alert_definition_for_type = View Template
+view_alert_definition_notification_cliScript_editor_anotherUser = Another User
+view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
+view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
+view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
+view_alert_definition_notification_cliScript_editor_repository = Repository
+view_alert_definition_notification_cliScript_editor_script = Script
+view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
+view_alert_definition_notification_cliScript_editor_selectRepoFirst = Select a repository first.
+view_alert_definition_notification_cliScript_editor_thisUser = Myself
+view_alert_definition_notification_cliScript_editor_uploadNewScript = Upload New Script
+view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
+view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
+view_alert_definition_notification_editor_delete_confirm = Are you sure you want to delete the selected alert notifications?
+view_alert_definition_notification_editor_field_configuration = Configuration
+view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
+view_alert_definition_notification_editor_field_configuration_not_loaded = Unknown
+view_alert_definition_notification_editor_field_sender = Sender
+view_alert_definition_notification_editor_loadFailed = Cannot get alert senders
+view_alert_definition_notification_editor_loadFailed_single = Cannot get alert sender configuration definition
+view_alert_definition_notification_editor_none_available = No alert senders available
+view_alert_definition_notification_editor_saveFailed = Cannot save the notification configuration
+view_alert_definition_notification_editor_sender = Notification Sender
+view_alert_definition_notification_editor_title_add = Add Notification
+view_alert_definition_notification_editor_title_edit = Edit Notification
+view_alert_definition_notification_operation_editor_common_operation = Operation
+view_alert_definition_notification_operation_editor_mode_relative = Relative Resource
+view_alert_definition_notification_operation_editor_mode_specific = Specific Resource
+view_alert_definition_notification_operation_editor_mode_this = This Resource
+view_alert_definition_notification_operation_editor_mode_title = Resource Selection Mode
+view_alert_definition_notification_operation_editor_mode_unknown = UNKNOWN OPTION - THIS IS A BUG
+view_alert_definition_notification_operation_editor_operations_loadFailed = Failed to load the list of available operations
+view_alert_definition_notification_operation_editor_operations_no_parameters = This operation does not take any parameters
+view_alert_definition_notification_operation_editor_relative_ancestor = Start Search From
+view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = Cannot get type ancestry
+view_alert_definition_notification_operation_editor_relative_ancestor_root = Root Ancestor Type
+view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Select the top of the type hierarchy from which to search its descendant tree for the Filter By type
+view_alert_definition_notification_operation_editor_relative_descendant = Then Filter By
+view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = A specific name to uniquely identify a resource when more than one resource of the selected type might exist. This is optional if there will only ever be one resource of the resource type in the selected type hierarchy.
+view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = Cannot get type descendants
+view_alert_definition_notification_operation_editor_relative_descendant_tooltip = The resource type to search for under the root type defined in the Start Search From selection.
+view_alert_definition_notification_operation_editor_specific_pick_button = Pick
+view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Please pick a resource
+view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Please pick a resource that has one or more operations
+view_alert_definition_notification_operation_editor_specific_pick_text = Pick a resource...
+view_alert_definition_notification_operation_editor_specific_resource = Resource
+view_alert_definition_notification_role_editor_loadFailed = Cannot determine current roles - starting empty
+view_alert_definition_notification_role_editor_restoreFailed = Cannot use current roles - starting empty
+view_alert_definition_notification_role_editor_saveFailed = Cannot save the selected roles
+view_alert_definition_notification_user_editor_loadFailed = Cannot determine current users - starting empty
+view_alert_definition_notification_user_editor_restoreFailed = Cannot use current users - starting empty
+view_alert_definition_notification_user_editor_saveFailed = Cannot save the selected users
+view_alert_definition_recovery_editor_disable_when_fired = Disable When Fired
+view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indicates if this alert will be disabled after it fires. Once disabled, the alert can be manually re-enabled or a recovery alert can be set up to automatically re-enable it. If this alert is a recovery alert itself, this setting cannot be turned on.
+view_alert_definition_recovery_editor_loadFailed = Cannot build recovery menu
+view_alert_definition_recovery_editor_none_available = None
+view_alert_definition_recovery_editor_recovery_alert = Recover Alert
+view_alert_definition_recovery_editor_recovery_alert_tooltip = The target alert that will be recovered (i.e. re-enabled) after this alert triggers. Do not select an alert here if you are not defining a recovery alert.
+view_alert_definitions_create_failure = Alert definition creation failed
+view_alert_definitions_create_success = Alert definition successfully created
+view_alert_definitions_delete_confirm = Delete the selected alert definition(s)?
+view_alert_definitions_delete_failure = Failed to deleted the selected alert definitions
+view_alert_definitions_delete_success = Successfully deleted {0} alert definitions
+view_alert_definitions_disable_confirm = Disable the selected alert definition(s)?
+view_alert_definitions_disable_failure = Failed to disable the selected alert definitions
+view_alert_definitions_disable_success = Successfully disabled {0} alert definitions
+view_alert_definitions_enable_confirm = Enable the selected alert definition(s)?
+view_alert_definitions_enable_failure = Failed to enable the selected alert definitions
+view_alert_definitions_enable_success = Successfully enabled {0} alert definitions
+view_alert_definitions_loadFailed = Failed to fetch alert definition data
+view_alert_definitions_loadFailed_single = Failed to fetch data for alert definition with id {0}
+view_alert_definitions_table_title_group = Group Alert Definitions
+view_alert_definitions_table_title_resource = Resource Alert Definitions
+view_alert_definitions_update_failure = Alert definition update failed
+view_alert_definitions_update_success = Alert definition successfully updated
+view_alert_details_field_ack_at = Acknowledged at
+view_alert_details_field_ack_by = Acknowledged by
+view_alert_details_field_recovery_info = Recovery Info
+view_alert_details_loadFailed = Failed to fetch alert details
+view_alerts_ack_confirm = Acknowledge the selected alert(s)?
+view_alerts_ack_confirm_all = Acknowledge all alerts from this source?
+view_alerts_ack_failure = Failed to acknowledge alerts with id''s: {0}
+view_alerts_ack_failure_all = Failed to acknowledge all alerts from this source
+view_alerts_ack_success = Successfully acknowledged {0} alerts
+view_alerts_delete_confirm = Delete the selected alert(s)?
+view_alerts_delete_confirm_all = Delete all alerts from this source?
+view_alerts_delete_failure = Failed to delete alerts with id''s: {0}
+view_alerts_delete_failure_all = Failed to delete all alerts from this source
+view_alerts_delete_success = Successfully deleted {0} alerts
+view_alerts_field_ack_status = Status
+view_alerts_field_ack_status_ack = Ack ({0})
+view_alerts_field_ack_status_ackHover = Acknowledged by {0} at {1}
+view_alerts_field_ack_status_noAck = No Ack
+view_alerts_field_ack_status_noAckHover = Not yet Acknowledged
+view_alerts_field_ack_subject = Acknowledge Subject
+view_alerts_field_ack_time = Acknowledge Time
+view_alerts_field_condition_text = Condition Text
+view_alerts_field_condition_text_many = Multiple Conditions
+view_alerts_field_condition_text_none = No Conditions
+view_alerts_field_condition_value = Condition Value
+view_alerts_field_created_time = Creation Time
+view_alerts_field_enabled = Enabled
+view_alerts_field_modified_time = Modified Time
+view_alerts_field_name = Name
+view_alerts_field_parent = Parent
+view_alerts_field_priority = Priority
+view_alerts_field_protected = Protected
+view_alerts_field_protected_tooltip = If true, this definition is protected from being changed by the parent definition. In other words, the parent definition settings will not override this definition.
+view_alerts_loadFailed = Failed to fetch alerts data
+view_alerts_table_filter_priority = Priority Filter
+view_alerts_table_title_group = Group Alert History
+view_alerts_table_title_resource = Resource Alert History
+view_autoDiscoveryQ_committed = Committed
+view_autoDiscoveryQ_confirmSelect = Also select the platform children?
+view_autoDiscoveryQ_deleted = Deleted
+view_autoDiscoveryQ_field_discoveryTime = Discovery Time
+view_autoDiscoveryQ_field_inventoryStatus = Inventory Status
+view_autoDiscoveryQ_field_key = Resource Key
+view_autoDiscoveryQ_field_name = Resource Name
+view_autoDiscoveryQ_field_parentId = Parent ID
+view_autoDiscoveryQ_ignore = Ignore
+view_autoDiscoveryQ_ignoreFailure = Failed to ignore resources
+view_autoDiscoveryQ_ignoreSuccessful = You have successfully ignored the selected resources.
+view_autoDiscoveryQ_ignored = Ignored
+view_autoDiscoveryQ_import = Import
+view_autoDiscoveryQ_importFailure = Failed to import resources
+view_autoDiscoveryQ_importSuccessful = You have successfully imported the selected resources.
+view_autoDiscoveryQ_loadFailure = Failed to load the inventory discovery queue
+view_autoDiscoveryQ_new = New
+view_autoDiscoveryQ_newAndIgnored = New and Ignored
+view_autoDiscoveryQ_noItems = No items to show
+view_autoDiscoveryQ_noperm = (You are not authorized to view the auto-discovery queue)
+view_autoDiscoveryQ_showStatus = Show
+view_autoDiscoveryQ_title = Autodiscovery Queue
+view_autoDiscoveryQ_unignore = Unignore
+view_autoDiscoveryQ_unignoreFailure = Failed to unignore resources
+view_autoDiscoveryQ_unignoreSuccessful = You have successfully unignored the selected resources.
+view_autoDiscoveryQ_uninventoried = Uninventoried
+view_bundleVersion_loadFailure = Failed to load bundle version data
+view_bundle_bundle = Bundle
+view_bundle_bundleDeployment = Bundle Deployment
+view_bundle_bundleDeployments = Bundle Deployments
+view_bundle_bundleDestinations = Bundle Destinations
+view_bundle_bundleFiles = Bundle Files
+view_bundle_bundleType = Bundle Type
+view_bundle_bundleVersion = Bundle Version
+view_bundle_bundleVersions = Bundle Versions
+view_bundle_bundles = Bundles
+view_bundle_createWizard_bundleDistro = Bundle Distribution
+view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database
+view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
+view_bundle_createWizard_clickToUploadRecipe = Click to load a recipe file
+view_bundle_createWizard_createFailure = Failed to create the bundle
+view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]
+view_bundle_createWizard_enterRecipe = Please supply a valid recipe
+view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
+view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file
+view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file
+view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server
+view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle
+view_bundle_createWizard_noBundleTypesAvail = No bundle types are available
+view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments
+view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
+view_bundle_createWizard_recipeOption = Recipe
+view_bundle_createWizard_title = Create Bundle
+view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files
+view_bundle_createWizard_uploadOption = Upload
+view_bundle_createWizard_uploadStepName = Upload Bundle Files
+view_bundle_createWizard_urlOption = URL
+view_bundle_createWizard_windowTitle = Bundle Creation Wizard
+view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
+view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted.
+view_bundle_deploy = Deploy
+view_bundle_deployDir = Deploy Directory
+view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms
+view_bundle_deployWizard_deploying = Deploying...
+view_bundle_deployWizard_deploymentCreated = Created Deployment...
+view_bundle_deployWizard_deploymentCreatedDetail = You have created the deployment [{0}] with the description [{1}]
+view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
+view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!
+view_bundle_deployWizard_deploymentScheduledDetail = You have scheduled the bundle deployment [{0}] to the destination group [{1}]
+view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
+view_bundle_deployWizard_destinationCreatedDetail = You have created the destination [{0}] with the description [{1}]
+view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
+view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel
+view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)
+view_bundle_deployWizard_error_11 = Failed to find defined deployments.
+view_bundle_deployWizard_error_12 = Failed to find defined bundles.
+view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel
+view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!
+view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}
+view_bundle_deployWizard_error_5 = Failed to Create Deployment!
+view_bundle_deployWizard_error_6 = Failed to create deployment: {0}
+view_bundle_deployWizard_error_7 = Failed to get deployment name.
+view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
+view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
+view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
+view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
+view_bundle_deployWizard_getDestStep = New Destination
+view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
+view_bundle_deployWizard_getDest_desc = Destination Description
+view_bundle_deployWizard_getDest_name = Destination Name
+view_bundle_deployWizard_getInfoStep = Provide Deployment Information
+view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
+view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description
+view_bundle_deployWizard_getInfo_deploymentName = Deployment Name
+view_bundle_deployWizard_getOptionsStep = Deploy Options
+view_bundle_deployWizard_getOptions_deployLater = Deploy Later
+view_bundle_deployWizard_getOptions_deployNow = Deploy Now
+view_bundle_deployWizard_getOptions_deployTime = Deployment Time
+view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle
+view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.
+view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version
+view_bundle_deployWizard_selectVersion_latest = Latest Version [{0}]
+view_bundle_deployWizard_selectVersion_live = Live Version [{0}]
+view_bundle_deployWizard_selectVersion_select = Select Version from List:
+view_bundle_deployWizard_title = Bundle Deployment Wizard
+view_bundle_deploy_action = Action
+view_bundle_deploy_backButton = Back to Destination
+view_bundle_deploy_clickForError = Click the icon for the error message
+view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
+view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
+view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
+view_bundle_deploy_deployedBy = Deployed By
+view_bundle_deploy_deploymentPlatforms = Deployment Platforms
+view_bundle_deploy_installDetails = Install Details
+view_bundle_deploy_loadBundleFailure = Failed to find bundle
+view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
+view_bundle_deploy_loadFailure = Failed to load bundle deployment
+view_bundle_deploy_name = Deployment Name
+view_bundle_deploy_operatingSystem = Operating System
+view_bundle_deploy_selectARow = Select a row to show installation details
+view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
+view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
+view_bundle_deploy_time = Deployment Time
+view_bundle_deployed = Deployed
+view_bundle_deployments = Deployments
+view_bundle_dest_backToBundle = Back to Bundle
+view_bundle_dest_created = Created
+view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
+view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
+view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
+view_bundle_dest_deployDir = Deploy Directory
+view_bundle_dest_group = Group
+view_bundle_dest_lastDeployedVersion = Last Deployed Version
+view_bundle_dest_lastDeploymentDate = Last Deployment Date
+view_bundle_dest_lastDeploymentStatus = Last Deployment Status
+view_bundle_dest_loadFailure = Failed to load bundle destinations
+view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information
+view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
+view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
+view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
+view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
+view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
+view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
+view_bundle_destinations = Destinations
+view_bundle_fileListView_fileSize = File Size
+view_bundle_fileListView_loadFailure = Failed to load bundle file data
+view_bundle_fileListView_md5 = MD5
+view_bundle_fileListView_sha256 = SHA256
+view_bundle_files = Files
+view_bundle_latestVersion = Latest Version
+view_bundle_list_backToAll = Back to All Bundles
+view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
+view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
+view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
+view_bundle_list_deletesFailure = Failed to delete the bundles
+view_bundle_list_deletesSuccessful = You successfully deleted the bundles
+view_bundle_list_destinationsCount = Destinations Count
+view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
+view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
+view_bundle_list_error3 = Failed to load bundle
+view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]
+view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data
+view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]
+view_bundle_list_tagUpdateFailure = Failed to update bundle tags
+view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
+view_bundle_list_versionsCount = Versions Count
+view_bundle_purge = Purge
+view_bundle_recipe = Recipe
+view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
+view_bundle_revert = Revert
+view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...
+view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
+view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
+view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation
+view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
+view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
+view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
+view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
+view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment
+view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
+view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
+view_bundle_revertWizard_getInfoStep_name = Provide Revert Information
+view_bundle_revertWizard_getInfoStep_revertDeployDesc = Revert Deploy Description
+view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\\n\\n[REVERT To]\\n{1}
+view_bundle_revertWizard_getInfoStep_revertDeployName = Revert Deploy Name
+view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms
+view_bundle_revertWizard_revertStep_reverting = Reverting...
+view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!
+view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]
+view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!
+view_bundle_revertWizard_title = Bundle Revert
+view_bundle_revertWizard_windowTitle = Bundle Revert Wizard
+view_bundle_tree_loadFailure = Failed to load bundle data
+view_bundle_version_backToBundle = Back to Bundle
+view_bundle_version_bundleVersionTagUpdateFailure = Failed to update bundle version tags
+view_bundle_version_bundleVersionTagUpdateSuccessful = You have successfully updated the bundle version tags
+view_bundle_version_deleteConfirm = Are you sure you want to delete this bundle version?
+view_bundle_version_deleteFailure = Failed to delete the bundle version [{0}]
+view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
+view_bundle_version_loadFailure = Failed to load bundle version
+view_bundle_versions = Versions
+view_configCompare_comparingConfigs = Comparing Configurations
+view_configCompare_configCompare = Configuration Comparison
+view_configEdit_addItem = Add Item to List
+view_configEdit_confirm_1 = Are you sure you want to delete the selected properties from the set?
+view_configEdit_confirm_2 = Are you sure you want to delete this row?
+view_configEdit_confirm_3 = Are you sure you want to delete the [{0}] selected [{1}]?
+view_configEdit_editRow = Edit Row
+view_configEdit_enterPropName = Enter the name of the property to be added.
+view_configEdit_error_1 = Configuration is not supported by this Resource.
+view_configEdit_error_2 = Connection settings are not supported by this Resource.
+view_configEdit_error_3 = Cannot add property named [{0}]. The property name is already used in the set.
+view_configEdit_files = Files
+view_configEdit_hideAll = Hide All
+view_configEdit_jumpToSection = Jump to Section
+view_configEdit_msg_1 = Added property [{0}] to the set.
+view_configEdit_msg_2 = Removed properties from the set.
+view_configEdit_msg_3 = [{0} {1}] deleted from list.
+view_configEdit_msg_4 = Item added to list.
+view_configEdit_properties = Properties
+view_configEdit_tooltip_1 = Delete the selected items from the list.
+view_configEdit_tooltip_2 = Add an item to the list.
+view_configEdit_viewRow = View Row
+view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.
+view_configurationDetails_configNotUpdatedDueToNoChange = Configuration was not updated, since the new configuration is equivalent to the current configuration.
+view_configurationDetails_error_updateFailure = Failed to update configuration.
+view_configurationDetails_messageConcise = Configuration updated - current version is {0}.
+view_configurationDetails_messageDetailed = Configuration updated to version {0} for Resource [{1}].
+view_configurationDetails_noPermission = You do not have permission to edit this Resource''s configuration.
+view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.
+view_configurationHistoryDetails_error_loadFailure = Unable to load configuration history.
+view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
+view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. You must purge that parent group history item before you can delete its individual resource history items.
+view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
+view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
+view_configurationHistoryList_rollback = Rollback
+view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
+view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
+view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
+view_configurationHistoryList_table_statusFailure = This configuration update failed
+view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
+view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
+view_configurationHistoryList_table_statusSuccess = This configuration update was successful
+view_configurationHistoryList_title = Configuration History
+view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.
+view_connectionSettingsDetails_error_updateFailure = Failed to update connection settings.
+view_connectionSettingsDetails_messageConcise_updateSuccess = Connection settings update initiated.
+view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settings update initiated for Resource [{0}].
+view_connectionSettingsDetails_noPermission = You do not have permission to edit this Resource''s connection settings.
+view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.
+view_core_error_1 = New Alerts lookup failed
+view_core_loggedOut = Logged out
+view_core_noRecentAlerts = There are no recent alerts to report
+view_core_recentAlerts = There are [{0}] recent alerts - click to go to the recent alerts report
+view_core_uncaught = Globally uncaught exception
+view_dashboardManager_deleteFail = Failed to delete dashboard.
+view_dashboardManager_deleted = Successfully deleted dashboard {0}
+view_dashboardManager_error = Failed to save dashboard to server
+view_dashboardManager_saved = Saved dashboard {0} to server
+view_dashboardManager_success = Saved dashboard
+view_dashboard_favorites_error1 = Failed to load favorite Resources.
+view_dashboardsManager_error1 = Failed to add new dashboard
+view_dashboardsManager_message_title_details = <h1>Welcome to RHQ</h1>\n<p>The RHQ project is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p>
+view_dashboards_confirm1 = Are you sure you want to delete
+view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh
+view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh
+view_dashboards_portlets_refresh_multiple_min = {0} minutes
+view_dashboards_portlets_refresh_none = No Refresh
+view_dashboards_portlets_refresh_one_min = 1 minute
+view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
+view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
+view_dashboards_title = Dashboard
+view_dynagroup_children = DynaGroup Children
+view_dynagroup_compatible = Compatible
+view_dynagroup_definitionAlreadyExists = A group definition already exists with this name
+view_dynagroup_definitionCreated = You have successfully created a group definition named [{0}]
+view_dynagroup_definitionLoadFailure = Failed to load group definitions
+view_dynagroup_definitions = DynaGroup Definitions
+view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions
+view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions
+view_dynagroup_editing = Editing [{0}]
+view_dynagroup_exprBuilder_addExpression = Add Expression
+view_dynagroup_exprBuilder_comparisonType = Comparison Type
+view_dynagroup_exprBuilder_comparisonType_contains = contains
+view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
+view_dynagroup_exprBuilder_comparisonType_equals = equals
+view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
+view_dynagroup_exprBuilder_comparisonType_tooltip = Comparison Type
+view_dynagroup_exprBuilder_definingPlugin = Defining Plugin
+view_dynagroup_exprBuilder_definingPlugin_tooltip = The plugin to search
+view_dynagroup_exprBuilder_expression = Expression
+view_dynagroup_exprBuilder_expressionType = Expression Type
+view_dynagroup_exprBuilder_expressionType_pluginConfig = Plugin Configuration
+view_dynagroup_exprBuilder_expressionType_resource = Resource
+view_dynagroup_exprBuilder_expressionType_resourceCategory = Resource Category
+view_dynagroup_exprBuilder_expressionType_resourceConfig = Resource Configuration
+view_dynagroup_exprBuilder_expressionType_resourceType = Resource Type
+view_dynagroup_exprBuilder_expressionType_tooltip = The type of property this expression switches on:<br/> <b>Resource</b>: A resource property such as its name or version<br/> <b>Resource Type</b>: Search for resources of a specific type<br/> <b>Resource Category</b>: Search for resources by category: platform, server, service<br/> <b>Trait</b>: Resources that have selected values for a monitored trait<br/> <b>Plugin Configuration</b>: Search by the plugin component configuration setting of the component<br/> <b>Resource Configuration</b>: Search by the configuration setting of the managed resource
+view_dynagroup_exprBuilder_expressionType_trait = Trait
+view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
+view_dynagroup_exprBuilder_groupBy = Group by
+view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
+view_dynagroup_exprBuilder_noPlugins = --No plugins--
+view_dynagroup_exprBuilder_noProperties = --No properties--
+view_dynagroup_exprBuilder_noResourceTypes = --No resource types--
+view_dynagroup_exprBuilder_pluginLoadFailure = Cannot get the list of plugins
+view_dynagroup_exprBuilder_propLoadFailure = Cannot get list of properties
+view_dynagroup_exprBuilder_propertyName = Property Name
+view_dynagroup_exprBuilder_propertyName_tooltip = The name of the property to query. This is defined by the expression type as well as the resource type.
+view_dynagroup_exprBuilder_resTypeLoadFailure = Cannot get list of resource types for plugin [{0}]
+view_dynagroup_exprBuilder_resource = Resource
+view_dynagroup_exprBuilder_resourceType = Resource Type
+view_dynagroup_exprBuilder_resourceType_tooltip = The type of resource
+view_dynagroup_exprBuilder_resource_child = Child
+view_dynagroup_exprBuilder_resource_grandparent = Grandparent
+view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
+view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
+view_dynagroup_exprBuilder_resource_parent = Parent
+view_dynagroup_exprBuilder_resource_resource = Resource
+view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
+view_dynagroup_exprBuilder_title = Expression Builder
+view_dynagroup_exprBuilder_unset = Unset
+view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
+view_dynagroup_exprBuilder_value_tooltip = The string value for the expression to query
+view_dynagroup_expression = Expression
+view_dynagroup_expressionBuilderIconTooltip = Expression Builder...
+view_dynagroup_expressionSet = Expression Set
+view_dynagroup_lastCalculationTime = Last Calculation Time
+view_dynagroup_loadDefinitionFailure = Failed to load group definition [{0}]
+view_dynagroup_loadDefinitionMissing = There is no group definition with the ID of [{0}]
+view_dynagroup_mixed = Mixed
+view_dynagroup_newGroupDefinition = New Group Definition
+view_dynagroup_nextCalculationTime = Next Calculation Time
+view_dynagroup_permDenied = You do not have permission to view group definitions
+view_dynagroup_recalcFailure = Failed to recalculated this group definition
+view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions
+view_dynagroup_recalcSuccessful = You have successfully recalculated this group definition
+view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions
+view_dynagroup_recalculate = Recalculate
+view_dynagroup_recalculationInterval = Recalculation Interval (ms)
+view_dynagroup_recursive = Recursive
+view_dynagroup_saveAndRecalculate = Save & Recalculate
+view_dynagroup_saveFailure = Failed to save the group definition named [{0}]
+view_dynagroup_saveSuccessful = You have successfully saved the group definition named [{0}]
+view_dynagroup_singleSaveFailure = An error occurred - there should have been one created, but instead there were [{0}] created
+view_dynagroup_template_customExpression = Custom Expression...
+view_dynagroup_template_downedResources = All resources currently down
+view_dynagroup_template_jbossas4_clusters = JBossAS 4 - Clusters
+view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
+view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
+view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
+view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
+view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - Clusters
+view_dynagroup_template_platforms = Platform resources in inventory
+view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
+view_groupConfigEdit_member = Member
+view_groupConfigEdit_noListProps = List properties are not currently supported for group configurations.
+view_groupConfigEdit_setAll = Set all values to:
+view_groupConfigEdit_tooltip_1 = Member values differ - click icon to edit them.
+view_groupConfigEdit_unset = Unset
+view_groupConfigEdit_valsDiff = member values differ
+view_groupConfigEdit_valsDiffForProp = Member Values for Property [{0}]
+view_groupCreateWizard_createFailure = Failed to create the resource group
+view_groupCreateWizard_createStepName = Group Settings
+view_groupCreateWizard_createStep_recursive = Recursive
+view_groupCreateWizard_createSuccessful_concise = You have created a new resource group. [<a href="{0}">View Group</a>]
+view_groupCreateWizard_createSuccessful_full = You have created a new [{0}] resource group with the name [{1}] that contains [{2}] member resources
+view_groupCreateWizard_membersStepName = Select Members
+view_groupCreateWizard_title = Create Group
+view_groupCreateWizard_windowTitle = Create Group
+view_groupInventoryMembers_button_updateMembership = Update Membership...
+view_groupInventoryMembers_title_updateMembership = Update Membership
+view_group_detail_failLoad = Failed to load group for group with ID [{0}]
+view_group_detail_failLoadComp = Failed to load group composite for group with ID [{0}]
+view_group_detail_failRecursiveChange = Failed to update the recursive setting for group [{0}]
+view_group_detail_recursiveChange = You successfully changed the recursive setting for group [{0}]
+view_group_inventory_activity_no_recent_metrics = This group has no recent metrics
+view_group_meas_schedules_title = Group Metric Collection Schedules
+view_group_membership_failFetch = Failed to fetch Resource Group
+view_group_membership_saveFailure = Failed to update membership of group [{0}]
+view_group_membership_saveSuccessful = You have updated the membership of group [{0}]
+view_group_operationScheduleDetails_failedToLoadMembers = Failed to load group member Resources.
+view_group_operationScheduleDetails_field_execute = Execute
+view_group_operationScheduleDetails_field_haltOnFailure = Halt on Failure?
+view_group_operationScheduleDetails_memberResource = Member Resource
+view_group_operationScheduleDetails_value_parallel = in parallel
+view_group_operationScheduleDetails_value_sequential = in the order specified below (drag and drop member Resources to change order)
+view_group_pluginConfig_edit_currentGroupProperties = Current Group Properties
+view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]
+view_group_pluginConfig_edit_noperm = You do not have permission to edit this group connection settings
+view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]
+view_group_pluginConfig_edit_saveInitiated_concise = The group connection setting updates have been initiated
+view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]
+view_group_pluginConfig_edit_saveTooltip = Update the connection settings of all group members
+view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved
+view_group_pluginConfig_members_fetchFailure = Failed to get plugin config update history for members of group [{0}]
+view_group_pluginConfig_members_fetchFailureConn = Failed to retrieve member connection settings for [{0}]
+view_group_pluginConfig_members_fetchFailureConnInProgress = A group plugin configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
+view_group_pluginConfig_members_statusDetails = Status Details
+view_group_pluginConfig_members_statusFailure = This configuration update failed for an unknown reason
+view_group_pluginConfig_members_statusInprogress = This configuration update is still in progress
+view_group_pluginConfig_members_statusNochange = No changes were made to this configuration
+view_group_pluginConfig_members_statusSuccess = This configuration update was successful
+view_group_pluginConfig_members_title = Group Connection Settings Member Histories
+view_group_pluginConfig_table_clickStatusIcon = Click the status icon for full details
+view_group_pluginConfig_table_deleteFailure = Failed to delete group plugin config history
+view_group_pluginConfig_table_deleteSuccessful = You have deleted [{0}] history items
+view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
+view_group_pluginConfig_table_msg1 = View Member History for status of each individual resource
+view_group_pluginConfig_table_statusDetails = Status Details
+view_group_pluginConfig_table_statusFailure = This group configuration update failed
+view_group_pluginConfig_table_statusInprogress = This group configuration update is still in progress
+view_group_pluginConfig_table_statusNochange = No changes were made to this group configuration
+view_group_pluginConfig_table_statusSuccess = This group configuration update was successful
+view_group_pluginConfig_table_title = Group Connection Settings History
+view_group_pluginConfig_table_viewMemberHistory = View Member History
+view_group_pluginConfig_table_viewSettings = View Settings
+view_group_pluginConfig_view_groupProperties = Group Properties
+view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings
+view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]
+view_group_resConfig_edit_loadFail = Failed to retrieve member Resource configurations for [{0}]
+view_group_resConfig_edit_noperm = You do not have permission to edit this group configuration
+view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for [{0}] compatible group named [{1}]
+view_group_resConfig_edit_saveInitiated_concise = The group configuration updates have been initiated
+view_group_resConfig_edit_saveInitiated_full = The group configuration updates have been initiated for the [{0}] compatible group named [{1}]
+view_group_resConfig_edit_saveTooltip = Update the configurations of all group members
+view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved
+view_group_resConfig_members_fetchFailure = Failed to get resource config update history for members of group [{0}]
+view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource configuration settings for [{0}]
+view_group_resConfig_members_fetchFailureConfigInProgress = A group resource configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
+view_group_resConfig_members_statusDetails = Status Details
+view_group_resConfig_members_statusFailure = This configuration update failed for an unknown reason
+view_group_resConfig_members_statusInprogress = This configuration update is still in progress
+view_group_resConfig_members_statusNochange = No changes were made to this configuration
+view_group_resConfig_members_statusSuccess = This configuration update was successful
+view_group_resConfig_members_title = Group Resource Configuration Member Histories
+view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
+view_group_resConfig_table_deleteFailure = Failed to delete group resource config history
+view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
+view_group_resConfig_table_failFetch = Failed to get group resource config history
+view_group_resConfig_table_msg1 = View Member History for status of each individual resource
+view_group_resConfig_table_statusDetails = Status Details
+view_group_resConfig_table_statusFailure = This group configuration update failed
+view_group_resConfig_table_statusInprogress = This group configuration update is still in progress
+view_group_resConfig_table_statusNochange = No changes were made to this group configuration
+view_group_resConfig_table_statusSuccess = This group configuration update was successful
+view_group_resConfig_table_title = Group Resource Configuration History
+view_group_resConfig_table_viewMemberHistory = View Member History
+view_group_resConfig_table_viewSettings = View Settings
+view_group_resConfig_view_groupProperties = Group Properties
+view_group_resConfig_view_noperm = You do not have permissions to see the resource configuration settings
+view_group_summary_compatible = Compatible
+view_group_summary_descUpdateFailure = Failed to change the description of the resource group with ID [{0}]
+view_group_summary_descUpdateSuccessful = You have changed the description of this resource group
+view_group_summary_dynamic = Dynamic
+view_group_summary_dynamicNote = Dynamic group names and descriptions are managed, and therefore are not editable
+view_group_summary_groupDefinition = Group Definition
+view_group_summary_memberCount = Member Count
+view_group_summary_memberType = Member Type
+view_group_summary_mixed = Mixed
+view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]
+view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]
+view_group_summary_recursive = Recursive
+view_helpTop_description = This section provides access to documentation, tutorials, version, and other helpful information.
+view_help_section_product = Product
+view_help_section_product_about = About
+view_inventory_adq = Discovery Queue
+view_inventory_allGroups = All Groups
+view_inventory_allResources = All Resources
+view_inventory_collectionInterval = Collection Interval
+view_inventory_dynagroupDefs = Dynagroup Definitions
+view_inventory_eventDetails_loadFailed = An error occurred loading the event details
+view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]
+view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]
+view_inventory_eventHistory_details = Details
+view_inventory_eventHistory_detailsFilter = Details Filter
+view_inventory_eventHistory_groupEventHistory = Group Event History
+view_inventory_eventHistory_purgeFailed = Failed to purge events for [{0}]
+view_inventory_eventHistory_purgeSuccessful = You have successfully purged [{0}] events for [{1}]
+view_inventory_eventHistory_resourceEventHistory = Resource Event History
+view_inventory_eventHistory_severity = Severity
+view_inventory_eventHistory_severityFilter = Severity Filter
+view_inventory_eventHistory_sourceFilter = Source Filter
+view_inventory_eventHistory_sourceLocation = Source Location
+view_inventory_eventHistory_timestamp = Timestamp
+view_inventory_groups = Groups
+view_inventory_groups_children = Children
+view_inventory_groups_deleteFailed = Failed to delete the selected resource groups
+view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
+view_inventory_groups_descendants = Descendants
+view_inventory_groups_loadFailed = Failed to load group composite data
+view_inventory_groups_resourceGroups = Resource Groups
+view_inventory_mixed = mixed
+view_inventory_platforms = Platforms
+view_inventory_problemGroups = Problem Groups
+view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible
+view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?
+view_inventory_resources_deleteFailed = Failed to delete the selected resources
+view_inventory_resources_deleteSuccessful = You have successfully deleted the selected resources
+view_inventory_resources_loadFailed = Failed to load resource composite data
+view_inventory_resources_title = Resources
+view_inventory_resources_title_children = Child Resources
+view_inventory_resources_title_members = Member Resources
+view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
+view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
+view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
+view_inventory_sectionHelp = From this section, newly discovered Resources, inventoried Resources, and Groups can be viewed and managed.
+view_inventory_servers = Servers
+view_inventory_services = Services
+view_inventory_summary_agent_error1 = Failed to locate agent managing resource id
+view_inventory_summary_agent_error2 = Failed to ping agent managing resource id
+view_inventory_summary_agent_error3 = You do not have permission to view details for this Agent.
+view_inventory_summary_agent_fullEnpoint = Full Endpoint
+view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!
+view_inventory_summary_agent_last_title = Last Received Availability Report
+view_inventory_summary_agent_status_title = Agent Communications Status
+view_inventory_summary_agent_title = Agent Managing this Resource
+view_inventory_unavailableServers = Unavailable Servers
+view_leftNav_unknownPage = Unknown page name [{0}] for section [{1}] - URL is invalid.
+view_login_invalidEmail = Invalid e-mail address
+view_login_login = Login
+view_login_logout = Logout
+view_login_noBackend = The backend datasource is unavailable.
+view_login_noLdap = Note: Optional retrieval of ldap details unsuccessful. Manual entry is required.
+view_login_noUser = The username or password provided does not match our records.
+view_login_prompt = Please Login
+view_login_registerLater = (Cancel - Complete registration later.)
+view_login_registerLdapSuccess = Successfully registered the new LDAP User.
+view_login_registerUser = Register User
+view_login_welcome = Welcome
+view_login_welcomeMsg = Welcome to RHQ! <br/><br/> Enter/update the following fields to complete your registration process.<br/> Once you click "OK", you will be logged in.<br/><br/>
+view_measureRange_last = Time Range - Previous
+view_measureRange_simple = Simple...
+view_measureRange_start = Time Range - Start
+view_measureTable_chartMetricValues = Chart Selected Metrics
+view_measureTable_getLive = Get Live Value
+view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
+view_measureTable_live_title = Live Data
+view_measure_nan = --no data available--
+view_measurementOob_title = Suspect Metrics
+view_menuBar_logout = Logout
+view_messageCenter_clearAllMessages = Clear All Messages
+view_messageCenter_lastNMessages = Last {0} Messages
+view_messageCenter_maxMessages = Max Messages
+view_messageCenter_messageBarShowDetails = Show Details
+view_messageCenter_messageDetail = Detail
+view_messageCenter_messageSeverity = Severity
+view_messageCenter_messageTime = Time
+view_messageCenter_messageTitle = Message Center
+view_messageCenter_noRecentMessages = No Recent Messages
+view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
+view_metric_traits = Traits
+view_metric_viewTraitHistory = Value History for Trait [{0}]
+view_operationHistoryDetails_dateCompleted = Date Completed
+view_operationHistoryDetails_dateSubmitted = Date Submitted
+view_operationHistoryDetails_error_fetchFailure = Failure loading operation history.
+view_operationHistoryDetails_noResults = This operation does not return any results.
+view_operationHistoryDetails_operation = Operation
+view_operationHistoryDetails_parameters = Parameters
+view_operationHistoryDetails_requestor = Requestor
+view_operationHistoryDetails_results = Results
+view_operationHistoryDetails_status = Status
+view_operationHistoryList_button_forceDelete = Force Delete
+view_operationHistoryList_button_runOperation = Run Operation
+view_operationHistoryList_notYetStarted = not yet started
+view_operationHistoryList_title = Operation History
+view_operationScheduleDetails_enterParametersBelow = Enter parameters below...
+view_operationScheduleDetails_fieldDefault_description = Select an operation to see its description.
+view_operationScheduleDetails_fieldDefault_parameters = Select an operation to see its parameters.
+view_operationScheduleDetails_fieldHelp_description = an optional description of this scheduled operation (e.g. nightly maintenance app server restart)
+view_operationScheduleDetails_fieldHelp_timeout = a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated
+view_operationScheduleDetails_field_description = Description
+view_operationScheduleDetails_field_parameters = Parameters
+view_operationScheduleDetails_field_timeout = Timeout
+view_operationScheduleDetails_noParameters = This operation does not take any parameters.
+view_operationScheduleDetails_operationSchedule = Operation Schedule
+view_portlet_autodiscovery_setting_platforms = discovered platforms
+view_portlet_configure_definitionDesc = The configuration settings for the portlet.
+view_portlet_configure_definitionTitle = Portlet Configuration
+view_portlet_configure_needed = Click the Settings button to configure this portlet.
+view_portlet_configure_notNeeded = Configuration is not necessary for this portlet.
+view_portlet_defaultName_autodiscovery = Discovery Queue
+view_portlet_defaultName_favoriteResources = Favorite Resources
+view_portlet_defaultName_groupMetric = Resource Group Metric Graph
+view_portlet_defaultName_group_alerts = Group: Alerts
+view_portlet_defaultName_group_bundles = Group: Bundle Deployments
+view_portlet_defaultName_group_config_updates = Group: Configuration Updates
+view_portlet_defaultName_group_events = Group: Event Counts
+view_portlet_defaultName_group_metrics = Group: Metrics
+view_portlet_defaultName_group_oobs = Group: OOB Conditions
+view_portlet_defaultName_group_operations = Group: Operations
+view_portlet_defaultName_group_pkg_hisory = Group: Package History
+view_portlet_defaultName_inventorySummary = Inventory Summary
+view_portlet_defaultName_mashup = Mashup
+view_portlet_defaultName_message = Message
+view_portlet_defaultName_operations = Recent Operations
+view_portlet_defaultName_platformSummary = Platform Utilization
+view_portlet_defaultName_problemResources = Alerted or Unavailable Resources
+view_portlet_defaultName_recentAlerts = Recent Alerts
+view_portlet_defaultName_recentlyAddedResources = Recently Added Resources
+view_portlet_defaultName_resourceMetric = Resource Metric Graph
+view_portlet_defaultName_resource_alerts = Resource: Alerts
+view_portlet_defaultName_resource_bundles = Resource: Bundle Deployments
+view_portlet_defaultName_resource_config_updates = Resource: Configuration Updates
+view_portlet_defaultName_resource_events = Resource: Event Counts
+view_portlet_defaultName_resource_metrics = Resource: Measurements
+view_portlet_defaultName_resource_oobs = Resource: OOB Metrics
+view_portlet_defaultName_resource_operations = Resource: Operations
+view_portlet_defaultName_resource_pkg_hisory = Resource: Package History
+view_portlet_defaultName_tagCloud = Tag Cloud
+view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
+view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
+view_portlet_graph_configure_resource_graph = The resource to graph
+view_portlet_help_autodiscovery = This portlet allows import or ignore of newly discovered resources. Imported resources are added to inventory for monitoring and management. Ignored resources are not imported and are hidden from view unless explicitly unignored.
+view_portlet_help_bundle_deps = This portlet shows relevant bundle deployments based on display criteria configured.
+view_portlet_help_config_updates = This portlet displays recent configuration changes consistent with configuration settings.
+view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
+view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
+view_portlet_help_graph = This portlet displays the resource metric graph.
+view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
+view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
+view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
+view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
+view_portlet_help_none = There is no help available for this portlet.
+view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
+view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
+view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
+view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
+view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
+view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
+view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
+view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
+view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
+view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
+view_portlet_inventory_error1 = Failed to retrieve inventory summary
+view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
+view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
+view_portlet_message_title = The message to display.
+view_portlet_operations_config_completed = completed operations
+view_portlet_operations_config_completed_enable = Whether to enable completed operations results grouping for dashboard.
+view_portlet_operations_config_completed_maximum = Maximum number of Completed operations to display.
+view_portlet_operations_config_scheduled_enable = Whether to enable scheduled operations results grouping for dashboard.
+view_portlet_operations_config_scheduled_maximum = Maximum number of Scheduled operations to display.
+view_portlet_operations_config_show_last = show Last
+view_portlet_operations_config_show_next = show Next
+view_portlet_operations_disabled = (Results currently disabled. Change settings to enable results.
+view_portlet_platform_platform_error_1 = Failed to load platform metrics
+view_portlet_platform_type_error_1 = Could not load type data
+view_portlet_problemResources_config_display_maximum = Maximum number of Problem resources to display.
+view_portlet_problemResources_config_display_range = Show problem resources going back this many hours.
+view_portlet_problemResources_config_display_range2 = From {0} to {1}
+view_portlet_problemResources_maxDisplaySetting = maximum resources.
+view_portlet_recentAlerts_config_members = Select Members
+view_portlet_recentAlerts_config_priority_label = priority Alerts,
+view_portlet_recentAlerts_config_when = within the past
+view_portlet_recentAlerts_fail_msg = Failed to load resources assigned for alert filtering.
+view_portlet_recentlyAdded_error1 = Failed to load recently added resources
+view_portlet_recentlyAdded_setting_addedPlatforms = recently added platforms
+view_portlet_results_empty = No results found using specified criteria.
+view_remoteAgentInstall_agentStatus = Agent Status
+view_remoteAgentInstall_agentStatusDefault = -Click Update Status Button-
+view_remoteAgentInstall_buttonFindAgent = Find Agent
+view_remoteAgentInstall_connInfo = Connection Information
+view_remoteAgentInstall_error_1 = Error occurred while trying to find agent install path
+view_remoteAgentInstall_error_2 = Could not find an agent installed when looking in common locations
+view_remoteAgentInstall_error_3 = Could not find an agent installed at or under [{0}]
+view_remoteAgentInstall_error_4 = Failed to install agent
+view_remoteAgentInstall_error_5 = Failed to start agent
+view_remoteAgentInstall_error_6 = Failed to stop agent
+view_remoteAgentInstall_installAgent = Install Agent
+view_remoteAgentInstall_installInfo = Agent Installation Information
+view_remoteAgentInstall_installPath = Agent Install Path
+view_remoteAgentInstall_owner = Owner
+view_remoteAgentInstall_promptHost = The host where the agent is or will be installed
+view_remoteAgentInstall_promptInstallPath = Where the agent is or will be installed. If you aren''t sure where an agent is installed, enter a parent directory and click the ''Find Agent'' button to scan that directory and below. If you enter an empty path, common locations are searched on the host for an agent install.
+view_remoteAgentInstall_promptPassword = The credentials that are used to authenticate the user on the host via SSH
+view_remoteAgentInstall_promptPort = The port the SSH server is listening to. If not specified, the default is 22
+view_remoteAgentInstall_promptUser = The name of the user whose credentials are passed to the host via SSH
+view_remoteAgentInstall_result = Result
+view_remoteAgentInstall_resultCode = ResultCode
+view_remoteAgentInstall_startAgent = Start Agent
+view_remoteAgentInstall_startAgentResults = Agent start results: [{0}]
+view_remoteAgentInstall_step = Step
+view_remoteAgentInstall_stopAgent = Stop Agent
+view_remoteAgentInstall_stopAgentResults = Agent stop results: [{0}]
+view_remoteAgentInstall_success = Agent installation complete
+view_remoteAgentInstall_updateStatus = Update Status
+view_reportsTop_description = This section provides access to global reports.
+view_reportsTop_title = Reports
+view_reports_alertDefinitions = Alert Definitions
+view_reports_alertDefinitions_parentHover = Click to go to the parent alert definition
+view_reports_alertDefinitions_resTypeLoadError = Cannot get the template resource type - unable to view the alert template.
+view_reports_inventorySummary_failFetch = Failed to get inventory summary
+view_reports_platforms = Platform Utilization
+view_reports_subsystems = Subsystems
+view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.
+view_resourceResourceGroupList_error_updateFailure = Failed to update assigned Resource groups.
+view_resourceResourceGroupList_message_updateSuccess = Group membership updated for [{0}].
+view_resource_inventory_activity_changed_by = Changed by
+view_resource_inventory_activity_criteria_no_recent_events = No event counts based off display criteria.
+view_resource_inventory_activity_no_recent_alerts = No recent alerts
+view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
+view_resource_inventory_activity_no_recent_config_history = No configuration change history
+view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
+view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
+view_resource_inventory_activity_no_recent_oob = No OOB conditions found
+view_resource_inventory_activity_no_recent_operations = No recent operation history
+view_resource_inventory_activity_no_recent_pkg_history = No recent package history
+view_resource_inventory_childhistory_createdChild = Created Child
+view_resource_inventory_childhistory_deletedChild = Deleted Child
+view_resource_inventory_childhistory_filterTitle = Past N Days
+view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
+view_resource_inventory_childhistory_status_invalidConfig = Invalid Configuration
+view_resource_monitor_availability_loadFailed = Failed to load availability history
+view_resource_monitor_calltime_average = Average
+view_resource_monitor_calltime_count = Count
+view_resource_monitor_calltime_destination = Call Destination
+view_resource_monitor_calltime_editFailed = Call time data can not be edited
+view_resource_monitor_calltime_loadFailed = Could not load call time data
+view_resource_monitor_calltime_lookupFailed = Could not load resource for call time
+view_resource_monitor_calltime_maximum = Maximum
+view_resource_monitor_calltime_minimum = Minimum
+view_resource_monitor_calltime_title = Call Time Data
+view_resource_monitor_calltime_total = Total
+view_resource_monitor_detailed_graph_label = Detailed Graph
+view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
+view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
+view_resource_monitor_graphs_loadFailed = Failed to load graph data
+view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
+view_resource_monitor_graphs_noneAvailable = No graphs available
+view_resource_monitor_schedules_title = Resource Metric Collection Schedules
+view_resource_monitor_table_alerts = Alerts
+view_resource_monitor_table_avg = Average
+view_resource_monitor_table_last = Last
+view_resource_monitor_table_max = Maximum
+view_resource_monitor_table_min = Minimum
+view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details
+view_resource_title_tagUpdateFailed = Failed to update resource tags
+view_searchBar_defaultPattern = name your pattern
+view_searchBar_error_selectSavedSearch = ''Error selecting saved search''
+view_searchBar_query = Query
+view_searchBar_resourceGroups = Resource Groups
+view_searchBar_resources = Resources
+view_searchBar_welcomeMessage = search for {0}s
+view_searchGUI_loginStatus = Unable to determine login status, check server status
+view_selector_assigned = Assigned {0}
+view_selector_available = Available {0}
+view_subTab_error_disabled = Cannot select disabled subTab [{0}].
+view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
+view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_traitsLoadFailure = Failed to load traits for {0}.
+view_summaryOverviewForm_field_description = Description
+view_summaryOverviewForm_field_location = Location
+view_summaryOverviewForm_field_name = Name
+view_summaryOverviewForm_field_type = Type
+view_summaryOverviewForm_field_version = Version
+view_summaryOverviewForm_header_summary = Summary
+view_summaryOverviewForm_label_plugin = Plugin:
+view_summaryOverviewForm_label_type = Type:
+view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverview_header_detectedErrors = Detected Errors
+view_summaryOverview_title_errorDetailsWindow = Error Details
+view_summaryOverview_tooltip_detectedErrors = Click on the rows to see the error details.
+view_tableSection_backButton = Back to List
+view_tableSection_error_badId = Can not show detail for [{0}]. Illegal 'id': [{1}]. Please report this bug
+view_tableSection_error_noId = Table [{0}] record is missing 'id' attribute - please report this bug.
+view_table_drawFail = Failed to draw Table [{0}].
+view_table_matchingRows = Matching Rows: {0} (selected: {1})
+view_table_totalRows = Total Rows: {0} (selected: {1})
+view_tabs_common_activity = Activity
+view_tabs_common_agent = Agent
+view_tabs_common_alerts = Alerts
+view_tabs_common_availability = Availability
+view_tabs_common_calltime = Calltime
+view_tabs_common_child_history = Child History
+view_tabs_common_child_resources = Child Resources
+view_tabs_common_configuration = Configuration
+view_tabs_common_connectionSettings = Connection Settings
+view_tabs_common_connectionSettingsHistory = Connection Settings History
+view_tabs_common_content = Content
+view_tabs_common_current = Current
+view_tabs_common_dashboard = Dashboard
+view_tabs_common_definitions = Definitions
+view_tabs_common_deployed = Deployed
+view_tabs_common_events = Events
+view_tabs_common_graphs = Graphs
+view_tabs_common_group_members = Group Members
+view_tabs_common_group_membership = Group Membership
+view_tabs_common_groups = Groups
+view_tabs_common_history = History
+view_tabs_common_inventory = Inventory
+view_tabs_common_members = Members
+view_tabs_common_monitoring = Monitoring
+view_tabs_common_new = New
+view_tabs_common_operations = Operations
+view_tabs_common_overview = Overview
+view_tabs_common_schedule = Schedule
+view_tabs_common_schedules = Schedules
+view_tabs_common_subscriptions = Subscriptions
+view_tabs_common_summary = Summary
+view_tabs_common_tables = Tables
+view_tabs_common_timeline = Timeline
+view_tabs_common_traits = Traits
+view_tabs_invalidSubTab = Invalid subtab: {0}
+view_tabs_invalidTab = Invalid tab: {0}
+view_tagCloud_deleteTag = Delete Tag
+view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
+view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
+view_tagCloud_error_fetchFailure = Failed to load tags.
+view_tagCloud_error_tagUsedCount = Tag used {0} times.
+view_tagCloud_title = Tag Cloud
+view_taggedResources_title = Resources
+view_tags_error_1 = Failed to load Tags
+view_tags_tags = Tags
+view_tags_tooltip_1 = Click to remove this Tag
+view_tags_tooltip_2 = Click to edit Tags
+view_tags_tooltip_3 = Enter a Tag in the format: (namespace:)(semantic=)tagname (e.g. it:env=QA, or owner=John)
+view_testTop_description = This section contains pages for testing various GUI components.
+view_testTop_title = Test
+view_titleBar_common_addedFav = You have added [{0}] as a favorite
+view_titleBar_common_addedFavFailure = Failed to add [{0}] as a favorite
+view_titleBar_common_clickToAddFav = Click to add this as a favorite
+view_titleBar_common_clickToRemoveFav = Click to remove this as a favorite
+view_titleBar_common_loadTagsFailure = Failed to load the tags for [{0}]
+view_titleBar_common_removedFav = You have removed [{0}] as one of your favorites
+view_titleBar_common_removedFavFailure = Failed to remove [{0}] as one of your favorites
+view_titleBar_common_updateTagsFailure = Failed to update the tags for [{0}]
+view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have been updated
+view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
+view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
+view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
+view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]
+view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration
+view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource Configuration
+view_tree_common_contextMenu_groupGraph = Group Metric Graph
+view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
+view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboards
+view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
+view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
+view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children
+view_tree_common_contextMenu_measurements = Measurements
+view_tree_common_contextMenu_operations = Operations
+view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
+view_tree_common_contextMenu_resourceConfiguration = Resource Configuration
+view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
+view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard
+view_tree_common_contextMenu_saveChartToDashboardSuccessful = You have saved dashboard [{0}]
+view_tree_common_contextMenu_type_name_label = Type: {0}
+view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
+view_tree_common_loadFailed_children = Failed to load children for node
+view_tree_common_loadFailed_create = Failed to create view for this node
+view_tree_common_loadFailed_descendants = Failed to load descendants for tree
+view_tree_common_loadFailed_generic = Failed to load data for tree
+view_tree_common_loadFailed_group = Failed to load group with id [{0}]
+view_tree_common_loadFailed_groupTree = Failed to load group tree
+view_tree_common_loadFailed_node = Failed to load data for this node
+view_tree_common_loadFailed_root = Failed to load root for tree
+view_tree_common_loadFailed_selection = Failed to select this node
+view_tree_common_loadFailed_update = Failed to update view for this node
+view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
+view_type_parentId = Parent ID
+view_type_resourceTypes = Resource Types
+view_type_typeTreeLoadFailure = Failed to load resource type tree data
+view_upload_alreadyUploaded = File has already been uploaded
+view_upload_bundleDistFile = Distribution File
+view_upload_error_bundleDistFile = Error uploading Bundle Distribution File
+view_upload_error_file = Error uploading file
+view_upload_error_fileName = Error uploading file [{0}]
+view_upload_error_fileName_2 = Error uploading file [{0}], check for invalid file path.
+view_upload_error_packageVersionFile = Error uploading Package Version File
+view_upload_error_results = Error uploading file, unexpected results: [{0}]
+view_upload_inProgress = Can not submit, upload is currently in progress
+view_upload_prompt_1 = Please select a file to upload [{0}]
+view_upload_prompt_2 = File to Upload
+view_upload_success = File successfully uploaded
+view_upload_tooltip_1a = Select a file to upload, then click Upload or Next
+view_upload_tooltip_1b = Select a file to upload, then click Next
+view_upload_tooltip_2 = File upload had previously failed
+view_upload_upload = Upload
+view_upload_uploadFile = UploadFile
+widget_colorPicker_tooltip = Click to select a new color
+widget_durationItem_inputUnitLessThanTargetUnit = Input unit is less than target unit.
+widget_durationItem_unitTypeNotSupported = Unit type [{0}] is not supported by this DurationItem.
+widget_jobTriggerEditor_fieldHelp_repeatDuration = keep running this operation this many times or until this amount of time has elapsed
+widget_jobTriggerEditor_fieldHelp_repeatInterval = how often the operation should be executed
+widget_jobTriggerEditor_fieldHelp_startDelay = start executing the operation after this amount of time has elapsed
+widget_jobTriggerEditor_field_cronExpression = Cron Expression
+widget_jobTriggerEditor_field_mode = Schedule using
+widget_jobTriggerEditor_field_repeatInterval_later = Repeat every
+widget_jobTriggerEditor_field_repeatInterval_now = Run now and every
+widget_jobTriggerEditor_field_startType = Run
+widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = End time must be after start time.
+widget_jobTriggerEditor_message_endTimeMustBeInFuture = End time must be in the future.
+widget_jobTriggerEditor_message_startTimeMustBeInFuture = Start time must be in the future.
+widget_jobTriggerEditor_tab_examples = Examples
+widget_jobTriggerEditor_tab_format = Format
+widget_jobTriggerEditor_value_calendar = Calendar
+widget_jobTriggerEditor_value_cronExpression = Cron Expression
+widget_jobTriggerEditor_value_for = For
+widget_jobTriggerEditor_value_in = in
+widget_jobTriggerEditor_value_indefinitely = Indefinitely
+widget_jobTriggerEditor_value_later = Later
+widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
+widget_jobTriggerEditor_value_now = Now
+widget_jobTriggerEditor_value_nowAndRepeat = Now & Repeat
+widget_jobTriggerEditor_value_on = on
+widget_jobTriggerEditor_value_until = Until
+widget_recordEditor_error_invalidViewPath = Invalid view path: [{0}]
+widget_recordEditor_error_multipleRecords = Multiple records were returned - expected exactly one.
+widget_recordEditor_error_noRecords = No records were returned - expected exactly one.
+widget_recordEditor_error_operation = Operation failed. An error occurred
+widget_recordEditor_error_operationInvalidValues = Operation failed - one or more fields have invalid values
+widget_recordEditor_error_permissionCreate = You do not have the permissions required to create a new [{0}]
+widget_recordEditor_error_unsupportedOperationType = Unsupported operation type: [{0}]
+widget_recordEditor_info_recordCreatedConcise = {0} created.
+widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created.
+widget_recordEditor_info_recordUpdatedConcise = {0} updated.
+widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
+widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
+widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
+widget_recordEditor_label_loading = Loading...
+widget_recordEditor_title_edit = Edit {0} [{1}]
+widget_recordEditor_title_new = Create New {0}
+widget_recordEditor_title_view = View {0} [{1}]
+widget_recordEditor_warn_validation = One or more fields have invalid values. This [{0}] cannot be saved until these values are corrected
+widget_resourceFactoryWizard_archPrompt = Package Architecture
+widget_resourceFactoryWizard_configTemplatePrompt = Resource Configuration Templates
+widget_resourceFactoryWizard_contentTemplatePrompt = Deployment Time Configuration Templates
+widget_resourceFactoryWizard_createSubmit = A request to create a resource with the name of [{0}] has been submitted successfully.
+widget_resourceFactoryWizard_createSubmitType = A request to create a resource of type [{0}] has been submitted successfully.
+widget_resourceFactoryWizard_createWizardTitle = Create New Resource of Type [{0}]
+widget_resourceFactoryWizard_createWizardWindowTitle = Resource Create Wizard
+widget_resourceFactoryWizard_editConfigStepName = Deployment Options
+widget_resourceFactoryWizard_execute1 = Failed to create a new resource - there is no package version
+widget_resourceFactoryWizard_execute2 = Failed to create a new resource
+widget_resourceFactoryWizard_failedToDeleteVersion = Failed to delete package version while canceling a resource create
+widget_resourceFactoryWizard_failedToGetType = Failed to get backing package type for new resource
+widget_resourceFactoryWizard_importFailure = Failed to manually import resource
+widget_resourceFactoryWizard_importSubmitted = A request to import a new resource of type [{0}] has been submitted
+widget_resourceFactoryWizard_importWizardTitle = Import Resource of Type [{0}]
+widget_resourceFactoryWizard_importWizardWindowTitle = Resource Import Wizard
+widget_resourceFactoryWizard_infoStepName = Resource Information
+widget_resourceFactoryWizard_infoStep_loadFail = Failed to get available Architectures
+widget_resourceFactoryWizard_namePrompt = New Resource Name
+widget_resourceFactoryWizard_templatePrompt = Connection Settings Template
+widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
+widget_resourceFactoryWizard_uploadFailure = Failed to upload file
+widget_resourceFactoryWizard_uploadFileStepName = Upload Resource Content File
+widget_resourceFactoryWizard_uploadInProgress = The upload is in progress... This can take several minutes to complete for large distribution files.
+widget_resourceFactoryWizard_versionPrompt = Package Version
+widget_resourceSelector_groupCategory = Group Category
+widget_resourceSelector_pleaseSelectMultipleResource = Please select one or more resources
+widget_resourceSelector_pleaseSelectResource = Please select a resource
+widget_resourceSelector_selectMultipleResources = Select Resources
+widget_resourceSelector_selectResource = Select a Resource
+widget_typeCache_loadFail = Failed to load resource type metadata
+widget_typeTree_badTemplateType = Invalid URL. Unknown template type [{0}]
+widget_typeTree_badTypeId = Invalid URL. Bad resource type ID [{0}]
+widget_typeTree_loadFail = Failed to load resource types
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 6fe9b0b..1c105be 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -1,8 +1,8 @@
#
# RHQ GUI i18n Messages - Locale: DE
-#
+#
# This file should be UTF-8 encoded.
-#
+#
# Developers: See the following wiki page for how to work with this file:
#
# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index aeb5f6a..0e55501 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -1,1796 +1,1795 @@
-#
-# RHQ GUI i18n Messages - Locale: JA
-#
-# This file should be UTF-8 encoded.
-#
-# Developers: See the following wiki page for how to work with this file:
-#
-# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
-#
-###################################
-common_alert_high = High
-common_alert_low = Low
-common_alert_medium = Medium
-common_buildInfo_gwtVersion = ${gwt.version}
-common_button_ack = 確認
-common_button_ack_all = すべてを確認
-common_button_add = 追加
-common_button_advanced = Advanced...
-common_button_apply = 適用
-common_button_cancel = キャンセル
-common_button_close = 閉じる
-common_button_compare = 比較
-common_button_create_child = 子を作成
-common_button_delete = 削除
-common_button_delete_all = すべてを削除
-common_button_disable = 無効
-common_button_edit = 編集
-common_button_enable = 有効
-common_button_finish = 完了
-common_button_import = インポート
-common_button_new = 新規
-common_button_next = 次へ
-common_button_ok = OK
-common_button_previous = 前へ
-common_button_purgeAll = すべてをパージ
-common_button_refresh = リフレッシュ
-common_button_reset = リセット
-common_button_save = 保存
-common_button_schedule = スケジュール
-common_button_search = 検索
-common_button_set = 設定
-common_button_showDetails = 詳細表示...
-common_button_uninventory = アンインベントリ
-common_calendar_april_short = apr
-common_calendar_august_short = aug
-common_calendar_december_short = dec
-common_calendar_february_short = feb
-common_calendar_january_short = jan
-common_calendar_july_short = jul
-common_calendar_june_short = jun
-common_calendar_march_short = mar
-common_calendar_may_short = may
-common_calendar_november_short = nov
-common_calendar_october_short = oct
-common_calendar_september_short = sept
-common_label_ago = ago
-common_label_all = すべての
-common_label_all_resources = all resources
-common_label_day = day
-common_label_days = days
-common_label_hour = hour
-common_label_hours = hours
-common_label_item = item
-common_label_items = items
-common_label_milliseconds = milliseconds
-common_label_minutes = minutes
-common_label_month = month
-common_label_none = none
-common_label_role = role
-common_label_roles = roles
-common_label_scheduled_operations = scheduled operations
-common_label_seconds = seconds
-common_label_selected_resources = selected resources
-common_label_unlimited = unlimited
-common_label_user = user
-common_label_users = users
-common_label_week = week
-common_label_weeks = weeks
-common_label_yesterday = Yesterday
-common_msg_areYouSure = Are You Sure?
-common_msg_changeAutoDetected = Change auto-detected
-common_msg_deleteConfirm = Are you sure you want to delete the # selected {0}?
-common_msg_emphasizedNotePrefix = NOTE:
-common_msg_loading = Loading...
-common_msg_noItemsToShow = No items to show
-common_msg_notYetImplemented = Not Yet Implemented
-common_msg_see_more = see more...
-common_msg_step_x_of_y = Step {0} of {1}
-common_severity_debug = Debug
-common_severity_error = Error
-common_severity_fatal = Fatal
-common_severity_info = Info
-common_severity_warn = Warn
-common_status_canceled = Canceled
-common_status_deferred = Deferred
-common_status_failed = Failed
-common_status_inprogress = In Progress
-common_status_nochange = No Change
-common_status_partial = Partial
-common_status_success = Success
-common_status_timedOut = Timed Out
-common_status_unknown = Unknown
-common_title_add_column = カラム追加
-common_title_add_portlet = ポートレット追加
-common_title_address = アドレス
-common_title_alert_range = アラートの範囲
-common_title_ancestry = 祖先
-common_title_availability = アベイラビリティ
-common_title_available_resources = 利用可能リソース
-common_title_average_metrics = 毎分の平均メトリックス
-common_title_background = バックグラウンド
-common_title_bundle = バンドル
-common_title_bundles = バンドル
-common_title_category = カテゴリ
-common_title_change_refresh_time = インターバルのリフレッシュ
-common_title_columns = カラム
-common_title_compare_metrics = メトリックスの比較
-common_title_compatibleGroups = 互換グループ
-common_title_compatibleGroups_total = 互換グループの合計
-common_title_component_errors = コンポーネントエラー
-common_title_config_update_status = 更新状態
-common_title_configuration = 構成
-common_title_count = 数
-common_title_custom = カスタム
-common_title_dashboard_name = ダッシュボード名
-common_title_dateCreated = 生成日
-common_title_dateRange = 日付の範囲
-common_title_default = デフォルト
-common_title_description = 説明
-common_title_details = 詳細
-common_title_display = 表示
-common_title_display_name = 表示名
-common_title_duration = 期間
-common_title_edit_mode = 編集モード
-common_title_enabled = 有効?
-common_title_end = 終了
-common_title_error = エラー
-common_title_generalProp = 一般プロパティ
-common_title_group = グループ
-common_title_group_def_total = グループ定義の合計
-common_title_group_member_health = グループメンバーの状態
-common_title_groups = グループ
-common_title_help = ヘルプ
-common_title_host = ホスト
-common_title_icon =
-common_title_id = ID
-common_title_id_parent = 親のID
-common_title_info = 情報
-common_title_inventory = インベントリ
-common_title_inventorySummary = インベントリサマリ
-common_title_lastUpdated = 最終更新
-common_title_lastUpdatedBy = 最終更新(による)
-common_title_ldapGroups = LDAPグループ
-common_title_mashup = マッシュアップ
-common_title_members_reporting = メンバーのリポート
-common_title_message = メッセージ
-common_title_metric = メトリック
-common_title_metric_chart = メトリック図
-common_title_mixedGroups = 混合グループ
-common_title_mixedGroups_total = 混合グループの合計
-common_title_name = 名前
-common_title_new_dashboard = 新規ダッシュボード
-common_title_numeric_metrics = 数値メトリックス
-common_title_numeric_type = 数値型
-common_title_operation_status = オペレーションの状態
-common_title_operations = オペレーション
-common_title_operations_range = オペレーションの範囲
-common_title_over = Over
-common_title_password = パスワード
-common_title_path = パス
-common_title_permissions = パーミッション
-common_title_platform = プラットフォーム
-common_title_platform_total = プラットフォームの合計
-common_title_plugin = プラグイン
-common_title_port = ポート
-common_title_providers = プロバイダ
-common_title_recent_alerts = 最近のアラート
-common_title_recent_bundle_deployments = 最近のバンドルのデプロイ
-common_title_recent_configuration_updates = 最近の構成の更新
-common_title_recent_event_counts = 最近のイベント数
-common_title_recent_measurements = 最近の測定
-common_title_recent_oob_metrics = 最近の境界外のメトリックス
-common_title_recent_operations = 最近のオペレーション
-common_title_recent_pkg_history = 最近のパッケージ履歴
-common_title_recently_added = 最近追加された
-common_title_remove_column = カラムの削除
-common_title_repositories = リポジトリ
-common_title_resource = リソース
-common_title_resourceGroups = リソースグループ
-common_title_resource_group = リソースグループ
-common_title_resource_id = リソースID
-common_title_resource_inventory = リソースインベントリ
-common_title_resource_key = リソースキー
-common_title_resource_name = リソース名
-common_title_resource_type = リソースタイプ
-common_title_resources = リソース
-common_title_results_count = 結果の数
-common_title_results_count_tooltip = 結果の数の表示
-common_title_role = ロール
-common_title_roles = ロール
-common_title_scheduled_operations = スケジュールされたオペレーション
-common_title_search = 検索
-common_title_selected_resources = 選択されたリソース
-common_title_server = サーバー
-common_title_server_total = サーバーの合計
-common_title_service = サービス
-common_title_service_total = サービスの合計
-common_title_settings = 設定
-common_title_show = 表示
-common_title_show_more = 詳細表示...
-common_title_sort_order = ソート順
-common_title_sort_order_tooltip = 結果のソート順を設定
-common_title_start = 開始
-common_title_status = ステータス
-common_title_stop = 停止
-common_title_summary = サマリ
-common_title_tag_cloud = Tag Cloud
-common_title_the = The
-common_title_timestamp = 日付/時間
-common_title_total = 合計
-common_title_type = タイプ
-common_title_units = 単位
-common_title_user = ユーザー
-common_title_users = ユーザー(複数)
-common_title_value = 値
-common_title_version = バージョン
-common_title_view_mode = ビューモード
-common_title_web_address = Webアドレス
-common_title_welcome = ようこそ
-common_unit_days = days
-common_unit_hours = hours
-common_unit_milliseconds = milliseconds
-common_unit_minutes = minutes
-common_unit_months = months
-common_unit_seconds = seconds
-common_unit_times = times
-common_unit_weeks = weeks
-common_unit_years = years
-common_val_for = for
-common_val_n1st = {0}st
-common_val_n2nd = {0}nd
-common_val_n3rd = {0}rd
-common_val_na = N/A
-common_val_never = Never
-common_val_no = No
-common_val_no_lower = no
-common_val_none = None
-common_val_nth = {0}th
-common_val_yes = Yes
-common_val_yes_lower = yes
-dataSource_ContentRepoTree_error_load = Error loading repositories
-dataSource_ContentRepoTree_field_parentId = Parent ID
-dataSource_bundle_loadFailed = Failed to load Bundle data
-dataSource_configurationHistory_clickToSeeError = Double click to see error message...
-dataSource_configurationHistory_currentConfig = This is the current configuration
-dataSource_configurationHistory_dateCompleted = 完了日
-dataSource_configurationHistory_dateSubmitted = 発行日
-dataSource_configurationHistory_error_fetchFailure = Unable to load configuration history.
-dataSource_configurationHistory_updateType = 更新タイプ
-dataSource_configurationHistory_updateType_group = グループ
-dataSource_configurationHistory_updateType_individual = 個人
-dataSource_definitions_loadFailed = Failed to load metric definitions
-dataSource_measurementOob_error_fetchFailure = Failed to load measurement OOB information
-dataSource_measurementOob_field_factor = 範囲外係数 (%)
-dataSource_measurementOob_field_formattedBaseband = バンド
-dataSource_measurementOob_field_formattedOutlier = アウトライナ
-dataSource_measurementOob_field_parentName = 親
-dataSource_measurementOob_field_resourceName = リソース
-dataSource_measurementOob_field_scheduleName = メトリック
-dataSource_operationHistory_error_fetchFailure = Failure loading operation histories.
-dataSource_operationHistory_field_createdTime = 生成時刻
-dataSource_operationHistory_field_operationName = オペレーション名
-dataSource_operationHistory_field_startedTime = 開始時刻
-dataSource_operationHistory_field_subject = 要求者
-dataSource_operationSchedule_field_description = ノート
-dataSource_operationSchedule_field_id = スケジュールID
-dataSource_operationSchedule_field_nextFireTime = 次回の実行
-dataSource_operationSchedule_field_operationDisplayName = オペレーション
-dataSource_operationSchedule_field_operationName = オペレーション
-dataSource_operationSchedule_field_subject = オーナー
-dataSource_operationSchedule_field_timeout = タイムアウト (秒)
-dataSource_platforms_field_cpu = CPU
-dataSource_platforms_field_memory = メモリ
-dataSource_platforms_field_swap = スワップ
-dataSource_problemResources_error_fetchFailure = Failed to load Resources with alerts/unavailability.
-dataSource_problemResources_field_alerts = アラート
-dataSource_problemResources_field_available = 現在のアベイラビリティ
-dataSource_recentOperations_error_fetchFailure = Failed to load recently completed operations.
-dataSource_recentOperations_field_location = ロケーション
-dataSource_recentOperations_field_operation = オペレーション
-dataSource_recentOperations_field_resource = リソース
-dataSource_recentOperations_field_status = ステータス
-dataSource_recentOperations_field_time = 日付/時刻
-dataSource_resourceErrors_clickStatusIcon = Click the icon for more details
-dataSource_resourceErrors_deleteFailure = Failed to delete resource errors
-dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
-dataSource_resourceErrors_error_fetchFailure = Failed to find Resource errors for Resource with id [{0}].
-dataSource_resourceErrors_field_errorType = エラータイプ
-dataSource_resourceErrors_field_summary = サマリ
-dataSource_resourceErrors_field_timeOccured = 時刻
-dataSource_resourceGroups_loadFailed = Failed to load Resource Groups
-dataSource_resources_field_discoveryTime = 発見時刻
-dataSource_resources_field_importTime = インポート時刻
-dataSource_resources_field_key = キー
-dataSource_resources_field_lastModifiedTime = 最終更新時刻
-dataSource_resources_field_lastModifier = 最終更新者
-dataSource_resources_field_location = 場所
-dataSource_rpc_error_transformRequestFailure = Failure in datasource while processing {0} request.
-dataSource_rpc_error_unsupportedArrayFilterType = No support for passing array filters of type {0}.
-dataSource_rpc_error_unsupportedEnumType = Please add an appropriate code block for enum {0} to RPCDataSource.getEnumArray(Class)
-dataSource_rpc_no = no
-dataSource_rpc_yes = yes
-dataSource_scheduledOperations_error_fetchFailure = Failed to load scheduled operations.
-dataSource_scheduledOperations_field_location = 場所
-dataSource_scheduledOperations_field_operation = オペレーション
-dataSource_scheduledOperations_field_resource = リソース
-dataSource_scheduledOperations_field_time = 日付/時刻
-dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
-dataSource_schedules_disableSuccessful_full_group = You have disabled the collection of [{0}] measurements for the resource group with ID [{1}]. The disabled measurements are: [{2}]
-dataSource_schedules_disableSuccessful_full_resource = You have disabled the collection of [{0}] measurements for the resource with ID [{1}]. The disabled measurements are: [{2}]
-dataSource_schedules_enableFailure_group = Failed to enable the collection of [{0}] metrics for group with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_enableFailure_resource = Failed to enable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_enableSuccessful_concise = You have enabled the collection of [{0}] measurements
-dataSource_schedules_enableSuccessful_full_group = You have enabled the collection of [{0}] measurements for the resource group with ID [{1}]. The enabled measurements are: [{2}]
-dataSource_schedules_enableSuccessful_full_resource = You have enabled the collection of [{0}] measurements for the resource with ID [{1}]. The enabled measurements are: [{2}]
-dataSource_schedules_field_resourceGroupId = Group ID
-dataSource_schedules_loadFailed = Failed to load metric schedules
-dataSource_schedules_loadFailedContext = Failed to load metric schedules for context [{0}]
-dataSource_schedules_loadFailedCriteria = Failed to load metric schedules for criteria [{0}]
-dataSource_schedules_updateFailure_group = Failed to set the collection interval of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
-dataSource_schedules_updateFailure_resource = Failed to set the collection interval of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
-dataSource_schedules_updateSuccessful_concise = A new collection interval of [{0}] seconds has been set on [{1}] measurements
-dataSource_schedules_updateSuccessful_full_group = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource group with ID [{2}]. The updated measurements are: [{3}]
-dataSource_schedules_updateSuccessful_full_resource = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource with ID [{2}]. The updated measurements are: [{3}]
-dataSource_traits_failFetch = Failed to fetch traits for criteria [{0}].
-dataSource_traits_field_definitionID = Definition ID
-dataSource_traits_field_lastChanged = Last Changed
-dataSource_traits_field_primaryKey = Primary Key
-dataSource_traits_field_trait = Trait
-dataSource_traits_group_field_groupId = Group ID
-dataSource_users_delete = 削除済みユーザー [{0}]
-dataSource_users_deleteFailed = ユーザー [{0}] の削除に失敗しました
-dataSource_users_field_department = 部門
-dataSource_users_field_emailAddress = Eメールアドレス
-dataSource_users_field_factive = ログインは有効?
-dataSource_users_field_firstName = 名前
-dataSource_users_field_id = ID
-dataSource_users_field_lastName = 名字
-dataSource_users_field_ldap = LDAPログイン?
-dataSource_users_field_name = ユーザー名
-dataSource_users_field_password = パスワード
-dataSource_users_field_passwordVerify = パスワードの確認
-dataSource_users_field_phoneNumber = 電話番号
-dataSource_users_invalidEmailAddress = 無効なEメールアドレス
-dataSource_users_passwordsDoNotMatch = パスワードが一致していません
-datasource_roles_field_ldapGroups = LDAPグループ
-datasource_roles_field_permissions = パーミッション
-datasource_roles_field_resourceGroups = リソースグループ
-datasource_roles_field_subjects = サブジェクト
-datasource_templateSchedules_disabled = Disabled collection of selected metric [{0}].
-datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_disabled_failed = Failed to disable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled = Enabled collection of selected metric [{0}].
-datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled_failed = Failed to enable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_updated = Updated collection intervals of selected metric [{0}].
-datasource_templateSchedules_updated_detail = Collection interval for metric [{0}] [{1}] by default for ResourceType with id [{2}] set to [{3}] seconds.
-datasource_templateSchedules_updated_failed = Failed to set collection interval to [{0}] seconds for metric [{1}] [{2}] by default for ResourceType with id [{3}].
-favorites = お気に入り
-favorites_groups = お気に入りグループ
-favorites_recentlyViewed = 最近閲覧した
-favorites_resources = お気に入りリソース
-group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource
-util_ancestry_parentAncestry = Parent Ancestry for:
-util_disambiguationReportDecorator_pluginSuffix = ({0} plugin)
-util_errorHandler_nullException = exception was null
-util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status.
-util_rpcManager_activeRequests = {0} Active Requests
-util_userPerm_loadFailGlobal = Failed to load your global permissions - none granted.
-util_userPerm_loadFailGroup = Failed to load your permissions for Resource Group with id [{0}] - none granted.
-util_userPerm_loadFailResource = Failed to load your permissions for Resource with id [{0}] - none granted.
-util_userSession_loadFailSubject = UserSessionManager: Failed to load user Subject
-util_userSession_logoutFail = Failed to logout.
-util_widgetsField_unlimited = Unlimited
-view_aboutBox_allRightsReserved = All Rights Reserved.
-view_aboutBox_buildNumber = ビルド番号:
-view_aboutBox_failedToLoad = Failed to load product information.
-view_aboutBox_homepage = ホームページ
-view_aboutBox_jbossByRedHat = JBoss by Red Hat
-view_aboutBox_title = {0}について
-view_aboutBox_version = バージョン:
-view_adminConfig_downloads = ダウンロード
-view_adminConfig_plugins = プラグイン
-view_adminConfig_systemSettings = システム設定
-view_adminConfig_templates = テンプレート
-view_adminContent_contentSources = コンテントソース
-view_adminContent_repositories = リポジトリ
-view_adminRoles_assignedGroups = Assigned Resource Groups
-view_adminRoles_assignedSubjects = Assigned Subjects
-view_adminRoles_failLdap = Failed to determine if LDAP configured - assuming no LDAP.
-view_adminRoles_failLdapGroups = Failed to retrieve available LDAP groups - assuming no LDAP groups.
-view_adminRoles_failLdapGroupsRole = Failed to load LDAP groups available for role.
-view_adminRoles_failRoles = Failed to fetch roles.
-view_adminRoles_globalPerms = Global Permissions
-view_adminRoles_ldapGroups = LDAP Groups
-view_adminRoles_ldapGroupsReadOnly = LDAP group data is read only
-view_adminRoles_noItems = No items to show
-view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP, go to <a {0}>{1}</a>.
-view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
-view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
-view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
-view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
-view_adminRoles_permissions_globalPermissions = Global Permissions
-view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
-view_adminRoles_permissions_isAuthorized = Authorized?
-view_adminRoles_permissions_isRead = Read?
-view_adminRoles_permissions_isWrite = Write?
-view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
-view_adminRoles_permissions_permDesc_manageInventory = has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; and can import auto-discovered or manually discovered Resources
-view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
-view_adminRoles_permissions_permDesc_manageSecurity = can create, update, or delete users and roles (viewing is implied for everyone)
-view_adminRoles_permissions_permDesc_manageSettings = can modify the RHQ Server configuration and perform any Server-related functionality
-view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
-view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
-view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) view child Resource creation history
-view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view child Resource deletion history
-view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
-view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
-view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
-view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
-view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
-view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
-view_adminRoles_permissions_permWriteDesc_control = execute operations; delete operation execution history items
-view_adminRoles_permissions_permWriteDesc_createChildResources = create new child Resources (for child Resources of types that are creatable)
-view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
-view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
-view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
-view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
-view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
-view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
-view_adminRoles_permissions_perm_configure = Configure
-view_adminRoles_permissions_perm_control = Control
-view_adminRoles_permissions_perm_createChildResources = Create Child Resources
-view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
-view_adminRoles_permissions_perm_inventory = Inventory
-view_adminRoles_permissions_perm_manageAlerts = Manage Alerts
-view_adminRoles_permissions_perm_manageBundles = Manage Bundles
-view_adminRoles_permissions_perm_manageContent = Manage Content
-view_adminRoles_permissions_perm_manageEvents = Manage Events
-view_adminRoles_permissions_perm_manageInventory = Manage Inventory
-view_adminRoles_permissions_perm_manageMeasurements = Manage Measurements
-view_adminRoles_permissions_perm_manageRepositories = Manage Repositories
-view_adminRoles_permissions_perm_manageSecurity = Manage Security
-view_adminRoles_permissions_perm_manageSettings = Manage Settings
-view_adminRoles_permissions_read = Read:
-view_adminRoles_permissions_readAccessImplied = Read access for the {0} permission is implied and cannot be disabled.
-view_adminRoles_permissions_resourcePermissions = Resource Permissions
-view_adminRoles_permissions_write = Write:
-view_adminRoles_perms = Permissions
-view_adminRoles_resourcePerms = Resource Permissions
-view_adminRoles_roleAdded = Role [{0}] added.
-view_adminRoles_roleDeleteFailed = Failed to delete role [{0}].
-view_adminRoles_roleDeleted = Role [{0}] deleted.
-view_adminRoles_roleUpdateFailed = Failed to update role [{0}].
-view_adminRoles_roleUpdated = Role [{0}] updated.
-view_adminSecurity_roles = ロール
-view_adminSecurity_users = ユーザー
-view_adminTemplates_disabledAlertTemplates = 無効なアラートテンプレート
-view_adminTemplates_disabledMetricTemplates = 無効なメトリックテンプレート
-view_adminTemplates_editAlertTemplate = アラートテンプレートの編集
-view_adminTemplates_editMetricTemplate = メトリックテンプレートの編集
-view_adminTemplates_enabledAlertTemplates = 有効なアラートテンプレート
-view_adminTemplates_enabledMetricTemplates = 有効なメトリックテンプレート
-view_adminTemplates_platformServices = プラットフォームサービス
-view_adminTemplates_platforms = プラットフォーム
-view_adminTemplates_prompt_disabledAlertTemplates = Number of alert templates that are created but disabled on this resource type
-view_adminTemplates_prompt_disabledMetricTemplates = Number of metric schedules that are disabled by default on this resource type
-view_adminTemplates_prompt_enabledAlertTemplates = Number of alert templates that are enabled on this resource type
-view_adminTemplates_prompt_enabledMetricTemplates = Number of metric schedules that are enabled by default on this resource type
-view_adminTemplates_servers = サービス
-view_adminTopology_affinityGroups = アフィニティグループ
-view_adminTopology_agents = エージェント
-view_adminTopology_partitionEvents = イベントの分類
-view_adminTopology_remoteAgentInstall = リモートエージェントのインストール
-view_adminTopology_servers = サーバー
-view_adminUsersDetails_dataTypeName = ユーザー
-view_adminUsersList_dataTypeName = ユーザー
-view_adminUsersList_dataTypeNamePlural = ユーザー
-view_admin_administration = 管理
-view_admin_configuration = 構成
-view_admin_content = コンテント
-view_admin_downloads_agentDownload = エージェントのダウンロード
-view_admin_downloads_agent_buildNumber = エージェントビルド
-view_admin_downloads_agent_help = <p> This is the RHQ Agent Update Binary jar file. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>Agent Install</h3> <p> <b>java -jar <agent-download.jar> --install[=<new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>Agent Update</h3> <p> <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
-view_admin_downloads_agent_link_label = リンク
-view_admin_downloads_agent_link_value = エージェント {0} ({1}) のダウンロード
-view_admin_downloads_agent_loadError = Cannot get agent version info
-view_admin_downloads_agent_md5 = エージェント MD5
-view_admin_downloads_agent_version = エージェントバージョン
-view_admin_downloads_bundleDownload = バンドルデプロイヤのダウンロード
-view_admin_downloads_bundle_help = <p> This is the Bundle Deployer tool. It is for use by developers and packagers of RHQ bundles. This standalone tool allows you to test your bundles and their recipes from a console. </p>
-view_admin_downloads_bundle_link_label = Link
-view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
-view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
-view_admin_downloads_cliDownload = コマンドラインクライアントのダウンロード
-view_admin_downloads_cli_buildNumber = CLI Build
-view_admin_downloads_cli_help = <p> This is the Command Line Client tool, otherwise known as the CLI. It is a standalone tool that runs from within a console and provides a command line interface to the RHQ Server. You can invoke commands via the CLI as well as run scripts to perform automated tasks. See the documentation for more information on how to install and use the CLI. </p>
-view_admin_downloads_cli_link_label = Link
-view_admin_downloads_cli_link_value = Download CLI {0} ({1})
-view_admin_downloads_cli_loadError = Cannot get CLI version info
-view_admin_downloads_cli_md5 = CLI MD5
-view_admin_downloads_cli_version = CLI Version
-view_admin_downloads_connectorsDownload = コネクタのダウンロード
-view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
-view_admin_downloads_connectors_loadError = Cannot get connectors info
-view_admin_downloads_connectors_none = No connectors are available for download
-view_admin_landing = このセクションにおいて、RHQグローバル設定が管理されます。これはセキュリティ構成、プラグイン設定、RHQサーバーとエージェントの管理を含みます。
-view_admin_measTemplates_title = Template Metric Collection Schedules
-view_admin_measTemplates_updateExisting_title = Update Existing Schedules
-view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
-view_admin_security = セキュリティ
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
-view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
-view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
-view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
-view_admin_systemSettings_BaseURL_name = GUI Console URL
-view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
-view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
-view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
-view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
-view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
-view_admin_systemSettings_DataMaintenance_name = Database Maintenance Period
-view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
-view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
-view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
-view_admin_systemSettings_EnableAgentAutoUpdate_name = Enable Agent Auto-Updates
-view_admin_systemSettings_EnableDebugMode_desc = If enabled, the server will enter debug mode.
-view_admin_systemSettings_EnableDebugMode_name = Enable Debug Mode
-view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
-view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
-view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_EventPurge_name = Delete Events Older Than
-view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
-view_admin_systemSettings_JAASProvider_name = Enable LDAP
-view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou=People,dc=redhat,dc=com
-view_admin_systemSettings_LDAPBaseDN_name = Search Base
-view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn=Manager,dc=redhat,dc=com
-view_admin_systemSettings_LDAPBindDN_name = Username
-view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
-view_admin_systemSettings_LDAPBindPW_name = Password
-view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser=true
-view_admin_systemSettings_LDAPFilter_name = Search Filter
-view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
-view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
-view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
-view_admin_systemSettings_LDAPLoginProperty_name = Login Property
-view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
-view_admin_systemSettings_LDAPProtocol_name = SSL
-view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
-view_admin_systemSettings_LDAPUrl_name = LDAP URL
-view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
-view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
-view_admin_systemSettings_cannotLoadServerDetails = Cannot load server details
-view_admin_systemSettings_cannotLoadSettings = Cannot obtain the current system settings
-view_admin_systemSettings_fixBeforeSaving = Please fix the invalid values before saving
-view_admin_systemSettings_group_baseline = 自動ベースライン構成プロパティ
-view_admin_systemSettings_group_dataMgr = データマネージャー構成プロパティ
-view_admin_systemSettings_group_general = 全体構成プロパティ
-view_admin_systemSettings_group_ldap = LDAP 構成プロパティ
-view_admin_systemSettings_saveFailure = Failed to save the system settings
-view_admin_systemSettings_savedSettings = You successfully saved the system properties
-view_admin_systemSettings_serverDetails = Server Details
-view_admin_systemSettings_serverDetails_buildNumber = Build Number
-view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
-view_admin_systemSettings_serverDetails_dbDriverName = Database Driver Name
-view_admin_systemSettings_serverDetails_dbDriverVersion = Database Driver Version
-view_admin_systemSettings_serverDetails_dbName = Database Product Name
-view_admin_systemSettings_serverDetails_dbUrl = Database Connection URL
-view_admin_systemSettings_serverDetails_dbVersion = Database Product Version
-view_admin_systemSettings_serverDetails_installDir = Server Installation Directory
-view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
-view_admin_systemSettings_serverDetails_time = Server Local Time
-view_admin_systemSettings_serverDetails_tz = Server Time Zone
-view_admin_topology = トポロジー
-view_alert_common_tab_conditions = Conditions
-view_alert_common_tab_conditions_expression = Fire alert when
-view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
-view_alert_common_tab_conditions_modal_title = 条件追加
-view_alert_common_tab_conditions_recovery_disabled = This alert caused its alert definition to be disabled
-view_alert_common_tab_conditions_recovery_enabled = Triggered ''{0}'' to be re-enabled
-view_alert_common_tab_conditions_text = Condition
-view_alert_common_tab_conditions_type_availability = Availability Change
-view_alert_common_tab_conditions_type_availability_down = Went down
-view_alert_common_tab_conditions_type_availability_up = Came up
-view_alert_common_tab_conditions_type_event = Event Detection
-view_alert_common_tab_conditions_type_event_matching = with event source matching
-view_alert_common_tab_conditions_type_metric_baseline = Metric Value Baseline
-view_alert_common_tab_conditions_type_metric_baseline_verb = of
-view_alert_common_tab_conditions_type_metric_calltime_change = Call Time Value Changes
-view_alert_common_tab_conditions_type_metric_calltime_change_verb = by at least
-view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Grows
-view_alert_common_tab_conditions_type_metric_calltime_delta_other = Changes
-view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
-view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
-view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
-view_alert_common_tab_conditions_type_metric_change = Metric Value Change
-view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
-view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
-view_alert_common_tab_conditions_type_operation = Operation Execution
-view_alert_common_tab_conditions_type_operation_status = with result status
-view_alert_common_tab_conditions_type_resource_configuration = Resource Configuration Change
-view_alert_common_tab_conditions_value = Value
-view_alert_common_tab_dampening = Dampening
-view_alert_common_tab_dampening_category_consecutive_count = Consecutive
-view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
-view_alert_common_tab_dampening_category_duration_count = Time Period
-view_alert_common_tab_dampening_category_duration_count_tooltip = An alert is triggered once every X occurrences the condition set is true within a given time period.
-view_alert_common_tab_dampening_category_none = None
-view_alert_common_tab_dampening_category_none_tooltip = Dampening is disabled. Every time the condition set is true, an alert will be triggered.
-view_alert_common_tab_dampening_category_partial_count = Last N Evaluations
-view_alert_common_tab_dampening_category_partial_count_tooltip = An alert is triggered once every X occurrences the condition set is true during the last N evaluations of the condition set.
-view_alert_common_tab_dampening_consecutive_occurrences_label = Occurrences
-view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = The number of times the condition set must be consecutively true before the alert is triggered
-view_alert_common_tab_dampening_duration_occurrences_label = Occurrences
-view_alert_common_tab_dampening_duration_occurrences_label_tooltip = The number of times the condition set must be true during the given time period before the alert is triggered.
-view_alert_common_tab_dampening_duration_period_label = Time Period
-view_alert_common_tab_dampening_duration_period_label_tooltip = The time span in which the condition set will be tested to see if the given number of occurrences are true.
-view_alert_common_tab_dampening_partial_evalatuions_label = Evaluations
-view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = The total number of times the condition set will be tested to see if the given number of occurrences are true.
-view_alert_common_tab_dampening_partial_occurrences_label = Occurrences
-view_alert_common_tab_dampening_partial_occurrences_label_tooltip = The number of times the condition set must be true during the last N evaluations before the alert is triggered.
-view_alert_common_tab_general = General Properties
-view_alert_common_tab_invalid_condition_category = Invalid condition category - please report this as a bug: {0}
-view_alert_common_tab_invalid_dampening_category = Invalid dampening category - please report this as a bug: {0}
-view_alert_common_tab_invalid_time_units = Invalid time units - please report this as a bug: {0}
-view_alert_common_tab_notifications = Notifications
-view_alert_common_tab_notifications_message = Message
-view_alert_common_tab_notifications_sender = Sender
-view_alert_common_tab_notifications_status = Status
-view_alert_common_tab_recovery = Recovery
-view_alert_definition_condition_editor_avilability_option_down = Goes down
-view_alert_definition_condition_editor_avilability_option_up = Comes up
-view_alert_definition_condition_editor_avilability_tooltip = Specify the availability state change that will trigger the condition.
-view_alert_definition_condition_editor_avilability_value = Availability
-view_alert_definition_condition_editor_common_avg = Average
-view_alert_definition_condition_editor_common_max = Maximum
-view_alert_definition_condition_editor_common_min = Minimum
-view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
-view_alert_definition_condition_editor_event_regex = Regular Expression
-view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
-view_alert_definition_condition_editor_event_severity = Event Severity
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
-view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
-view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
-view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
-view_alert_definition_condition_editor_metric_baseline_tooltip = Specify the baseline value that must be violated to trigger the condition. The value you specify is a percentage of the given baseline value.
-view_alert_definition_condition_editor_metric_baseline_value = Baseline
-view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentage Change
-view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = A collected calltime value will trigger this condition when it differs by at least this percentage of the selected calltime limit value
-view_alert_definition_condition_editor_metric_calltime_change_tooltip = Specify the calltime value that, when changed at least a specified amount, triggers the condition. You must specify which calltime limit to check (minimum, maximum or average calltime value) and the percentage of change that must occur.
-view_alert_definition_condition_editor_metric_calltime_common_comparator = Comparator
-view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Changes
-view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Grows
-view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Shrinks
-view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = How a collected calltime value should be compared to the given calltime limit
-view_alert_definition_condition_editor_metric_calltime_common_limit = Call Time Limit
-view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = The calltime limit value that is to be compared with the given value
-view_alert_definition_condition_editor_metric_calltime_common_name = Call Time Metric
-view_alert_definition_condition_editor_metric_calltime_common_regex = Regular Expression
-view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = If specified, this is a regular expression that must match a call destination in order to trigger the condition.
-view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Specify the calltime threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier. You also must specify which calltime limit to compare the value with (minimum, maximum or average calltime value).
-view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Time Value
-view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
-view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
-view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
-view_alert_definition_condition_editor_metric_threshold_comparator_equal = Equal to
-view_alert_definition_condition_editor_metric_threshold_comparator_greater = Greater Than
-view_alert_definition_condition_editor_metric_threshold_comparator_less = Less than
-view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = How a collected metric value should be compared to the given threshold value
-view_alert_definition_condition_editor_metric_threshold_name = Metric
-view_alert_definition_condition_editor_metric_threshold_tooltip = Specify the threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier.
-view_alert_definition_condition_editor_metric_threshold_value = Metric Value
-view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
-view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_trait_change_value = Trait
-view_alert_definition_condition_editor_operation_status = オペレーションステータス
-view_alert_definition_condition_editor_operation_status_canceled = キャンセル済
-view_alert_definition_condition_editor_operation_status_failure = 失敗
-view_alert_definition_condition_editor_operation_status_inprogress = 処理中
-view_alert_definition_condition_editor_operation_status_success = 成功
-view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
-view_alert_definition_condition_editor_operation_value = オペレーション
-view_alert_definition_condition_editor_option_availability = Availability Change
-view_alert_definition_condition_editor_option_event = Event Detection
-view_alert_definition_condition_editor_option_label = Condition Type
-view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
-view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
-view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
-view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
-view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
-view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
-view_alert_definition_condition_editor_option_operation = Operation Execution
-view_alert_definition_condition_editor_option_resource_configuration = Resource Configuration Change
-view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
-view_alert_definition_for_group = View Group Definition
-view_alert_definition_for_type = View Template
-view_alert_definition_notification_cliScript_editor_anotherUser = Another User
-view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
-view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
-view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
-view_alert_definition_notification_cliScript_editor_repository = Repository
-view_alert_definition_notification_cliScript_editor_script = Script
-view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
-view_alert_definition_notification_cliScript_editor_selectRepoFirst = Select a repository first.
-view_alert_definition_notification_cliScript_editor_thisUser = Myself
-view_alert_definition_notification_cliScript_editor_uploadNewScript = Upload New Script
-view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
-view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
-view_alert_definition_notification_editor_delete_confirm = Are you sure you want to delete the selected alert notifications?
-view_alert_definition_notification_editor_field_configuration = Configuration
-view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
-view_alert_definition_notification_editor_field_configuration_not_loaded = Unknown
-view_alert_definition_notification_editor_field_sender = Sender
-view_alert_definition_notification_editor_loadFailed = Cannot get alert senders
-view_alert_definition_notification_editor_loadFailed_single = Cannot get alert sender configuration definition
-view_alert_definition_notification_editor_none_available = No alert senders available
-view_alert_definition_notification_editor_saveFailed = Cannot save the notification configuration
-view_alert_definition_notification_editor_sender = Notification Sender
-view_alert_definition_notification_editor_title_add = 通知の追加
-view_alert_definition_notification_editor_title_edit = 通知の編集
-view_alert_definition_notification_operation_editor_common_operation = Operation
-view_alert_definition_notification_operation_editor_mode_relative = Relative Resource
-view_alert_definition_notification_operation_editor_mode_specific = Specific Resource
-view_alert_definition_notification_operation_editor_mode_this = This Resource
-view_alert_definition_notification_operation_editor_mode_title = リソース選択モード
-view_alert_definition_notification_operation_editor_mode_unknown = UNKNOWN OPTION - THIS IS A BUG
-view_alert_definition_notification_operation_editor_operations_loadFailed = Failed to load the list of available operations
-view_alert_definition_notification_operation_editor_operations_no_parameters = This operation does not take any parameters
-view_alert_definition_notification_operation_editor_relative_ancestor = Start Search From
-view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = Cannot get type ancestry
-view_alert_definition_notification_operation_editor_relative_ancestor_root = Root Ancestor Type
-view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Select the top of the type hierarchy from which to search its descendant tree for the Filter By type
-view_alert_definition_notification_operation_editor_relative_descendant = Then Filter By
-view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = A specific name to uniquely identify a resource when more than one resource of the selected type might exist. This is optional if there will only ever be one resource of the resource type in the selected type hierarchy.
-view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = Cannot get type descendants
-view_alert_definition_notification_operation_editor_relative_descendant_tooltip = The resource type to search for under the root type defined in the Start Search From selection.
-view_alert_definition_notification_operation_editor_specific_pick_button = Pick
-view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Please pick a resource
-view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Please pick a resource that has one or more operations
-view_alert_definition_notification_operation_editor_specific_pick_text = Pick a resource...
-view_alert_definition_notification_operation_editor_specific_resource = Resource
-view_alert_definition_notification_role_editor_loadFailed = Cannot determine current roles - starting empty
-view_alert_definition_notification_role_editor_restoreFailed = Cannot use current roles - starting empty
-view_alert_definition_notification_role_editor_saveFailed = Cannot save the selected roles
-view_alert_definition_notification_user_editor_loadFailed = Cannot determine current users - starting empty
-view_alert_definition_notification_user_editor_restoreFailed = Cannot use current users - starting empty
-view_alert_definition_notification_user_editor_saveFailed = Cannot save the selected users
-view_alert_definition_recovery_editor_disable_when_fired = Disable When Fired
-view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indicates if this alert will be disabled after it fires. Once disabled, the alert can be manually re-enabled or a recovery alert can be set up to automatically re-enable it. If this alert is a recovery alert itself, this setting cannot be turned on.
-view_alert_definition_recovery_editor_loadFailed = Cannot build recovery menu
-view_alert_definition_recovery_editor_none_available = None
-view_alert_definition_recovery_editor_recovery_alert = Recover Alert
-view_alert_definition_recovery_editor_recovery_alert_tooltip = The target alert that will be recovered (i.e. re-enabled) after this alert triggers. Do not select an alert here if you are not defining a recovery alert.
-view_alert_definitions_create_failure = Alert definition creation failed
-view_alert_definitions_create_success = Alert definition successfully created
-view_alert_definitions_delete_confirm = Delete the selected alert definition(s)?
-view_alert_definitions_delete_failure = Failed to deleted the selected alert definitions
-view_alert_definitions_delete_success = Successfully deleted {0} alert definitions
-view_alert_definitions_disable_confirm = Disable the selected alert definition(s)?
-view_alert_definitions_disable_failure = Failed to disable the selected alert definitions
-view_alert_definitions_disable_success = Successfully disabled {0} alert definitions
-view_alert_definitions_enable_confirm = Enable the selected alert definition(s)?
-view_alert_definitions_enable_failure = Failed to enable the selected alert definitions
-view_alert_definitions_enable_success = Successfully enabled {0} alert definitions
-view_alert_definitions_loadFailed = Failed to fetch alert definition data
-view_alert_definitions_loadFailed_single = Failed to fetch data for alert definition with id {0}
-view_alert_definitions_table_title_group = グループアラート定義
-view_alert_definitions_table_title_resource = リソースアラート定義
-view_alert_definitions_update_failure = Alert definition update failed
-view_alert_definitions_update_success = Alert definition successfully updated
-view_alert_details_field_ack_at = Acknowledged at
-view_alert_details_field_ack_by = Acknowledged by
-view_alert_details_field_recovery_info = Recovery Info
-view_alert_details_loadFailed = Failed to fetch alert details
-view_alerts_ack_confirm = Acknowledge the selected alert(s)?
-view_alerts_ack_confirm_all = Acknowledge all alerts from this source?
-view_alerts_ack_failure = Failed to acknowledge alerts with id''s: {0}
-view_alerts_ack_failure_all = Failed to acknowledge all alerts from this source
-view_alerts_ack_success = Successfully acknowledged {0} alerts
-view_alerts_delete_confirm = Delete the selected alert(s)?
-view_alerts_delete_confirm_all = Delete all alerts from this source?
-view_alerts_delete_failure = Failed to delete alerts with id''s: {0}
-view_alerts_delete_failure_all = Failed to delete all alerts from this source
-view_alerts_delete_success = Successfully deleted {0} alerts
-view_alerts_field_ack_status = ステータス
-view_alerts_field_ack_status_ack = 確認 ({0})
-view_alerts_field_ack_status_ackHover = Acknowledged by {0} at {1}
-view_alerts_field_ack_status_noAck = 未確認
-view_alerts_field_ack_status_noAckHover = Not yet Acknowledged
-view_alerts_field_ack_subject = 確認サブジェクト
-view_alerts_field_ack_time = 確認時刻
-view_alerts_field_condition_text = 条件テキスト
-view_alerts_field_condition_text_many = Multiple Conditions
-view_alerts_field_condition_text_none = No Conditions
-view_alerts_field_condition_value = Condition Value
-view_alerts_field_created_time = 生成時刻
-view_alerts_field_enabled = 有効
-view_alerts_field_modified_time = 修正時刻
-view_alerts_field_name = 名前
-view_alerts_field_parent = 親
-view_alerts_field_priority = 優先度
-view_alerts_field_protected = Protected
-view_alerts_field_protected_tooltip = If true, this definition is protected from being changed by the parent definition. In other words, the parent definition settings will not override this definition.
-view_alerts_loadFailed = Failed to fetch alerts data
-view_alerts_table_filter_priority = 優先度フィルター
-view_alerts_table_title_group = グループアラート履歴
-view_alerts_table_title_resource = リソースアラート履歴
-view_autoDiscoveryQ_committed = コミット済み
-view_autoDiscoveryQ_confirmSelect = Also select the platform children?
-view_autoDiscoveryQ_deleted = 削除済み
-view_autoDiscoveryQ_field_discoveryTime = Discovery Time
-view_autoDiscoveryQ_field_inventoryStatus = Inventory Status
-view_autoDiscoveryQ_field_key = Resource Key
-view_autoDiscoveryQ_field_name = Resource Name
-view_autoDiscoveryQ_field_parentId = Parent ID
-view_autoDiscoveryQ_ignore = 無視
-view_autoDiscoveryQ_ignoreFailure = Failed to ignore resources
-view_autoDiscoveryQ_ignoreSuccessful = You have successfully ignored the selected resources.
-view_autoDiscoveryQ_ignored = 無視済み
-view_autoDiscoveryQ_import = インポート
-view_autoDiscoveryQ_importFailure = Failed to import resources
-view_autoDiscoveryQ_importSuccessful = You have successfully imported the selected resources.
-view_autoDiscoveryQ_loadFailure = Failed to load the inventory discovery queue
-view_autoDiscoveryQ_new = 新規
-view_autoDiscoveryQ_newAndIgnored = 新規かつ無視済み
-view_autoDiscoveryQ_noItems = No items to show
-view_autoDiscoveryQ_noperm = (You are not authorized to view the auto-discovery queue)
-view_autoDiscoveryQ_showStatus = Show
-view_autoDiscoveryQ_title = 自動リカバリキュー
-view_autoDiscoveryQ_unignore = 無視をしない
-view_autoDiscoveryQ_unignoreFailure = Failed to unignore resources
-view_autoDiscoveryQ_unignoreSuccessful = You have successfully unignored the selected resources.
-view_autoDiscoveryQ_uninventoried = インベントリ登録をしない
-view_bundleVersion_loadFailure = Failed to load bundle version data
-view_bundle_bundle = バンドル
-view_bundle_bundleDeployment = Bundle Deployment
-view_bundle_bundleDeployments = Bundle Deployments
-view_bundle_bundleDestinations = Bundle Destinations
-view_bundle_bundleFiles = Bundle Files
-view_bundle_bundleType = Bundle Type
-view_bundle_bundleVersion = Bundle Version
-view_bundle_bundleVersions = Bundle Versions
-view_bundle_bundles = バンドル
-view_bundle_createWizard_bundleDistro = Bundle Distribution
-view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database
-view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
-view_bundle_createWizard_clickToUploadRecipe = Click to load a recipe file
-view_bundle_createWizard_createFailure = Failed to create the bundle
-view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]
-view_bundle_createWizard_enterRecipe = Please supply a valid recipe
-view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
-view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file
-view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file
-view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server
-view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle
-view_bundle_createWizard_noBundleTypesAvail = No bundle types are available
-view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments
-view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
-view_bundle_createWizard_recipeOption = Recipe
-view_bundle_createWizard_title = バンドル生成
-view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files
-view_bundle_createWizard_uploadOption = Upload
-view_bundle_createWizard_uploadStepName = Upload Bundle Files
-view_bundle_createWizard_urlOption = URL
-view_bundle_createWizard_windowTitle = Bundle Creation Wizard
-view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
-view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted.
-view_bundle_deploy = Deploy
-view_bundle_deployDir = Deploy Directory
-view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms
-view_bundle_deployWizard_deploying = Deploying...
-view_bundle_deployWizard_deploymentCreated = Created Deployment...
-view_bundle_deployWizard_deploymentCreatedDetail = You have created the deployment [{0}] with the description [{1}]
-view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
-view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!
-view_bundle_deployWizard_deploymentScheduledDetail = You have scheduled the bundle deployment [{0}] to the destination group [{1}]
-view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
-view_bundle_deployWizard_destinationCreatedDetail = You have created the destination [{0}] with the description [{1}]
-view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
-view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel
-view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)
-view_bundle_deployWizard_error_11 = Failed to find defined deployments.
-view_bundle_deployWizard_error_12 = Failed to find defined bundles.
-view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel
-view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!
-view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}
-view_bundle_deployWizard_error_5 = Failed to Create Deployment!
-view_bundle_deployWizard_error_6 = Failed to create deployment: {0}
-view_bundle_deployWizard_error_7 = Failed to get deployment name.
-view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
-view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
-view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
-view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
-view_bundle_deployWizard_getDestStep = New Destination
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
-view_bundle_deployWizard_getDest_desc = Destination Description
-view_bundle_deployWizard_getDest_name = Destination Name
-view_bundle_deployWizard_getInfoStep = Provide Deployment Information
-view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
-view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description
-view_bundle_deployWizard_getInfo_deploymentName = Deployment Name
-view_bundle_deployWizard_getOptionsStep = Deploy Options
-view_bundle_deployWizard_getOptions_deployLater = Deploy Later
-view_bundle_deployWizard_getOptions_deployNow = Deploy Now
-view_bundle_deployWizard_getOptions_deployTime = Deployment Time
-view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle
-view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.
-view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version
-view_bundle_deployWizard_selectVersion_latest = Latest Version [{0}]
-view_bundle_deployWizard_selectVersion_live = Live Version [{0}]
-view_bundle_deployWizard_selectVersion_select = Select Version from List:
-view_bundle_deployWizard_title = バンドルデプロイウィザード
-view_bundle_deploy_action = Action
-view_bundle_deploy_backButton = Back to Destination
-view_bundle_deploy_clickForError = Click the icon for the error message
-view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
-view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
-view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
-view_bundle_deploy_deployedBy = Deployed By
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms
-view_bundle_deploy_installDetails = Install Details
-view_bundle_deploy_loadBundleFailure = Failed to find bundle
-view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
-view_bundle_deploy_loadFailure = Failed to load bundle deployment
-view_bundle_deploy_name = Deployment Name
-view_bundle_deploy_operatingSystem = Operating System
-view_bundle_deploy_selectARow = Select a row to show installation details
-view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
-view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
-view_bundle_deploy_time = Deployment Time
-view_bundle_deployed = Deployed
-view_bundle_deployments = Deployments
-view_bundle_dest_backToBundle = Back to Bundle
-view_bundle_dest_created = Created
-view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
-view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
-view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
-view_bundle_dest_deployDir = Deploy Directory
-view_bundle_dest_group = Group
-view_bundle_dest_lastDeployedVersion = Last Deployed Version
-view_bundle_dest_lastDeploymentDate = Last Deployment Date
-view_bundle_dest_lastDeploymentStatus = Last Deployment Status
-view_bundle_dest_loadFailure = Failed to load bundle destinations
-view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information
-view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
-view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
-view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
-view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
-view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
-view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
-view_bundle_destinations = Destinations
-view_bundle_fileListView_fileSize = File Size
-view_bundle_fileListView_loadFailure = Failed to load bundle file data
-view_bundle_fileListView_md5 = MD5
-view_bundle_fileListView_sha256 = SHA256
-view_bundle_files = Files
-view_bundle_latestVersion = 最新バージョン
-view_bundle_list_backToAll = Back to All Bundles
-view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
-view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
-view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
-view_bundle_list_deletesFailure = Failed to delete the bundles
-view_bundle_list_deletesSuccessful = You successfully deleted the bundles
-view_bundle_list_destinationsCount = Destinations Count
-view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
-view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
-view_bundle_list_error3 = Failed to load bundle
-view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]
-view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data
-view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]
-view_bundle_list_tagUpdateFailure = Failed to update bundle tags
-view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
-view_bundle_list_versionsCount = Versions Count
-view_bundle_purge = Purge
-view_bundle_recipe = Recipe
-view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
-view_bundle_revert = Revert
-view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...
-view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
-view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
-view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation
-view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
-view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
-view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
-view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
-view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment
-view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
-view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
-view_bundle_revertWizard_getInfoStep_name = Provide Revert Information
-view_bundle_revertWizard_getInfoStep_revertDeployDesc = Revert Deploy Description
-view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\n{0}\n\n[REVERT To]\n{1}
-view_bundle_revertWizard_getInfoStep_revertDeployName = Revert Deploy Name
-view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms
-view_bundle_revertWizard_revertStep_reverting = Reverting...
-view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!
-view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]
-view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!
-view_bundle_revertWizard_title = バンドル取り消し
-view_bundle_revertWizard_windowTitle = バンドル取り消しウィザード
-view_bundle_tree_loadFailure = Failed to load bundle data
-view_bundle_version_backToBundle = Back to Bundle
-view_bundle_version_bundleVersionTagUpdateFailure = Failed to update bundle version tags
-view_bundle_version_bundleVersionTagUpdateSuccessful = You have successfully updated the bundle version tags
-view_bundle_version_deleteConfirm = Are you sure you want to delete this bundle version?
-view_bundle_version_deleteFailure = Failed to delete the bundle version [{0}]
-view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
-view_bundle_version_loadFailure = Failed to load bundle version
-view_bundle_versions = バージョン
-view_configCompare_comparingConfigs = Comparing Configurations
-view_configCompare_configCompare = Configuration Comparison
-view_configEdit_addItem = Add Item to List
-view_configEdit_confirm_1 = Are you sure you want to delete the selected properties from the set?
-view_configEdit_confirm_2 = Are you sure you want to delete this row?
-view_configEdit_confirm_3 = Are you sure you want to delete the [{0}] selected [{1}]?
-view_configEdit_editRow = Edit Row
-view_configEdit_enterPropName = Enter the name of the property to be added.
-view_configEdit_error_1 = Configuration is not supported by this Resource.
-view_configEdit_error_2 = Connection settings are not supported by this Resource.
-view_configEdit_error_3 = Cannot add property named [{0}]. The property name is already used in the set.
-view_configEdit_files = Files
-view_configEdit_hideAll = Hide All
-view_configEdit_jumpToSection = セクションへのジャンプ
-view_configEdit_msg_1 = Added property [{0}] to the set.
-view_configEdit_msg_2 = Removed properties from the set.
-view_configEdit_msg_3 = [{0} {1}] deleted from list.
-view_configEdit_msg_4 = Item added to list.
-view_configEdit_properties = Properties
-view_configEdit_tooltip_1 = Delete the selected items from the list.
-view_configEdit_tooltip_2 = Add an item to the list.
-view_configEdit_viewRow = View Row
-view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.
-view_configurationDetails_configNotUpdatedDueToNoChange = Configuration was not updated, since the new configuration is equivalent to the current configuration.
-view_configurationDetails_error_updateFailure = Failed to update configuration.
-view_configurationDetails_messageConcise = Configuration updated - current version is {0}.
-view_configurationDetails_messageDetailed = Configuration updated to version {0} for Resource [{1}].
-view_configurationDetails_noPermission = You do not have permission to edit this Resource''s configuration.
-view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.
-view_configurationHistoryDetails_error_loadFailure = Unable to load configuration history.
-view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
-view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. You must purge that parent group history item before you can delete its individual resource history items.
-view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
-view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
-view_configurationHistoryList_rollback = Rollback
-view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
-view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
-view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
-view_configurationHistoryList_table_statusFailure = This configuration update failed
-view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
-view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
-view_configurationHistoryList_table_statusSuccess = This configuration update was successful
-view_configurationHistoryList_title = 構成履歴
-view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.
-view_connectionSettingsDetails_error_updateFailure = Failed to update connection settings.
-##view_connectionSettingsDetails_messageConcise_updateSuccess = Connection settings update initiated.
-##view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settings update initiated for Resource [{0}].\n
-view_connectionSettingsDetails_noPermission = You do not have permission to edit this Resource''s connection settings.
-view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.
-view_core_error_1 = New Alerts lookup failed
-view_core_loggedOut = Logged out
-view_core_noRecentAlerts = There are no recent alerts to report
-view_core_recentAlerts = There are [{0}] recent alerts - click to go to the recent alerts report
-view_core_uncaught = グローバルにキャッチされない例外
-view_dashboardManager_deleteFail = Failed to delete dashboard.
-view_dashboardManager_deleted = Successfully deleted dashboard {0}
-view_dashboardManager_error = Failed to save dashboard to server
-view_dashboardManager_saved = Saved dashboard {0} to server
-view_dashboardManager_success = Saved dashboard
-view_dashboard_favorites_error1 = Failed to load favorite Resources.
-view_dashboardsManager_error1 = Failed to add new dashboard
-view_dashboardsManager_message_title_details = <h1>RHQへようこそ2</h1>\n<p>RHQプロジェクトは抽象化されたプラグインベースのシステム管理スイートで、複数のプロダクトやプラットフォームに対してコア機能を横断的に適用できる拡張可能で、統合化されたシステム管理を提供します。このプロジェクトはレイヤ化されたモジュールによって設計されていて、デプロイのための柔軟なアーキテクチャを提供します。それは企業全体に対する監査と履歴の管理を提供するコアとなるユーザーインタフェースを導入します。サーバー/エージェントアーキテクチャはリモートでの管理と特定プロダクトのサポートを実現するプラグインを提供します。 </p>\n <p>このデフォルトのダッシュボードは上の「編集モード」ボタンをすることで編集可能です。</p>
-view_dashboards_confirm1 = Are you sure you want to delete
-view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh
-view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh
-view_dashboards_portlets_refresh_multiple_min = {0} minutes
-view_dashboards_portlets_refresh_none = No Refresh
-view_dashboards_portlets_refresh_one_min = 1 minute
-view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
-view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
-view_dashboards_title = ダッシュボード
-view_dynagroup_children = DynaGroup Children
-view_dynagroup_compatible = Compatible
-view_dynagroup_definitionAlreadyExists = A group definition already exists with this name
-view_dynagroup_definitionCreated = You have successfully created a group definition named [{0}]
-view_dynagroup_definitionLoadFailure = Failed to load group definitions
-view_dynagroup_definitions = DynaGroup Definitions
-view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions
-view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions
-view_dynagroup_editing = Editing [{0}]
-view_dynagroup_exprBuilder_addExpression = Add Expression
-view_dynagroup_exprBuilder_comparisonType = Comparison Type
-view_dynagroup_exprBuilder_comparisonType_contains = contains
-view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
-view_dynagroup_exprBuilder_comparisonType_equals = equals
-view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
-view_dynagroup_exprBuilder_comparisonType_tooltip = Comparison Type
-view_dynagroup_exprBuilder_definingPlugin = Defining Plugin
-view_dynagroup_exprBuilder_definingPlugin_tooltip = The plugin to search
-view_dynagroup_exprBuilder_expression = Expression
-view_dynagroup_exprBuilder_expressionType = Expression Type
-view_dynagroup_exprBuilder_expressionType_pluginConfig = Plugin Configuration
-view_dynagroup_exprBuilder_expressionType_resource = Resource
-view_dynagroup_exprBuilder_expressionType_resourceCategory = Resource Category
-view_dynagroup_exprBuilder_expressionType_resourceConfig = Resource Configuration
-view_dynagroup_exprBuilder_expressionType_resourceType = Resource Type
-view_dynagroup_exprBuilder_expressionType_tooltip = The type of property this expression switches on:<br/> <b>Resource</b>: A resource property such as its name or version<br/> <b>Resource Type</b>: Search for resources of a specific type<br/> <b>Resource Category</b>: Search for resources by category: platform, server, service<br/> <b>Trait</b>: Resources that have selected values for a monitored trait<br/> <b>Plugin Configuration</b>: Search by the plugin component configuration setting of the component<br/> <b>Resource Configuration</b>: Search by the configuration setting of the managed resource
-view_dynagroup_exprBuilder_expressionType_trait = Trait
-view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
-view_dynagroup_exprBuilder_groupBy = Group by
-view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
-view_dynagroup_exprBuilder_noPlugins = --No plugins--
-view_dynagroup_exprBuilder_noProperties = --No properties--
-view_dynagroup_exprBuilder_noResourceTypes = --No resource types--
-view_dynagroup_exprBuilder_pluginLoadFailure = Cannot get the list of plugins
-view_dynagroup_exprBuilder_propLoadFailure = Cannot get list of properties
-view_dynagroup_exprBuilder_propertyName = Property Name
-view_dynagroup_exprBuilder_propertyName_tooltip = The name of the property to query. This is defined by the expression type as well as the resource type.
-view_dynagroup_exprBuilder_resTypeLoadFailure = Cannot get list of resource types for plugin [{0}]
-view_dynagroup_exprBuilder_resource = Resource
-view_dynagroup_exprBuilder_resourceType = Resource Type
-view_dynagroup_exprBuilder_resourceType_tooltip = The type of resource
-view_dynagroup_exprBuilder_resource_child = Child
-view_dynagroup_exprBuilder_resource_grandparent = Grandparent
-view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
-view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
-view_dynagroup_exprBuilder_resource_parent = Parent
-view_dynagroup_exprBuilder_resource_resource = Resource
-view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
-view_dynagroup_exprBuilder_title = Expression Builder
-view_dynagroup_exprBuilder_unset = Unset
-view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
-view_dynagroup_exprBuilder_value_tooltip = The string value for the expression to query
-view_dynagroup_expression = Expression
-view_dynagroup_expressionBuilderIconTooltip = Expression Builder...
-view_dynagroup_expressionSet = Expression Set
-view_dynagroup_lastCalculationTime = Last Calculation Time
-view_dynagroup_loadDefinitionFailure = Failed to load group definition [{0}]
-view_dynagroup_loadDefinitionMissing = There is no group definition with the ID of [{0}]
-view_dynagroup_mixed = Mixed
-view_dynagroup_newGroupDefinition = New Group Definition
-view_dynagroup_nextCalculationTime = Next Calculation Time
-view_dynagroup_permDenied = You do not have permission to view group definitions
-view_dynagroup_recalcFailure = Failed to recalculated this group definition
-view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions
-view_dynagroup_recalcSuccessful = You have successfully recalculated this group definition
-view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions
-view_dynagroup_recalculate = Recalculate
-view_dynagroup_recalculationInterval = Recalculation Interval (ms)
-view_dynagroup_recursive = Recursive
-view_dynagroup_saveAndRecalculate = Save & Recalculate
-view_dynagroup_saveFailure = Failed to save the group definition named [{0}]
-view_dynagroup_saveSuccessful = You have successfully saved the group definition named [{0}]
-view_dynagroup_singleSaveFailure = An error occurred - there should have been one created, but instead there were [{0}] created
-view_dynagroup_template_customExpression = Custom Expression...
-view_dynagroup_template_downedResources = All resources currently down
-view_dynagroup_template_jbossas4_clusters = JBossAS 4 - Clusters
-view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
-view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
-view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
-view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
-view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - Clusters
-view_dynagroup_template_platforms = Platform resources in inventory
-view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
-view_groupConfigEdit_member = Member
-view_groupConfigEdit_noListProps = List properties are not currently supported for group configurations.
-view_groupConfigEdit_setAll = Set all values to:
-view_groupConfigEdit_tooltip_1 = Member values differ - click icon to edit them.
-view_groupConfigEdit_unset = Unset
-view_groupConfigEdit_valsDiff = member values differ
-view_groupConfigEdit_valsDiffForProp = Member Values for Property [{0}]
-view_groupCreateWizard_createFailure = Failed to create the resource group
-view_groupCreateWizard_createStepName = Group Settings
-view_groupCreateWizard_createStep_recursive = Recursive
-view_groupCreateWizard_createSuccessful_concise = You have created a new resource group. [<a href="{0}">View Group</a>]
-view_groupCreateWizard_createSuccessful_full = You have created a new [{0}] resource group with the name [{1}] that contains [{2}] member resources
-view_groupCreateWizard_membersStepName = Select Members
-view_groupCreateWizard_title = グループ生成
-view_groupCreateWizard_windowTitle = グループ生成
-view_groupInventoryMembers_button_updateMembership = Update Membership...
-view_groupInventoryMembers_title_updateMembership = Update Membership
-view_group_detail_failLoad = Failed to load group for group with ID [{0}]
-view_group_detail_failLoadComp = Failed to load group composite for group with ID [{0}]
-view_group_detail_failRecursiveChange = Failed to update the recursive setting for group [{0}]
-view_group_detail_recursiveChange = You successfully changed the recursive setting for group [{0}]
-view_group_inventory_activity_no_recent_metrics = This group has no recent metrics
-view_group_meas_schedules_title = Group Metric Collection Schedules
-view_group_membership_failFetch = Failed to fetch Resource Group
-view_group_membership_saveFailure = Failed to update membership of group [{0}]
-view_group_membership_saveSuccessful = You have updated the membership of group [{0}]
-view_group_operationScheduleDetails_failedToLoadMembers = Failed to load group member Resources.
-view_group_operationScheduleDetails_field_execute = Execute
-view_group_operationScheduleDetails_field_haltOnFailure = Halt on Failure?
-view_group_operationScheduleDetails_memberResource = Member Resource
-view_group_operationScheduleDetails_value_parallel = in parallel
-view_group_operationScheduleDetails_value_sequential = in the order specified below (drag and drop member Resources to change order)
-view_group_pluginConfig_edit_currentGroupProperties = Current Group Properties
-view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]
-view_group_pluginConfig_edit_noperm = You do not have permission to edit this group connection settings
-view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]
-view_group_pluginConfig_edit_saveInitiated_concise = The group connection setting updates have been initiated
-view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]
-view_group_pluginConfig_edit_saveTooltip = Update the connection settings of all group members
-view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved
-view_group_pluginConfig_members_fetchFailure = Failed to get plugin config update history for members of group [{0}]
-view_group_pluginConfig_members_fetchFailureConn = Failed to retrieve member connection settings for [{0}]
-view_group_pluginConfig_members_fetchFailureConnInProgress = A group plugin configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
-view_group_pluginConfig_members_statusDetails = Status Details
-view_group_pluginConfig_members_statusFailure = This configuration update failed for an unknown reason
-view_group_pluginConfig_members_statusInprogress = This configuration update is still in progress
-view_group_pluginConfig_members_statusNochange = No changes were made to this configuration
-view_group_pluginConfig_members_statusSuccess = This configuration update was successful
-view_group_pluginConfig_members_title = Group Connection Settings Member Histories
-view_group_pluginConfig_table_clickStatusIcon = Click the status icon for full details
-view_group_pluginConfig_table_deleteFailure = Failed to delete group plugin config history
-view_group_pluginConfig_table_deleteSuccessful = You have deleted [{0}] history items
-view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
-view_group_pluginConfig_table_msg1 = View Member History for status of each individual resource
-view_group_pluginConfig_table_statusDetails = Status Details
-view_group_pluginConfig_table_statusFailure = This group configuration update failed
-view_group_pluginConfig_table_statusInprogress = This group configuration update is still in progress
-view_group_pluginConfig_table_statusNochange = No changes were made to this group configuration
-view_group_pluginConfig_table_statusSuccess = This group configuration update was successful
-view_group_pluginConfig_table_title = Group Connection Settings History
-view_group_pluginConfig_table_viewMemberHistory = View Member History
-view_group_pluginConfig_table_viewSettings = View Settings
-view_group_pluginConfig_view_groupProperties = Group Properties
-view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings
-view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]
-view_group_resConfig_edit_loadFail = Failed to retrieve member Resource configurations for [{0}]
-view_group_resConfig_edit_noperm = You do not have permission to edit this group configuration
-view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for [{0}] compatible group named [{1}]
-view_group_resConfig_edit_saveInitiated_concise = The group configuration updates have been initiated
-view_group_resConfig_edit_saveInitiated_full = The group configuration updates have been initiated for the [{0}] compatible group named [{1}]
-view_group_resConfig_edit_saveTooltip = Update the configurations of all group members
-view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved
-view_group_resConfig_members_fetchFailure = Failed to get resource config update history for members of group [{0}]
-view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource configuration settings for [{0}]
-view_group_resConfig_members_fetchFailureConfigInProgress = A group resource configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
-view_group_resConfig_members_statusDetails = Status Details
-view_group_resConfig_members_statusFailure = This configuration update failed for an unknown reason
-view_group_resConfig_members_statusInprogress = This configuration update is still in progress
-view_group_resConfig_members_statusNochange = No changes were made to this configuration
-view_group_resConfig_members_statusSuccess = This configuration update was successful
-view_group_resConfig_members_title = Group Resource Configuration Member Histories
-view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
-view_group_resConfig_table_deleteFailure = Failed to delete group resource config history
-view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
-view_group_resConfig_table_failFetch = Failed to get group resource config history
-view_group_resConfig_table_msg1 = View Member History for status of each individual resource
-view_group_resConfig_table_statusDetails = Status Details
-view_group_resConfig_table_statusFailure = This group configuration update failed
-view_group_resConfig_table_statusInprogress = This group configuration update is still in progress
-view_group_resConfig_table_statusNochange = No changes were made to this group configuration
-view_group_resConfig_table_statusSuccess = This group configuration update was successful
-view_group_resConfig_table_title = Group Resource Configuration History
-view_group_resConfig_table_viewMemberHistory = View Member History
-view_group_resConfig_table_viewSettings = View Settings
-view_group_resConfig_view_groupProperties = Group Properties
-view_group_resConfig_view_noperm = You do not have permissions to see the resource configuration settings
-view_group_summary_compatible = Compatible
-view_group_summary_descUpdateFailure = Failed to change the description of the resource group with ID [{0}]
-view_group_summary_descUpdateSuccessful = You have changed the description of this resource group
-view_group_summary_dynamic = Dynamic
-view_group_summary_dynamicNote = Dynamic group names and descriptions are managed, and therefore are not editable
-view_group_summary_groupDefinition = Group Definition
-view_group_summary_memberCount = Member Count
-view_group_summary_memberType = Member Type
-view_group_summary_mixed = Mixed
-view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]
-view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]
-view_group_summary_recursive = Recursive
-view_helpTop_description = このセクションはドキュメンテーション、チュートリアル、バージョン、その他のヘルプ情報を提供します。
-view_help_section_product = プロダクト
-view_help_section_product_about = RHQについて
-view_inventory_adq = ディスカバリキュー
-view_inventory_allGroups = すべてのグループ
-view_inventory_allResources = すべてのリソース
-view_inventory_collectionInterval = コレクション間隔
-view_inventory_dynagroupDefs = 動的グループ定義
-view_inventory_eventDetails_loadFailed = An error occurred loading the event details
-view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]
-view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]
-view_inventory_eventHistory_details = Details
-view_inventory_eventHistory_detailsFilter = Details Filter
-view_inventory_eventHistory_groupEventHistory = Group Event History
-view_inventory_eventHistory_purgeFailed = Failed to purge events for [{0}]
-view_inventory_eventHistory_purgeSuccessful = You have successfully purged [{0}] events for [{1}]
-view_inventory_eventHistory_resourceEventHistory = Resource Event History
-view_inventory_eventHistory_severity = Severity
-view_inventory_eventHistory_severityFilter = Severity Filter
-view_inventory_eventHistory_sourceFilter = Source Filter
-view_inventory_eventHistory_sourceLocation = Source Location
-view_inventory_eventHistory_timestamp = Timestamp
-view_inventory_groups = グループ
-view_inventory_groups_children = Children
-view_inventory_groups_deleteFailed = Failed to delete the selected resource groups
-view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
-view_inventory_groups_descendants = Descendants
-view_inventory_groups_loadFailed = Failed to load group composite data
-view_inventory_groups_resourceGroups = Resource Groups
-view_inventory_mixed = mixed
-view_inventory_platforms = プラットフォーム
-view_inventory_problemGroups = 問題グループ
-view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible
-view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?
-view_inventory_resources_deleteFailed = Failed to delete the selected resources
-view_inventory_resources_deleteSuccessful = You have successfully deleted the selected resources
-view_inventory_resources_loadFailed = Failed to load resource composite data
-view_inventory_resources_title = リソース
-view_inventory_resources_title_children = 子リソース
-view_inventory_resources_title_members = メンバーリソース
-view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
-view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
-view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
-view_inventory_sectionHelp = このセクションにおいて、新規に発見されたリソース、インベントリに登録されたリソース、グループの表示と管理がおこなわれます。
-view_inventory_servers = サーバー
-view_inventory_services = サービス
-view_inventory_summary_agent_error1 = Failed to locate agent managing resource id
-view_inventory_summary_agent_error2 = Failed to ping agent managing resource id
-view_inventory_summary_agent_error3 = You do not have permission to view details for this Agent.
-view_inventory_summary_agent_fullEnpoint = Full Endpoint
-view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!
-view_inventory_summary_agent_last_title = Last Received Availability Report
-view_inventory_summary_agent_status_title = Agent Communications Status
-view_inventory_summary_agent_title = Agent Managing this Resource
-view_inventory_unavailableServers = 利用不能サーバー
-view_leftNav_unknownPage = Unknown page name [{0}] for section [{1}] - URL is invalid.
-view_login_invalidEmail = Invalid e-mail address
-view_login_login = ログイン
-view_login_logout = ログアウト
-view_login_noBackend = The backend datasource is unavailable.
-view_login_noLdap = Note: Optional retrieval of ldap details unsuccessful. Manual entry is required.
-view_login_noUser = The username or password provided does not match our records.
-view_login_prompt = ログインしてください
-view_login_registerLater = (Cancel - Complete registration later.)
-view_login_registerLdapSuccess = Successfully registered the new LDAP User.
-view_login_registerUser = Register User
-view_login_welcome = ようこそ
-view_login_welcomeMsg = Welcome to RHQ! <br/><br/> Enter/update the following fields to complete your registration process.<br/> Once you click "OK", you will be logged in.<br/><br/>
-view_measureRange_last = Time Range - Previous
-view_measureRange_simple = Simple...
-view_measureRange_start = Time Range - Start
-view_measureTable_chartMetricValues = Chart Selected Metrics
-view_measureTable_getLive = Get Live Value
-view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
-view_measureTable_live_title = ライブデータ
-view_measure_nan = --no data available--
-view_measurementOob_title = 疑わしいメトリックス
-view_menuBar_logout = ログアウト
-view_messageCenter_clearAllMessages = Clear All Messages
-view_messageCenter_lastNMessages = Last {0} Messages
-view_messageCenter_maxMessages = Max Messages
-view_messageCenter_messageBarShowDetails = Show Details
-view_messageCenter_messageDetail = Detail
-view_messageCenter_messageSeverity = Severity
-view_messageCenter_messageTime = Time
-view_messageCenter_messageTitle = メッセージセンター
-view_messageCenter_noRecentMessages = No Recent Messages
-view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
-view_metric_traits = Traits
-view_metric_viewTraitHistory = Value History for Trait [{0}]
-view_operationHistoryDetails_dateCompleted = 完了日
-view_operationHistoryDetails_dateSubmitted = 発行日
-view_operationHistoryDetails_error_fetchFailure = Failure loading operation history.
-view_operationHistoryDetails_noResults = This operation does not return any results.
-view_operationHistoryDetails_operation = オペレーション
-view_operationHistoryDetails_parameters = パラメータ
-view_operationHistoryDetails_requestor = 要求者
-view_operationHistoryDetails_results = 結果
-view_operationHistoryDetails_status = ステータス
-view_operationHistoryList_button_forceDelete = Force Delete
-view_operationHistoryList_button_runOperation = Run Operation
-view_operationHistoryList_notYetStarted = not yet started
-view_operationHistoryList_title = オペレーション履歴
-view_operationScheduleDetails_enterParametersBelow = Enter parameters below...
-view_operationScheduleDetails_fieldDefault_description = Select an operation to see its description.
-view_operationScheduleDetails_fieldDefault_parameters = Select an operation to see its parameters.
-view_operationScheduleDetails_fieldHelp_description = an optional description of this scheduled operation (e.g. nightly maintenance app server restart)
-view_operationScheduleDetails_fieldHelp_timeout = a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated
-view_operationScheduleDetails_field_description = 説明
-view_operationScheduleDetails_field_parameters = パラメータ
-view_operationScheduleDetails_field_timeout = タイムアウト
-view_operationScheduleDetails_noParameters = This operation does not take any parameters.
-view_operationScheduleDetails_operationSchedule = オペレーションスケジュール
-view_portlet_autodiscovery_setting_platforms = discovered platforms
-view_portlet_configure_definitionDesc = The configuration settings for the portlet.
-view_portlet_configure_definitionTitle = Portlet Configuration
-view_portlet_configure_needed = Click the Settings button to configure this portlet.
-view_portlet_configure_notNeeded = Configuration is not necessary for this portlet.
-view_portlet_defaultName_autodiscovery = ディスカバリキュー
-view_portlet_defaultName_favoriteResources = お気に入りリソース
-view_portlet_defaultName_groupMetric = Resource Group Metric Graph
-view_portlet_defaultName_group_alerts = グループ: アラート
-view_portlet_defaultName_group_bundles = グループ: バンドルデプロイ
-view_portlet_defaultName_group_config_updates = グループ: 構成の更新
-view_portlet_defaultName_group_events = グループ: イベント数
-view_portlet_defaultName_group_metrics = グループ: メトリックス
-view_portlet_defaultName_group_oobs = グループ: OOB 条件
-view_portlet_defaultName_group_operations = グループ: オペレーション
-view_portlet_defaultName_group_pkg_hisory = グループ: パッケージ履歴
-view_portlet_defaultName_inventorySummary = インベントリサマリ
-view_portlet_defaultName_mashup = マッシュアップ
-view_portlet_defaultName_message = メッセージ
-view_portlet_defaultName_operations = 最近のオペレーション
-view_portlet_defaultName_platformSummary = プラットフォーム利用率
-view_portlet_defaultName_problemResources = アラートまたは利用できないリソース
-view_portlet_defaultName_recentAlerts = 最近のアラート
-view_portlet_defaultName_recentlyAddedResources = 最近追加されたリソース
-view_portlet_defaultName_resourceMetric = Resource Metric Graph
-view_portlet_defaultName_resource_alerts = リソース: アラート
-view_portlet_defaultName_resource_bundles = リソース: バンドルデプロイ
-view_portlet_defaultName_resource_config_updates = リソース: 構成の更新
-view_portlet_defaultName_resource_events = リソース: イベント数
-view_portlet_defaultName_resource_metrics = リソース: 測定
-view_portlet_defaultName_resource_oobs = リソース: OOB メトリックス
-view_portlet_defaultName_resource_operations = リソース: オペレーション
-view_portlet_defaultName_resource_pkg_hisory = リソース: パッケージ履歴
-view_portlet_defaultName_tagCloud = タグ数
-view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
-view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
-view_portlet_graph_configure_resource_graph = The resource to graph
-view_portlet_help_autodiscovery = This portlet allows import or ignore of newly discovered resources. Imported resources are added to inventory for monitoring and management. Ignored resources are not imported and are hidden from view unless explicitly unignored.
-view_portlet_help_bundle_deps = This portlet shows relevant bundle deployments based on display criteria configured.
-view_portlet_help_config_updates = This portlet displays recent configuration changes consistent with configuration settings.
-view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
-view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
-view_portlet_help_graph = This portlet displays the resource metric graph.
-view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
-view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
-view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
-view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
-view_portlet_help_none = There is no help available for this portlet.
-view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
-view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
-view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
-view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
-view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
-view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
-view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
-view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
-view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
-view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
-view_portlet_inventory_error1 = Failed to retrieve inventory summary
-view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
-view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
-view_portlet_message_title = The message to display.
-view_portlet_operations_config_completed = completed operations
-view_portlet_operations_config_completed_enable = Whether to enable completed operations results grouping for dashboard.
-view_portlet_operations_config_completed_maximum = Maximum number of Completed operations to display.
-view_portlet_operations_config_scheduled_enable = Whether to enable scheduled operations results grouping for dashboard.
-view_portlet_operations_config_scheduled_maximum = Maximum number of Scheduled operations to display.
-view_portlet_operations_config_show_last = show Last
-view_portlet_operations_config_show_next = show Next
-view_portlet_operations_disabled = (Results currently disabled. Change settings to enable results.
-view_portlet_platform_platform_error_1 = Failed to load platform metrics
-view_portlet_platform_type_error_1 = Could not load type data
-view_portlet_problemResources_config_display_maximum = Maximum number of Problem resources to display.
-view_portlet_problemResources_config_display_range = Show problem resources going back this many hours.
-view_portlet_problemResources_config_display_range2 = From {0} to {1}
-view_portlet_problemResources_maxDisplaySetting = maximum resources.
-view_portlet_recentAlerts_config_members = Select Members
-view_portlet_recentAlerts_config_priority_label = priority Alerts,
-view_portlet_recentAlerts_config_when = within the past
-view_portlet_recentAlerts_fail_msg = Failed to load resources assigned for alert filtering.
-view_portlet_recentlyAdded_error1 = Failed to load recently added resources
-view_portlet_recentlyAdded_setting_addedPlatforms = recently added platforms
-view_portlet_results_empty = 指定されたクライテリアの結果は見つかりません
-view_remoteAgentInstall_agentStatus = エージェントのステータス
-view_remoteAgentInstall_agentStatusDefault = -ステータスの更新ボタンをクリックしてください-
-view_remoteAgentInstall_buttonFindAgent = エージェントの発見
-view_remoteAgentInstall_connInfo = 接続情報
-view_remoteAgentInstall_error_1 = Error occurred while trying to find agent install path
-view_remoteAgentInstall_error_2 = Could not find an agent installed when looking in common locations
-view_remoteAgentInstall_error_3 = Could not find an agent installed at or under [{0}]
-view_remoteAgentInstall_error_4 = Failed to install agent
-view_remoteAgentInstall_error_5 = Failed to start agent
-view_remoteAgentInstall_error_6 = Failed to stop agent
-view_remoteAgentInstall_installAgent = エージェントのインストール
-view_remoteAgentInstall_installInfo = エージェントのインストール情報
-view_remoteAgentInstall_installPath = エージェントのインストールパス
-view_remoteAgentInstall_owner = オーナー
-view_remoteAgentInstall_promptHost = The host where the agent is or will be installed
-view_remoteAgentInstall_promptInstallPath = Where the agent is or will be installed. If you aren''t sure where an agent is installed, enter a parent directory and click the ''Find Agent'' button to scan that directory and below. If you enter an empty path, common locations are searched on the host for an agent install.
-view_remoteAgentInstall_promptPassword = The credentials that are used to authenticate the user on the host via SSH
-view_remoteAgentInstall_promptPort = The port the SSH server is listening to. If not specified, the default is 22
-view_remoteAgentInstall_promptUser = The name of the user whose credentials are passed to the host via SSH
-view_remoteAgentInstall_result = Result
-view_remoteAgentInstall_resultCode = ResultCode
-view_remoteAgentInstall_startAgent = エージェントの起動
-view_remoteAgentInstall_startAgentResults = Agent start results: [{0}]
-view_remoteAgentInstall_step = ステップ
-view_remoteAgentInstall_stopAgent = エージェントの停止
-view_remoteAgentInstall_stopAgentResults = Agent stop results: [{0}]
-view_remoteAgentInstall_success = Agent installation complete
-view_remoteAgentInstall_updateStatus = スタータスの更新
-view_reportsTop_description = このセクションはグローバルレポートへのアクセスを提供します。
-view_reportsTop_title = レポート
-view_reports_alertDefinitions = アラート定義
-view_reports_alertDefinitions_parentHover = Click to go to the parent alert definition
-view_reports_alertDefinitions_resTypeLoadError = Cannot get the template resource type - unable to view the alert template.
-view_reports_inventorySummary_failFetch = Failed to get inventory summary
-view_reports_platforms = プラットフォーム利用率
-view_reports_subsystems = サブシステム
-view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.
-view_resourceResourceGroupList_error_updateFailure = Failed to update assigned Resource groups.
-view_resourceResourceGroupList_message_updateSuccess = Group membership updated for [{0}].
-view_resource_inventory_activity_changed_by = Changed by
-view_resource_inventory_activity_criteria_no_recent_events = 表示クライテリアに基づくイベントはありません
-view_resource_inventory_activity_no_recent_alerts = No recent alerts
-view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
-view_resource_inventory_activity_no_recent_config_history = No configuration change history
-view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
-view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
-view_resource_inventory_activity_no_recent_oob = OOBの条件はみつかりません
-view_resource_inventory_activity_no_recent_operations = No recent operation history
-view_resource_inventory_activity_no_recent_pkg_history = No recent package history
-view_resource_inventory_childhistory_createdChild = Created Child
-view_resource_inventory_childhistory_deletedChild = Deleted Child
-view_resource_inventory_childhistory_filterTitle = Past N Days
-view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
-view_resource_inventory_childhistory_status_invalidConfig = Invalid Configuration
-view_resource_monitor_availability_loadFailed = Failed to load availability history
-view_resource_monitor_calltime_average = Average
-view_resource_monitor_calltime_count = Count
-view_resource_monitor_calltime_destination = Call Destination
-view_resource_monitor_calltime_editFailed = Call time data can not be edited
-view_resource_monitor_calltime_loadFailed = Could not load call time data
-view_resource_monitor_calltime_lookupFailed = Could not load resource for call time
-view_resource_monitor_calltime_maximum = Maximum
-view_resource_monitor_calltime_minimum = Minimum
-view_resource_monitor_calltime_title = Call Time Data
-view_resource_monitor_calltime_total = Total
-view_resource_monitor_detailed_graph_label = Detailed Graph
-view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
-view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
-view_resource_monitor_graphs_loadFailed = Failed to load graph data
-view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
-view_resource_monitor_graphs_noneAvailable = No graphs available
-view_resource_monitor_schedules_title = Resource Metric Collection Schedules
-view_resource_monitor_table_alerts = アラート
-view_resource_monitor_table_avg = Average
-view_resource_monitor_table_last = Last
-view_resource_monitor_table_max = Maximum
-view_resource_monitor_table_min = Minimum
-view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details
-view_resource_title_tagUpdateFailed = Failed to update resource tags
-view_searchBar_defaultPattern = name your pattern
-view_searchBar_error_selectSavedSearch = ''Error selecting saved search''
-view_searchBar_query = Query
-view_searchBar_resourceGroups = リソースグループ
-view_searchBar_resources = リソース
-view_searchBar_welcomeMessage = search for {0}s
-view_searchGUI_loginStatus = Unable to determine login status, check server status
-view_selector_assigned = Assigned {0}
-view_selector_available = Available {0}
-view_subTab_error_disabled = Cannot select disabled subTab [{0}].
-view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
-view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_traitsLoadFailure = Failed to load traits for {0}.
-view_summaryOverviewForm_field_description = 説明
-view_summaryOverviewForm_field_location = 場所
-view_summaryOverviewForm_field_name = 名前
-view_summaryOverviewForm_field_type = タイプ
-view_summaryOverviewForm_field_version = バージョン
-view_summaryOverviewForm_header_summary = サマリ
-view_summaryOverviewForm_label_plugin = プラグイン:
-view_summaryOverviewForm_label_type = タイプ:
-view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverview_header_detectedErrors = 検出済みエラー
-view_summaryOverview_title_errorDetailsWindow = エラー詳細
-view_summaryOverview_tooltip_detectedErrors = Click on the rows to see the error details.
-view_tableSection_backButton = Back to List
-view_tableSection_error_badId = Can not show detail for [{0}]. Illegal 'id': [{1}]. Please report this bug
-view_tableSection_error_noId = Table [{0}] record is missing 'id' attribute - please report this bug.
-view_table_drawFail = Failed to draw Table [{0}].
-view_table_matchingRows = 一致した行: {0} (選択済み: {1})
-view_table_totalRows = 合計行: {0} (選択済み: {1})
-view_tabs_common_activity = アクティビティ
-view_tabs_common_agent = エージェント
-view_tabs_common_alerts = アラート
-view_tabs_common_availability = アベイラビリティ
-view_tabs_common_calltime = 呼び出し時間e
-view_tabs_common_child_history = 子の履歴
-view_tabs_common_child_resources = 子リソース
-view_tabs_common_configuration = 構成
-view_tabs_common_connectionSettings = 接続設定
-view_tabs_common_connectionSettingsHistory = 接続設定の履歴
-view_tabs_common_content = コンテント
-view_tabs_common_current = 現在
-view_tabs_common_dashboard = ダッシュボード
-view_tabs_common_definitions = 定義
-view_tabs_common_deployed = デプロイ済み
-view_tabs_common_events = イベント
-view_tabs_common_graphs = グラフ
-view_tabs_common_group_members = グループメンバー
-view_tabs_common_group_membership = グループメンバーシップ
-view_tabs_common_groups = グループ
-view_tabs_common_history = 履歴
-view_tabs_common_inventory = インベントリ
-view_tabs_common_members = メンバー
-view_tabs_common_monitoring = モニタリング
-view_tabs_common_new = 新規
-view_tabs_common_operations = オペレーション
-view_tabs_common_overview = 概要
-view_tabs_common_schedule = スケジュール
-view_tabs_common_schedules = スケジュール
-view_tabs_common_subscriptions = サブスクリプション
-view_tabs_common_summary = サマリ
-view_tabs_common_tables = テーブル
-view_tabs_common_timeline = タイムライン
-view_tabs_common_traits = Traits
-view_tabs_invalidSubTab = Invalid subtab: {0}
-view_tabs_invalidTab = Invalid tab: {0}
-view_tagCloud_deleteTag = Delete Tag
-view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
-view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
-view_tagCloud_error_fetchFailure = Failed to load tags.
-view_tagCloud_error_tagUsedCount = Tag used {0} times.
-view_tagCloud_title = Tag Cloud
-view_taggedResources_title = リソース
-view_tags_error_1 = Failed to load Tags
-view_tags_tags = タグ
-view_tags_tooltip_1 = Click to remove this Tag
-view_tags_tooltip_2 = Click to edit Tags
-view_tags_tooltip_3 = Enter a Tag in the format: (namespace:)(semantic=)tagname (e.g. it:env=QA, or owner=John)
-view_testTop_description = This section contains pages for testing various GUI components.
-view_testTop_title = テスト
-view_titleBar_common_addedFav = You have added [{0}] as a favorite
-view_titleBar_common_addedFavFailure = Failed to add [{0}] as a favorite
-view_titleBar_common_clickToAddFav = Click to add this as a favorite
-view_titleBar_common_clickToRemoveFav = Click to remove this as a favorite
-view_titleBar_common_loadTagsFailure = Failed to load the tags for [{0}]
-view_titleBar_common_removedFav = You have removed [{0}] as one of your favorites
-view_titleBar_common_removedFavFailure = Failed to remove [{0}] as one of your favorites
-view_titleBar_common_updateTagsFailure = Failed to update the tags for [{0}]
-view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have been updated
-view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
-view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
-view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
-view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]
-view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration
-view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource Configuration
-view_tree_common_contextMenu_groupGraph = Group Metric Graph
-view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
-view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboards
-view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
-view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
-view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children
-view_tree_common_contextMenu_measurements = Measurements
-view_tree_common_contextMenu_operations = Operations
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
-view_tree_common_contextMenu_resourceConfiguration = Resource Configuration
-view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
-view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard
-view_tree_common_contextMenu_saveChartToDashboardSuccessful = You have saved dashboard [{0}]
-view_tree_common_contextMenu_type_name_label = Type: {0}
-view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
-view_tree_common_loadFailed_children = Failed to load children for node
-view_tree_common_loadFailed_create = Failed to create view for this node
-view_tree_common_loadFailed_descendants = Failed to load descendants for tree
-view_tree_common_loadFailed_generic = Failed to load data for tree
-view_tree_common_loadFailed_group = Failed to load group with id [{0}]
-view_tree_common_loadFailed_groupTree = Failed to load group tree
-view_tree_common_loadFailed_node = Failed to load data for this node
-view_tree_common_loadFailed_root = Failed to load root for tree
-view_tree_common_loadFailed_selection = Failed to select this node
-view_tree_common_loadFailed_update = Failed to update view for this node
-view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
-view_type_parentId = Parent ID
-view_type_resourceTypes = Resource Types
-view_type_typeTreeLoadFailure = Failed to load resource type tree data
-view_upload_alreadyUploaded = File has already been uploaded
-view_upload_bundleDistFile = Distribution File
-view_upload_error_bundleDistFile = Error uploading Bundle Distribution File
-view_upload_error_file = Error uploading file
-view_upload_error_fileName = Error uploading file [{0}]
-view_upload_error_fileName_2 = Error uploading file [{0}], check for invalid file path.
-view_upload_error_packageVersionFile = Error uploading Package Version File
-view_upload_error_results = Error uploading file, unexpected results: [{0}]
-view_upload_inProgress = Can not submit, upload is currently in progress
-view_upload_prompt_1 = Please select a file to upload [{0}]
-view_upload_prompt_2 = File to Upload
-view_upload_success = File successfully uploaded
-view_upload_tooltip_1a = Select a file to upload, then click Upload or Next
-view_upload_tooltip_1b = Select a file to upload, then click Next
-view_upload_tooltip_2 = File upload had previously failed
-view_upload_upload = Upload
-view_upload_uploadFile = UploadFile
-widget_colorPicker_tooltip = Click to select a new color
-widget_durationItem_inputUnitLessThanTargetUnit = Input unit is less than target unit.
-widget_durationItem_unitTypeNotSupported = Unit type [{0}] is not supported by this DurationItem.
-widget_jobTriggerEditor_fieldHelp_repeatDuration = keep running this operation this many times or until this amount of time has elapsed
-widget_jobTriggerEditor_fieldHelp_repeatInterval = how often the operation should be executed
-widget_jobTriggerEditor_fieldHelp_startDelay = start executing the operation after this amount of time has elapsed
-widget_jobTriggerEditor_field_cronExpression = Cron Expression
-widget_jobTriggerEditor_field_mode = Schedule using
-widget_jobTriggerEditor_field_repeatInterval_later = Repeat every
-widget_jobTriggerEditor_field_repeatInterval_now = Run now and every
-widget_jobTriggerEditor_field_startType = Run
-widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = End time must be after start time.
-widget_jobTriggerEditor_message_endTimeMustBeInFuture = End time must be in the future.
-widget_jobTriggerEditor_message_startTimeMustBeInFuture = Start time must be in the future.
-widget_jobTriggerEditor_tab_examples = Examples
-widget_jobTriggerEditor_tab_format = Format
-widget_jobTriggerEditor_value_calendar = Calendar
-widget_jobTriggerEditor_value_cronExpression = Cron Expression
-widget_jobTriggerEditor_value_for = For
-widget_jobTriggerEditor_value_in = in
-widget_jobTriggerEditor_value_indefinitely = Indefinitely
-widget_jobTriggerEditor_value_later = Later
-widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
-widget_jobTriggerEditor_value_now = Now
-widget_jobTriggerEditor_value_nowAndRepeat = Now & Repeat
-widget_jobTriggerEditor_value_on = on
-widget_jobTriggerEditor_value_until = Until
-widget_recordEditor_error_invalidViewPath = Invalid view path: [{0}]
-widget_recordEditor_error_multipleRecords = Multiple records were returned - expected exactly one.
-widget_recordEditor_error_noRecords = No records were returned - expected exactly one.
-widget_recordEditor_error_operation = Operation failed. An error occurred
-widget_recordEditor_error_operationInvalidValues = Operation failed - one or more fields have invalid values
-widget_recordEditor_error_permissionCreate = You do not have the permissions required to create a new [{0}]
-widget_recordEditor_error_unsupportedOperationType = Unsupported operation type: [{0}]
-widget_recordEditor_info_recordCreatedConcise = {0} created.
-widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created.
-widget_recordEditor_info_recordUpdatedConcise = {0} updated.
-widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
-widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
-widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
-widget_recordEditor_label_loading = ロード中...
-widget_recordEditor_title_edit = Edit {0} [{1}]
-widget_recordEditor_title_new = Create New {0}
-widget_recordEditor_title_view = View {0} [{1}]
-widget_recordEditor_warn_validation = One or more fields have invalid values. This [{0}] cannot be saved until these values are corrected
-widget_resourceFactoryWizard_archPrompt = Package Architecture
-widget_resourceFactoryWizard_configTemplatePrompt = Resource Configuration Templates
-widget_resourceFactoryWizard_contentTemplatePrompt = Deployment Time Configuration Templates
-widget_resourceFactoryWizard_createSubmit = A request to create a resource with the name of [{0}] has been submitted successfully.
-widget_resourceFactoryWizard_createSubmitType = A request to create a resource of type [{0}] has been submitted successfully.
-widget_resourceFactoryWizard_createWizardTitle = Create New Resource of Type [{0}]
-widget_resourceFactoryWizard_createWizardWindowTitle = Resource Create Wizard
-##widget_resourceFactoryWizard_editConfigStepName = Deployment Options
-widget_resourceFactoryWizard_execute1 = Failed to create a new resource - there is no package version
-widget_resourceFactoryWizard_execute2 = Failed to create a new resource
-widget_resourceFactoryWizard_failedToDeleteVersion = Failed to delete package version while canceling a resource create
-widget_resourceFactoryWizard_failedToGetType = Failed to get backing package type for new resource
-widget_resourceFactoryWizard_importFailure = Failed to manually import resource
-widget_resourceFactoryWizard_importSubmitted = A request to import a new resource of type [{0}] has been submitted
-widget_resourceFactoryWizard_importWizardTitle = Import Resource of Type [{0}]
-widget_resourceFactoryWizard_importWizardWindowTitle = Resource Import Wizard
-widget_resourceFactoryWizard_infoStepName = Resource Information
-widget_resourceFactoryWizard_infoStep_loadFail = Failed to get available Architectures
-widget_resourceFactoryWizard_namePrompt = New Resource Name
-widget_resourceFactoryWizard_templatePrompt = Connection Settings Template
-##widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
-widget_resourceFactoryWizard_uploadFailure = Failed to upload file
-widget_resourceFactoryWizard_uploadFileStepName = Upload Resource Content File
-widget_resourceFactoryWizard_uploadInProgress = The upload is in progress... This can take several minutes to complete for large distribution files.
-widget_resourceFactoryWizard_versionPrompt = Package Version
-widget_resourceSelector_groupCategory = Group Category
-widget_resourceSelector_pleaseSelectMultipleResource = Please select one or more resources
-widget_resourceSelector_pleaseSelectResource = Please select a resource
-widget_resourceSelector_selectMultipleResources = Select Resources
-widget_resourceSelector_selectResource = Select a Resource
-widget_typeCache_loadFail = Failed to load resource type metadata
-widget_typeTree_badTemplateType = Invalid URL. Unknown template type [{0}]
-widget_typeTree_badTypeId = Invalid URL. Bad resource type ID [{0}]
-widget_typeTree_loadFail = Failed to load resource types
+#
+# RHQ GUI i18n Messages - Locale: JA
+#
+# This file should be UTF-8 encoded.
+#
+# Developers: See the following wiki page for how to work with this file:
+#
+# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
+#
+###################################
+common_alert_high = High
+common_alert_low = Low
+common_alert_medium = Medium
+common_buildInfo_gwtVersion = ${gwt.version}
+common_button_ack = 確認
+common_button_ack_all = すべてを確認
+common_button_add = 追加
+common_button_advanced = Advanced...
+common_button_apply = 適用
+common_button_cancel = キャンセル
+common_button_close = 閉じる
+common_button_compare = 比較
+common_button_create_child = 子を作成
+common_button_delete = 削除
+common_button_delete_all = すべてを削除
+common_button_disable = 無効
+common_button_edit = 編集
+common_button_enable = 有効
+common_button_finish = 完了
+common_button_import = インポート
+common_button_new = 新規
+common_button_next = 次へ
+common_button_ok = OK
+common_button_previous = 前へ
+common_button_purgeAll = すべてをパージ
+common_button_refresh = リフレッシュ
+common_button_reset = リセット
+common_button_save = 保存
+common_button_schedule = スケジュール
+common_button_search = 検索
+common_button_set = 設定
+common_button_showDetails = 詳細表示...
+common_button_uninventory = アンインベントリ
+common_calendar_april_short = apr
+common_calendar_august_short = aug
+common_calendar_december_short = dec
+common_calendar_february_short = feb
+common_calendar_january_short = jan
+common_calendar_july_short = jul
+common_calendar_june_short = jun
+common_calendar_march_short = mar
+common_calendar_may_short = may
+common_calendar_november_short = nov
+common_calendar_october_short = oct
+common_calendar_september_short = sept
+common_label_ago = ago
+common_label_all = すべての
+common_label_all_resources = all resources
+common_label_day = day
+common_label_days = days
+common_label_hour = hour
+common_label_hours = hours
+common_label_item = item
+common_label_items = items
+common_label_milliseconds = milliseconds
+common_label_minutes = minutes
+common_label_month = month
+common_label_none = none
+common_label_role = role
+common_label_roles = roles
+common_label_scheduled_operations = scheduled operations
+common_label_seconds = seconds
+common_label_selected_resources = selected resources
+common_label_unlimited = unlimited
+common_label_user = user
+common_label_users = users
+common_label_week = week
+common_label_weeks = weeks
+common_label_yesterday = Yesterday
+common_msg_areYouSure = Are You Sure?
+common_msg_changeAutoDetected = Change auto-detected
+common_msg_deleteConfirm = Are you sure you want to delete the # selected {0}?
+common_msg_emphasizedNotePrefix = NOTE:
+common_msg_loading = Loading...
+common_msg_noItemsToShow = No items to show
+common_msg_notYetImplemented = Not Yet Implemented
+common_msg_see_more = see more...
+common_msg_step_x_of_y = Step {0} of {1}
+common_severity_debug = Debug
+common_severity_error = Error
+common_severity_fatal = Fatal
+common_severity_info = Info
+common_severity_warn = Warn
+common_status_canceled = Canceled
+common_status_deferred = Deferred
+common_status_failed = Failed
+common_status_inprogress = In Progress
+common_status_nochange = No Change
+common_status_partial = Partial
+common_status_success = Success
+common_status_timedOut = Timed Out
+common_status_unknown = Unknown
+common_title_add_column = カラム追加
+common_title_add_portlet = ポートレット追加
+common_title_address = アドレス
+common_title_alert_range = アラートの範囲
+common_title_ancestry = 祖先
+common_title_availability = アベイラビリティ
+common_title_available_resources = 利用可能リソース
+common_title_average_metrics = 毎分の平均メトリックス
+common_title_background = バックグラウンド
+common_title_bundle = バンドル
+common_title_bundles = バンドル
+common_title_category = カテゴリ
+common_title_change_refresh_time = インターバルのリフレッシュ
+common_title_columns = カラム
+common_title_compare_metrics = メトリックスの比較
+common_title_compatibleGroups = 互換グループ
+common_title_compatibleGroups_total = 互換グループの合計
+common_title_component_errors = コンポーネントエラー
+common_title_config_update_status = 更新状態
+common_title_configuration = 構成
+common_title_count = 数
+common_title_custom = カスタム
+common_title_dashboard_name = ダッシュボード名
+common_title_dateCreated = 生成日
+common_title_dateRange = 日付の範囲
+common_title_default = デフォルト
+common_title_description = 説明
+common_title_details = 詳細
+common_title_display = 表示
+common_title_display_name = 表示名
+common_title_duration = 期間
+common_title_edit_mode = 編集モード
+common_title_enabled = 有効?
+common_title_end = 終了
+common_title_error = エラー
+common_title_generalProp = 一般プロパティ
+common_title_group = グループ
+common_title_group_def_total = グループ定義の合計
+common_title_group_member_health = グループメンバーの状態
+common_title_groups = グループ
+common_title_help = ヘルプ
+common_title_host = ホスト
+common_title_id = ID
+common_title_id_parent = 親のID
+common_title_info = 情報
+common_title_inventory = インベントリ
+common_title_inventorySummary = インベントリサマリ
+common_title_lastUpdated = 最終更新
+common_title_lastUpdatedBy = 最終更新(による)
+common_title_ldapGroups = LDAPグループ
+common_title_mashup = マッシュアップ
+common_title_members_reporting = メンバーのリポート
+common_title_message = メッセージ
+common_title_metric = メトリック
+common_title_metric_chart = メトリック図
+common_title_mixedGroups = 混合グループ
+common_title_mixedGroups_total = 混合グループの合計
+common_title_name = 名前
+common_title_new_dashboard = 新規ダッシュボード
+common_title_numeric_metrics = 数値メトリックス
+common_title_numeric_type = 数値型
+common_title_operation_status = オペレーションの状態
+common_title_operations = オペレーション
+common_title_operations_range = オペレーションの範囲
+common_title_over = Over
+common_title_password = パスワード
+common_title_path = パス
+common_title_permissions = パーミッション
+common_title_platform = プラットフォーム
+common_title_platform_total = プラットフォームの合計
+common_title_plugin = プラグイン
+common_title_port = ポート
+common_title_providers = プロバイダ
+common_title_recent_alerts = 最近のアラート
+common_title_recent_bundle_deployments = 最近のバンドルのデプロイ
+common_title_recent_configuration_updates = 最近の構成の更新
+common_title_recent_event_counts = 最近のイベント数
+common_title_recent_measurements = 最近の測定
+common_title_recent_oob_metrics = 最近の境界外のメトリックス
+common_title_recent_operations = 最近のオペレーション
+common_title_recent_pkg_history = 最近のパッケージ履歴
+common_title_recently_added = 最近追加された
+common_title_remove_column = カラムの削除
+common_title_repositories = リポジトリ
+common_title_resource = リソース
+common_title_resourceGroups = リソースグループ
+common_title_resource_group = リソースグループ
+common_title_resource_id = リソースID
+common_title_resource_inventory = リソースインベントリ
+common_title_resource_key = リソースキー
+common_title_resource_name = リソース名
+common_title_resource_type = リソースタイプ
+common_title_resources = リソース
+common_title_results_count = 結果の数
+common_title_results_count_tooltip = 結果の数の表示
+common_title_role = ロール
+common_title_roles = ロール
+common_title_scheduled_operations = スケジュールされたオペレーション
+common_title_search = 検索
+common_title_selected_resources = 選択されたリソース
+common_title_server = サーバー
+common_title_server_total = サーバーの合計
+common_title_service = サービス
+common_title_service_total = サービスの合計
+common_title_settings = 設定
+common_title_show = 表示
+common_title_show_more = 詳細表示...
+common_title_sort_order = ソート順
+common_title_sort_order_tooltip = 結果のソート順を設定
+common_title_start = 開始
+common_title_status = ステータス
+common_title_stop = 停止
+common_title_summary = サマリ
+common_title_tag_cloud = Tag Cloud
+common_title_the = The
+common_title_timestamp = 日付/時間
+common_title_total = 合計
+common_title_type = タイプ
+common_title_units = 単位
+common_title_user = ユーザー
+common_title_users = ユーザー(複数)
+common_title_value = 値
+common_title_version = バージョン
+common_title_view_mode = ビューモード
+common_title_web_address = Webアドレス
+common_title_welcome = ようこそ
+common_unit_days = days
+common_unit_hours = hours
+common_unit_milliseconds = milliseconds
+common_unit_minutes = minutes
+common_unit_months = months
+common_unit_seconds = seconds
+common_unit_times = times
+common_unit_weeks = weeks
+common_unit_years = years
+common_val_for = for
+common_val_n1st = {0}st
+common_val_n2nd = {0}nd
+common_val_n3rd = {0}rd
+common_val_na = N/A
+common_val_never = Never
+common_val_no = No
+common_val_no_lower = no
+common_val_none = None
+common_val_nth = {0}th
+common_val_yes = Yes
+common_val_yes_lower = yes
+dataSource_ContentRepoTree_error_load = Error loading repositories
+dataSource_ContentRepoTree_field_parentId = Parent ID
+dataSource_bundle_loadFailed = Failed to load Bundle data
+dataSource_configurationHistory_clickToSeeError = Double click to see error message...
+dataSource_configurationHistory_currentConfig = This is the current configuration
+dataSource_configurationHistory_dateCompleted = 完了日
+dataSource_configurationHistory_dateSubmitted = 発行日
+dataSource_configurationHistory_error_fetchFailure = Unable to load configuration history.
+dataSource_configurationHistory_updateType = 更新タイプ
+dataSource_configurationHistory_updateType_group = グループ
+dataSource_configurationHistory_updateType_individual = 個人
+dataSource_definitions_loadFailed = Failed to load metric definitions
+dataSource_measurementOob_error_fetchFailure = Failed to load measurement OOB information
+dataSource_measurementOob_field_factor = 範囲外係数 (%)
+dataSource_measurementOob_field_formattedBaseband = バンド
+dataSource_measurementOob_field_formattedOutlier = アウトライナ
+dataSource_measurementOob_field_parentName = 親
+dataSource_measurementOob_field_resourceName = リソース
+dataSource_measurementOob_field_scheduleName = メトリック
+dataSource_operationHistory_error_fetchFailure = Failure loading operation histories.
+dataSource_operationHistory_field_createdTime = 生成時刻
+dataSource_operationHistory_field_operationName = オペレーション名
+dataSource_operationHistory_field_startedTime = 開始時刻
+dataSource_operationHistory_field_subject = 要求者
+dataSource_operationSchedule_field_description = ノート
+dataSource_operationSchedule_field_id = スケジュールID
+dataSource_operationSchedule_field_nextFireTime = 次回の実行
+dataSource_operationSchedule_field_operationDisplayName = オペレーション
+dataSource_operationSchedule_field_operationName = オペレーション
+dataSource_operationSchedule_field_subject = オーナー
+dataSource_operationSchedule_field_timeout = タイムアウト (秒)
+dataSource_platforms_field_cpu = CPU
+dataSource_platforms_field_memory = メモリ
+dataSource_platforms_field_swap = スワップ
+dataSource_problemResources_error_fetchFailure = Failed to load Resources with alerts/unavailability.
+dataSource_problemResources_field_alerts = アラート
+dataSource_problemResources_field_available = 現在のアベイラビリティ
+dataSource_recentOperations_error_fetchFailure = Failed to load recently completed operations.
+dataSource_recentOperations_field_location = ロケーション
+dataSource_recentOperations_field_operation = オペレーション
+dataSource_recentOperations_field_resource = リソース
+dataSource_recentOperations_field_status = ステータス
+dataSource_recentOperations_field_time = 日付/時刻
+dataSource_resourceErrors_clickStatusIcon = Click the icon for more details
+dataSource_resourceErrors_deleteFailure = Failed to delete resource errors
+dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
+dataSource_resourceErrors_error_fetchFailure = Failed to find Resource errors for Resource with id [{0}].
+dataSource_resourceErrors_field_errorType = エラータイプ
+dataSource_resourceErrors_field_summary = サマリ
+dataSource_resourceErrors_field_timeOccured = 時刻
+dataSource_resourceGroups_loadFailed = Failed to load Resource Groups
+dataSource_resources_field_discoveryTime = 発見時刻
+dataSource_resources_field_importTime = インポート時刻
+dataSource_resources_field_key = キー
+dataSource_resources_field_lastModifiedTime = 最終更新時刻
+dataSource_resources_field_lastModifier = 最終更新者
+dataSource_resources_field_location = 場所
+dataSource_rpc_error_transformRequestFailure = Failure in datasource while processing {0} request.
+dataSource_rpc_error_unsupportedArrayFilterType = No support for passing array filters of type {0}.
+dataSource_rpc_error_unsupportedEnumType = Please add an appropriate code block for enum {0} to RPCDataSource.getEnumArray(Class)
+dataSource_rpc_no = no
+dataSource_rpc_yes = yes
+dataSource_scheduledOperations_error_fetchFailure = Failed to load scheduled operations.
+dataSource_scheduledOperations_field_location = 場所
+dataSource_scheduledOperations_field_operation = オペレーション
+dataSource_scheduledOperations_field_resource = リソース
+dataSource_scheduledOperations_field_time = 日付/時刻
+dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
+dataSource_schedules_disableSuccessful_full_group = You have disabled the collection of [{0}] measurements for the resource group with ID [{1}]. The disabled measurements are: [{2}]
+dataSource_schedules_disableSuccessful_full_resource = You have disabled the collection of [{0}] measurements for the resource with ID [{1}]. The disabled measurements are: [{2}]
+dataSource_schedules_enableFailure_group = Failed to enable the collection of [{0}] metrics for group with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_enableFailure_resource = Failed to enable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_enableSuccessful_concise = You have enabled the collection of [{0}] measurements
+dataSource_schedules_enableSuccessful_full_group = You have enabled the collection of [{0}] measurements for the resource group with ID [{1}]. The enabled measurements are: [{2}]
+dataSource_schedules_enableSuccessful_full_resource = You have enabled the collection of [{0}] measurements for the resource with ID [{1}]. The enabled measurements are: [{2}]
+dataSource_schedules_field_resourceGroupId = Group ID
+dataSource_schedules_loadFailed = Failed to load metric schedules
+dataSource_schedules_loadFailedContext = Failed to load metric schedules for context [{0}]
+dataSource_schedules_loadFailedCriteria = Failed to load metric schedules for criteria [{0}]
+dataSource_schedules_updateFailure_group = Failed to set the collection interval of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
+dataSource_schedules_updateFailure_resource = Failed to set the collection interval of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
+dataSource_schedules_updateSuccessful_concise = A new collection interval of [{0}] seconds has been set on [{1}] measurements
+dataSource_schedules_updateSuccessful_full_group = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource group with ID [{2}]. The updated measurements are: [{3}]
+dataSource_schedules_updateSuccessful_full_resource = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource with ID [{2}]. The updated measurements are: [{3}]
+dataSource_traits_failFetch = Failed to fetch traits for criteria [{0}].
+dataSource_traits_field_definitionID = Definition ID
+dataSource_traits_field_lastChanged = Last Changed
+dataSource_traits_field_primaryKey = Primary Key
+dataSource_traits_field_trait = Trait
+dataSource_traits_group_field_groupId = Group ID
+dataSource_users_delete = 削除済みユーザー [{0}]
+dataSource_users_deleteFailed = ユーザー [{0}] の削除に失敗しました
+dataSource_users_field_department = 部門
+dataSource_users_field_emailAddress = Eメールアドレス
+dataSource_users_field_factive = ログインは有効?
+dataSource_users_field_firstName = 名前
+dataSource_users_field_id = ID
+dataSource_users_field_lastName = 名字
+dataSource_users_field_ldap = LDAPログイン?
+dataSource_users_field_name = ユーザー名
+dataSource_users_field_password = パスワード
+dataSource_users_field_passwordVerify = パスワードの確認
+dataSource_users_field_phoneNumber = 電話番号
+dataSource_users_invalidEmailAddress = 無効なEメールアドレス
+dataSource_users_passwordsDoNotMatch = パスワードが一致していません
+datasource_roles_field_ldapGroups = LDAPグループ
+datasource_roles_field_permissions = パーミッション
+datasource_roles_field_resourceGroups = リソースグループ
+datasource_roles_field_subjects = サブジェクト
+datasource_templateSchedules_disabled = Disabled collection of selected metric [{0}].
+datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_disabled_failed = Failed to disable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled = Enabled collection of selected metric [{0}].
+datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled_failed = Failed to enable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_updated = Updated collection intervals of selected metric [{0}].
+datasource_templateSchedules_updated_detail = Collection interval for metric [{0}] [{1}] by default for ResourceType with id [{2}] set to [{3}] seconds.
+datasource_templateSchedules_updated_failed = Failed to set collection interval to [{0}] seconds for metric [{1}] [{2}] by default for ResourceType with id [{3}].
+favorites = お気に入り
+favorites_groups = お気に入りグループ
+favorites_recentlyViewed = 最近閲覧した
+favorites_resources = お気に入りリソース
+group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource
+util_ancestry_parentAncestry = Parent Ancestry for:
+util_disambiguationReportDecorator_pluginSuffix = ({0} plugin)
+util_errorHandler_nullException = exception was null
+util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status.
+util_rpcManager_activeRequests = {0} Active Requests
+util_userPerm_loadFailGlobal = Failed to load your global permissions - none granted.
+util_userPerm_loadFailGroup = Failed to load your permissions for Resource Group with id [{0}] - none granted.
+util_userPerm_loadFailResource = Failed to load your permissions for Resource with id [{0}] - none granted.
+util_userSession_loadFailSubject = UserSessionManager: Failed to load user Subject
+util_userSession_logoutFail = Failed to logout.
+util_widgetsField_unlimited = Unlimited
+view_aboutBox_allRightsReserved = All Rights Reserved.
+view_aboutBox_buildNumber = ビルド番号:
+view_aboutBox_failedToLoad = Failed to load product information.
+view_aboutBox_homepage = ホームページ
+view_aboutBox_jbossByRedHat = JBoss by Red Hat
+view_aboutBox_title = {0}について
+view_aboutBox_version = バージョン:
+view_adminConfig_downloads = ダウンロード
+view_adminConfig_plugins = プラグイン
+view_adminConfig_systemSettings = システム設定
+view_adminConfig_templates = テンプレート
+view_adminContent_contentSources = コンテントソース
+view_adminContent_repositories = リポジトリ
+view_adminRoles_assignedGroups = Assigned Resource Groups
+view_adminRoles_assignedSubjects = Assigned Subjects
+view_adminRoles_failLdap = Failed to determine if LDAP configured - assuming no LDAP.
+view_adminRoles_failLdapGroups = Failed to retrieve available LDAP groups - assuming no LDAP groups.
+view_adminRoles_failLdapGroupsRole = Failed to load LDAP groups available for role.
+view_adminRoles_failRoles = Failed to fetch roles.
+view_adminRoles_globalPerms = Global Permissions
+view_adminRoles_ldapGroups = LDAP Groups
+view_adminRoles_ldapGroupsReadOnly = LDAP group data is read only
+view_adminRoles_noItems = No items to show
+view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP, go to <a {0}>{1}</a>.
+view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
+view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
+view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
+view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
+view_adminRoles_permissions_globalPermissions = Global Permissions
+view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
+view_adminRoles_permissions_isAuthorized = Authorized?
+view_adminRoles_permissions_isRead = Read?
+view_adminRoles_permissions_isWrite = Write?
+view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
+view_adminRoles_permissions_permDesc_manageInventory = has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; and can import auto-discovered or manually discovered Resources
+view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
+view_adminRoles_permissions_permDesc_manageSecurity = can create, update, or delete users and roles (viewing is implied for everyone)
+view_adminRoles_permissions_permDesc_manageSettings = can modify the RHQ Server configuration and perform any Server-related functionality
+view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
+view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
+view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) view child Resource creation history
+view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view child Resource deletion history
+view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
+view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
+view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
+view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
+view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
+view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
+view_adminRoles_permissions_permWriteDesc_control = execute operations; delete operation execution history items
+view_adminRoles_permissions_permWriteDesc_createChildResources = create new child Resources (for child Resources of types that are creatable)
+view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
+view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
+view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
+view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
+view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
+view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
+view_adminRoles_permissions_perm_configure = Configure
+view_adminRoles_permissions_perm_control = Control
+view_adminRoles_permissions_perm_createChildResources = Create Child Resources
+view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
+view_adminRoles_permissions_perm_inventory = Inventory
+view_adminRoles_permissions_perm_manageAlerts = Manage Alerts
+view_adminRoles_permissions_perm_manageBundles = Manage Bundles
+view_adminRoles_permissions_perm_manageContent = Manage Content
+view_adminRoles_permissions_perm_manageEvents = Manage Events
+view_adminRoles_permissions_perm_manageInventory = Manage Inventory
+view_adminRoles_permissions_perm_manageMeasurements = Manage Measurements
+view_adminRoles_permissions_perm_manageRepositories = Manage Repositories
+view_adminRoles_permissions_perm_manageSecurity = Manage Security
+view_adminRoles_permissions_perm_manageSettings = Manage Settings
+view_adminRoles_permissions_read = Read:
+view_adminRoles_permissions_readAccessImplied = Read access for the {0} permission is implied and cannot be disabled.
+view_adminRoles_permissions_resourcePermissions = Resource Permissions
+view_adminRoles_permissions_write = Write:
+view_adminRoles_perms = Permissions
+view_adminRoles_resourcePerms = Resource Permissions
+view_adminRoles_roleAdded = Role [{0}] added.
+view_adminRoles_roleDeleteFailed = Failed to delete role [{0}].
+view_adminRoles_roleDeleted = Role [{0}] deleted.
+view_adminRoles_roleUpdateFailed = Failed to update role [{0}].
+view_adminRoles_roleUpdated = Role [{0}] updated.
+view_adminSecurity_roles = ロール
+view_adminSecurity_users = ユーザー
+view_adminTemplates_disabledAlertTemplates = 無効なアラートテンプレート
+view_adminTemplates_disabledMetricTemplates = 無効なメトリックテンプレート
+view_adminTemplates_editAlertTemplate = アラートテンプレートの編集
+view_adminTemplates_editMetricTemplate = メトリックテンプレートの編集
+view_adminTemplates_enabledAlertTemplates = 有効なアラートテンプレート
+view_adminTemplates_enabledMetricTemplates = 有効なメトリックテンプレート
+view_adminTemplates_platformServices = プラットフォームサービス
+view_adminTemplates_platforms = プラットフォーム
+view_adminTemplates_prompt_disabledAlertTemplates = Number of alert templates that are created but disabled on this resource type
+view_adminTemplates_prompt_disabledMetricTemplates = Number of metric schedules that are disabled by default on this resource type
+view_adminTemplates_prompt_enabledAlertTemplates = Number of alert templates that are enabled on this resource type
+view_adminTemplates_prompt_enabledMetricTemplates = Number of metric schedules that are enabled by default on this resource type
+view_adminTemplates_servers = サービス
+view_adminTopology_affinityGroups = アフィニティグループ
+view_adminTopology_agents = エージェント
+view_adminTopology_partitionEvents = イベントの分類
+view_adminTopology_remoteAgentInstall = リモートエージェントのインストール
+view_adminTopology_servers = サーバー
+view_adminUsersDetails_dataTypeName = ユーザー
+view_adminUsersList_dataTypeName = ユーザー
+view_adminUsersList_dataTypeNamePlural = ユーザー
+view_admin_administration = 管理
+view_admin_configuration = 構成
+view_admin_content = コンテント
+view_admin_downloads_agentDownload = エージェントのダウンロード
+view_admin_downloads_agent_buildNumber = エージェントビルド
+view_admin_downloads_agent_help = <p> This is the RHQ Agent Update Binary jar file. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>Agent Install</h3> <p> <b>java -jar <agent-download.jar> --install[=<new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>Agent Update</h3> <p> <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
+view_admin_downloads_agent_link_label = リンク
+view_admin_downloads_agent_link_value = エージェント {0} ({1}) のダウンロード
+view_admin_downloads_agent_loadError = Cannot get agent version info
+view_admin_downloads_agent_md5 = エージェント MD5
+view_admin_downloads_agent_version = エージェントバージョン
+view_admin_downloads_bundleDownload = バンドルデプロイヤのダウンロード
+view_admin_downloads_bundle_help = <p> This is the Bundle Deployer tool. It is for use by developers and packagers of RHQ bundles. This standalone tool allows you to test your bundles and their recipes from a console. </p>
+view_admin_downloads_bundle_link_label = Link
+view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
+view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
+view_admin_downloads_cliDownload = コマンドラインクライアントのダウンロード
+view_admin_downloads_cli_buildNumber = CLI Build
+view_admin_downloads_cli_help = <p> This is the Command Line Client tool, otherwise known as the CLI. It is a standalone tool that runs from within a console and provides a command line interface to the RHQ Server. You can invoke commands via the CLI as well as run scripts to perform automated tasks. See the documentation for more information on how to install and use the CLI. </p>
+view_admin_downloads_cli_link_label = Link
+view_admin_downloads_cli_link_value = Download CLI {0} ({1})
+view_admin_downloads_cli_loadError = Cannot get CLI version info
+view_admin_downloads_cli_md5 = CLI MD5
+view_admin_downloads_cli_version = CLI Version
+view_admin_downloads_connectorsDownload = コネクタのダウンロード
+view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
+view_admin_downloads_connectors_loadError = Cannot get connectors info
+view_admin_downloads_connectors_none = No connectors are available for download
+view_admin_landing = このセクションにおいて、RHQグローバル設定が管理されます。これはセキュリティ構成、プラグイン設定、RHQサーバーとエージェントの管理を含みます。
+view_admin_measTemplates_title = Template Metric Collection Schedules
+view_admin_measTemplates_updateExisting_title = Update Existing Schedules
+view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
+view_admin_security = セキュリティ
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
+view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
+view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
+view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
+view_admin_systemSettings_BaseURL_name = GUI Console URL
+view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
+view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
+view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
+view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
+view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
+view_admin_systemSettings_DataMaintenance_name = Database Maintenance Period
+view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
+view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
+view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
+view_admin_systemSettings_EnableAgentAutoUpdate_name = Enable Agent Auto-Updates
+view_admin_systemSettings_EnableDebugMode_desc = If enabled, the server will enter debug mode.
+view_admin_systemSettings_EnableDebugMode_name = Enable Debug Mode
+view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
+view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
+view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_EventPurge_name = Delete Events Older Than
+view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
+view_admin_systemSettings_JAASProvider_name = Enable LDAP
+view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou=People,dc=redhat,dc=com
+view_admin_systemSettings_LDAPBaseDN_name = Search Base
+view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn=Manager,dc=redhat,dc=com
+view_admin_systemSettings_LDAPBindDN_name = Username
+view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
+view_admin_systemSettings_LDAPBindPW_name = Password
+view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser=true
+view_admin_systemSettings_LDAPFilter_name = Search Filter
+view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
+view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
+view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
+view_admin_systemSettings_LDAPLoginProperty_name = Login Property
+view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
+view_admin_systemSettings_LDAPProtocol_name = SSL
+view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
+view_admin_systemSettings_LDAPUrl_name = LDAP URL
+view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
+view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
+view_admin_systemSettings_cannotLoadServerDetails = Cannot load server details
+view_admin_systemSettings_cannotLoadSettings = Cannot obtain the current system settings
+view_admin_systemSettings_fixBeforeSaving = Please fix the invalid values before saving
+view_admin_systemSettings_group_baseline = 自動ベースライン構成プロパティ
+view_admin_systemSettings_group_dataMgr = データマネージャー構成プロパティ
+view_admin_systemSettings_group_general = 全体構成プロパティ
+view_admin_systemSettings_group_ldap = LDAP 構成プロパティ
+view_admin_systemSettings_saveFailure = Failed to save the system settings
+view_admin_systemSettings_savedSettings = You successfully saved the system properties
+view_admin_systemSettings_serverDetails = Server Details
+view_admin_systemSettings_serverDetails_buildNumber = Build Number
+view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
+view_admin_systemSettings_serverDetails_dbDriverName = Database Driver Name
+view_admin_systemSettings_serverDetails_dbDriverVersion = Database Driver Version
+view_admin_systemSettings_serverDetails_dbName = Database Product Name
+view_admin_systemSettings_serverDetails_dbUrl = Database Connection URL
+view_admin_systemSettings_serverDetails_dbVersion = Database Product Version
+view_admin_systemSettings_serverDetails_installDir = Server Installation Directory
+view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
+view_admin_systemSettings_serverDetails_time = Server Local Time
+view_admin_systemSettings_serverDetails_tz = Server Time Zone
+view_admin_topology = トポロジー
+view_alert_common_tab_conditions = Conditions
+view_alert_common_tab_conditions_expression = Fire alert when
+view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
+view_alert_common_tab_conditions_modal_title = 条件追加
+view_alert_common_tab_conditions_recovery_disabled = This alert caused its alert definition to be disabled
+view_alert_common_tab_conditions_recovery_enabled = Triggered ''{0}'' to be re-enabled
+view_alert_common_tab_conditions_text = Condition
+view_alert_common_tab_conditions_type_availability = Availability Change
+view_alert_common_tab_conditions_type_availability_down = Went down
+view_alert_common_tab_conditions_type_availability_up = Came up
+view_alert_common_tab_conditions_type_event = Event Detection
+view_alert_common_tab_conditions_type_event_matching = with event source matching
+view_alert_common_tab_conditions_type_metric_baseline = Metric Value Baseline
+view_alert_common_tab_conditions_type_metric_baseline_verb = of
+view_alert_common_tab_conditions_type_metric_calltime_change = Call Time Value Changes
+view_alert_common_tab_conditions_type_metric_calltime_change_verb = by at least
+view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Grows
+view_alert_common_tab_conditions_type_metric_calltime_delta_other = Changes
+view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
+view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
+view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
+view_alert_common_tab_conditions_type_metric_change = Metric Value Change
+view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
+view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
+view_alert_common_tab_conditions_type_operation = Operation Execution
+view_alert_common_tab_conditions_type_operation_status = with result status
+view_alert_common_tab_conditions_type_resource_configuration = Resource Configuration Change
+view_alert_common_tab_conditions_value = Value
+view_alert_common_tab_dampening = Dampening
+view_alert_common_tab_dampening_category_consecutive_count = Consecutive
+view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
+view_alert_common_tab_dampening_category_duration_count = Time Period
+view_alert_common_tab_dampening_category_duration_count_tooltip = An alert is triggered once every X occurrences the condition set is true within a given time period.
+view_alert_common_tab_dampening_category_none = None
+view_alert_common_tab_dampening_category_none_tooltip = Dampening is disabled. Every time the condition set is true, an alert will be triggered.
+view_alert_common_tab_dampening_category_partial_count = Last N Evaluations
+view_alert_common_tab_dampening_category_partial_count_tooltip = An alert is triggered once every X occurrences the condition set is true during the last N evaluations of the condition set.
+view_alert_common_tab_dampening_consecutive_occurrences_label = Occurrences
+view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = The number of times the condition set must be consecutively true before the alert is triggered
+view_alert_common_tab_dampening_duration_occurrences_label = Occurrences
+view_alert_common_tab_dampening_duration_occurrences_label_tooltip = The number of times the condition set must be true during the given time period before the alert is triggered.
+view_alert_common_tab_dampening_duration_period_label = Time Period
+view_alert_common_tab_dampening_duration_period_label_tooltip = The time span in which the condition set will be tested to see if the given number of occurrences are true.
+view_alert_common_tab_dampening_partial_evalatuions_label = Evaluations
+view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = The total number of times the condition set will be tested to see if the given number of occurrences are true.
+view_alert_common_tab_dampening_partial_occurrences_label = Occurrences
+view_alert_common_tab_dampening_partial_occurrences_label_tooltip = The number of times the condition set must be true during the last N evaluations before the alert is triggered.
+view_alert_common_tab_general = General Properties
+view_alert_common_tab_invalid_condition_category = Invalid condition category - please report this as a bug: {0}
+view_alert_common_tab_invalid_dampening_category = Invalid dampening category - please report this as a bug: {0}
+view_alert_common_tab_invalid_time_units = Invalid time units - please report this as a bug: {0}
+view_alert_common_tab_notifications = Notifications
+view_alert_common_tab_notifications_message = Message
+view_alert_common_tab_notifications_sender = Sender
+view_alert_common_tab_notifications_status = Status
+view_alert_common_tab_recovery = Recovery
+view_alert_definition_condition_editor_avilability_option_down = Goes down
+view_alert_definition_condition_editor_avilability_option_up = Comes up
+view_alert_definition_condition_editor_avilability_tooltip = Specify the availability state change that will trigger the condition.
+view_alert_definition_condition_editor_avilability_value = Availability
+view_alert_definition_condition_editor_common_avg = Average
+view_alert_definition_condition_editor_common_max = Maximum
+view_alert_definition_condition_editor_common_min = Minimum
+view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+view_alert_definition_condition_editor_event_regex = Regular Expression
+view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
+view_alert_definition_condition_editor_event_severity = Event Severity
+view_alert_definition_condition_editor_event_severity_debug = Debug
+view_alert_definition_condition_editor_event_severity_error = Error
+view_alert_definition_condition_editor_event_severity_fatal = Fatal
+view_alert_definition_condition_editor_event_severity_info = Info
+view_alert_definition_condition_editor_event_severity_warn = Warn
+view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
+view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
+view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
+view_alert_definition_condition_editor_metric_baseline_tooltip = Specify the baseline value that must be violated to trigger the condition. The value you specify is a percentage of the given baseline value.
+view_alert_definition_condition_editor_metric_baseline_value = Baseline
+view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentage Change
+view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = A collected calltime value will trigger this condition when it differs by at least this percentage of the selected calltime limit value
+view_alert_definition_condition_editor_metric_calltime_change_tooltip = Specify the calltime value that, when changed at least a specified amount, triggers the condition. You must specify which calltime limit to check (minimum, maximum or average calltime value) and the percentage of change that must occur.
+view_alert_definition_condition_editor_metric_calltime_common_comparator = Comparator
+view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Changes
+view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Grows
+view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Shrinks
+view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = How a collected calltime value should be compared to the given calltime limit
+view_alert_definition_condition_editor_metric_calltime_common_limit = Call Time Limit
+view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = The calltime limit value that is to be compared with the given value
+view_alert_definition_condition_editor_metric_calltime_common_name = Call Time Metric
+view_alert_definition_condition_editor_metric_calltime_common_regex = Regular Expression
+view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = If specified, this is a regular expression that must match a call destination in order to trigger the condition.
+view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Specify the calltime threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier. You also must specify which calltime limit to compare the value with (minimum, maximum or average calltime value).
+view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Time Value
+view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
+view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
+view_alert_definition_condition_editor_metric_threshold_comparator_equal = Equal to
+view_alert_definition_condition_editor_metric_threshold_comparator_greater = Greater Than
+view_alert_definition_condition_editor_metric_threshold_comparator_less = Less than
+view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = How a collected metric value should be compared to the given threshold value
+view_alert_definition_condition_editor_metric_threshold_name = Metric
+view_alert_definition_condition_editor_metric_threshold_tooltip = Specify the threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier.
+view_alert_definition_condition_editor_metric_threshold_value = Metric Value
+view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
+view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_trait_change_value = Trait
+view_alert_definition_condition_editor_operation_status = オペレーションステータス
+view_alert_definition_condition_editor_operation_status_canceled = キャンセル済
+view_alert_definition_condition_editor_operation_status_failure = 失敗
+view_alert_definition_condition_editor_operation_status_inprogress = 処理中
+view_alert_definition_condition_editor_operation_status_success = 成功
+view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
+view_alert_definition_condition_editor_operation_value = オペレーション
+view_alert_definition_condition_editor_option_availability = Availability Change
+view_alert_definition_condition_editor_option_event = Event Detection
+view_alert_definition_condition_editor_option_label = Condition Type
+view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
+view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
+view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
+view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
+view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
+view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
+view_alert_definition_condition_editor_option_operation = Operation Execution
+view_alert_definition_condition_editor_option_resource_configuration = Resource Configuration Change
+view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
+view_alert_definition_for_group = View Group Definition
+view_alert_definition_for_type = View Template
+view_alert_definition_notification_cliScript_editor_anotherUser = Another User
+view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
+view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
+view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
+view_alert_definition_notification_cliScript_editor_repository = Repository
+view_alert_definition_notification_cliScript_editor_script = Script
+view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
+view_alert_definition_notification_cliScript_editor_selectRepoFirst = Select a repository first.
+view_alert_definition_notification_cliScript_editor_thisUser = Myself
+view_alert_definition_notification_cliScript_editor_uploadNewScript = Upload New Script
+view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
+view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
+view_alert_definition_notification_editor_delete_confirm = Are you sure you want to delete the selected alert notifications?
+view_alert_definition_notification_editor_field_configuration = Configuration
+view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
+view_alert_definition_notification_editor_field_configuration_not_loaded = Unknown
+view_alert_definition_notification_editor_field_sender = Sender
+view_alert_definition_notification_editor_loadFailed = Cannot get alert senders
+view_alert_definition_notification_editor_loadFailed_single = Cannot get alert sender configuration definition
+view_alert_definition_notification_editor_none_available = No alert senders available
+view_alert_definition_notification_editor_saveFailed = Cannot save the notification configuration
+view_alert_definition_notification_editor_sender = Notification Sender
+view_alert_definition_notification_editor_title_add = 通知の追加
+view_alert_definition_notification_editor_title_edit = 通知の編集
+view_alert_definition_notification_operation_editor_common_operation = Operation
+view_alert_definition_notification_operation_editor_mode_relative = Relative Resource
+view_alert_definition_notification_operation_editor_mode_specific = Specific Resource
+view_alert_definition_notification_operation_editor_mode_this = This Resource
+view_alert_definition_notification_operation_editor_mode_title = リソース選択モード
+view_alert_definition_notification_operation_editor_mode_unknown = UNKNOWN OPTION - THIS IS A BUG
+view_alert_definition_notification_operation_editor_operations_loadFailed = Failed to load the list of available operations
+view_alert_definition_notification_operation_editor_operations_no_parameters = This operation does not take any parameters
+view_alert_definition_notification_operation_editor_relative_ancestor = Start Search From
+view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = Cannot get type ancestry
+view_alert_definition_notification_operation_editor_relative_ancestor_root = Root Ancestor Type
+view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Select the top of the type hierarchy from which to search its descendant tree for the Filter By type
+view_alert_definition_notification_operation_editor_relative_descendant = Then Filter By
+view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = A specific name to uniquely identify a resource when more than one resource of the selected type might exist. This is optional if there will only ever be one resource of the resource type in the selected type hierarchy.
+view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = Cannot get type descendants
+view_alert_definition_notification_operation_editor_relative_descendant_tooltip = The resource type to search for under the root type defined in the Start Search From selection.
+view_alert_definition_notification_operation_editor_specific_pick_button = Pick
+view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Please pick a resource
+view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Please pick a resource that has one or more operations
+view_alert_definition_notification_operation_editor_specific_pick_text = Pick a resource...
+view_alert_definition_notification_operation_editor_specific_resource = Resource
+view_alert_definition_notification_role_editor_loadFailed = Cannot determine current roles - starting empty
+view_alert_definition_notification_role_editor_restoreFailed = Cannot use current roles - starting empty
+view_alert_definition_notification_role_editor_saveFailed = Cannot save the selected roles
+view_alert_definition_notification_user_editor_loadFailed = Cannot determine current users - starting empty
+view_alert_definition_notification_user_editor_restoreFailed = Cannot use current users - starting empty
+view_alert_definition_notification_user_editor_saveFailed = Cannot save the selected users
+view_alert_definition_recovery_editor_disable_when_fired = Disable When Fired
+view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indicates if this alert will be disabled after it fires. Once disabled, the alert can be manually re-enabled or a recovery alert can be set up to automatically re-enable it. If this alert is a recovery alert itself, this setting cannot be turned on.
+view_alert_definition_recovery_editor_loadFailed = Cannot build recovery menu
+view_alert_definition_recovery_editor_none_available = None
+view_alert_definition_recovery_editor_recovery_alert = Recover Alert
+view_alert_definition_recovery_editor_recovery_alert_tooltip = The target alert that will be recovered (i.e. re-enabled) after this alert triggers. Do not select an alert here if you are not defining a recovery alert.
+view_alert_definitions_create_failure = Alert definition creation failed
+view_alert_definitions_create_success = Alert definition successfully created
+view_alert_definitions_delete_confirm = Delete the selected alert definition(s)?
+view_alert_definitions_delete_failure = Failed to deleted the selected alert definitions
+view_alert_definitions_delete_success = Successfully deleted {0} alert definitions
+view_alert_definitions_disable_confirm = Disable the selected alert definition(s)?
+view_alert_definitions_disable_failure = Failed to disable the selected alert definitions
+view_alert_definitions_disable_success = Successfully disabled {0} alert definitions
+view_alert_definitions_enable_confirm = Enable the selected alert definition(s)?
+view_alert_definitions_enable_failure = Failed to enable the selected alert definitions
+view_alert_definitions_enable_success = Successfully enabled {0} alert definitions
+view_alert_definitions_loadFailed = Failed to fetch alert definition data
+view_alert_definitions_loadFailed_single = Failed to fetch data for alert definition with id {0}
+view_alert_definitions_table_title_group = グループアラート定義
+view_alert_definitions_table_title_resource = リソースアラート定義
+view_alert_definitions_update_failure = Alert definition update failed
+view_alert_definitions_update_success = Alert definition successfully updated
+view_alert_details_field_ack_at = Acknowledged at
+view_alert_details_field_ack_by = Acknowledged by
+view_alert_details_field_recovery_info = Recovery Info
+view_alert_details_loadFailed = Failed to fetch alert details
+view_alerts_ack_confirm = Acknowledge the selected alert(s)?
+view_alerts_ack_confirm_all = Acknowledge all alerts from this source?
+view_alerts_ack_failure = Failed to acknowledge alerts with id''s: {0}
+view_alerts_ack_failure_all = Failed to acknowledge all alerts from this source
+view_alerts_ack_success = Successfully acknowledged {0} alerts
+view_alerts_delete_confirm = Delete the selected alert(s)?
+view_alerts_delete_confirm_all = Delete all alerts from this source?
+view_alerts_delete_failure = Failed to delete alerts with id''s: {0}
+view_alerts_delete_failure_all = Failed to delete all alerts from this source
+view_alerts_delete_success = Successfully deleted {0} alerts
+view_alerts_field_ack_status = ステータス
+view_alerts_field_ack_status_ack = 確認 ({0})
+view_alerts_field_ack_status_ackHover = Acknowledged by {0} at {1}
+view_alerts_field_ack_status_noAck = 未確認
+view_alerts_field_ack_status_noAckHover = Not yet Acknowledged
+view_alerts_field_ack_subject = 確認サブジェクト
+view_alerts_field_ack_time = 確認時刻
+view_alerts_field_condition_text = 条件テキスト
+view_alerts_field_condition_text_many = Multiple Conditions
+view_alerts_field_condition_text_none = No Conditions
+view_alerts_field_condition_value = Condition Value
+view_alerts_field_created_time = 生成時刻
+view_alerts_field_enabled = 有効
+view_alerts_field_modified_time = 修正時刻
+view_alerts_field_name = 名前
+view_alerts_field_parent = 親
+view_alerts_field_priority = 優先度
+view_alerts_field_protected = Protected
+view_alerts_field_protected_tooltip = If true, this definition is protected from being changed by the parent definition. In other words, the parent definition settings will not override this definition.
+view_alerts_loadFailed = Failed to fetch alerts data
+view_alerts_table_filter_priority = 優先度フィルター
+view_alerts_table_title_group = グループアラート履歴
+view_alerts_table_title_resource = リソースアラート履歴
+view_autoDiscoveryQ_committed = コミット済み
+view_autoDiscoveryQ_confirmSelect = Also select the platform children?
+view_autoDiscoveryQ_deleted = 削除済み
+view_autoDiscoveryQ_field_discoveryTime = Discovery Time
+view_autoDiscoveryQ_field_inventoryStatus = Inventory Status
+view_autoDiscoveryQ_field_key = Resource Key
+view_autoDiscoveryQ_field_name = Resource Name
+view_autoDiscoveryQ_field_parentId = Parent ID
+view_autoDiscoveryQ_ignore = 無視
+view_autoDiscoveryQ_ignoreFailure = Failed to ignore resources
+view_autoDiscoveryQ_ignoreSuccessful = You have successfully ignored the selected resources.
+view_autoDiscoveryQ_ignored = 無視済み
+view_autoDiscoveryQ_import = インポート
+view_autoDiscoveryQ_importFailure = Failed to import resources
+view_autoDiscoveryQ_importSuccessful = You have successfully imported the selected resources.
+view_autoDiscoveryQ_loadFailure = Failed to load the inventory discovery queue
+view_autoDiscoveryQ_new = 新規
+view_autoDiscoveryQ_newAndIgnored = 新規かつ無視済み
+view_autoDiscoveryQ_noItems = No items to show
+view_autoDiscoveryQ_noperm = (You are not authorized to view the auto-discovery queue)
+view_autoDiscoveryQ_showStatus = Show
+view_autoDiscoveryQ_title = 自動リカバリキュー
+view_autoDiscoveryQ_unignore = 無視をしない
+view_autoDiscoveryQ_unignoreFailure = Failed to unignore resources
+view_autoDiscoveryQ_unignoreSuccessful = You have successfully unignored the selected resources.
+view_autoDiscoveryQ_uninventoried = インベントリ登録をしない
+view_bundleVersion_loadFailure = Failed to load bundle version data
+view_bundle_bundle = バンドル
+view_bundle_bundleDeployment = Bundle Deployment
+view_bundle_bundleDeployments = Bundle Deployments
+view_bundle_bundleDestinations = Bundle Destinations
+view_bundle_bundleFiles = Bundle Files
+view_bundle_bundleType = Bundle Type
+view_bundle_bundleVersion = Bundle Version
+view_bundle_bundleVersions = Bundle Versions
+view_bundle_bundles = バンドル
+view_bundle_createWizard_bundleDistro = Bundle Distribution
+view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database
+view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
+view_bundle_createWizard_clickToUploadRecipe = Click to load a recipe file
+view_bundle_createWizard_createFailure = Failed to create the bundle
+view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]
+view_bundle_createWizard_enterRecipe = Please supply a valid recipe
+view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
+view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file
+view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file
+view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server
+view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle
+view_bundle_createWizard_noBundleTypesAvail = No bundle types are available
+view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments
+view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
+view_bundle_createWizard_recipeOption = Recipe
+view_bundle_createWizard_title = バンドル生成
+view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files
+view_bundle_createWizard_uploadOption = Upload
+view_bundle_createWizard_uploadStepName = Upload Bundle Files
+view_bundle_createWizard_urlOption = URL
+view_bundle_createWizard_windowTitle = Bundle Creation Wizard
+view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
+view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted.
+view_bundle_deploy = Deploy
+view_bundle_deployDir = Deploy Directory
+view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms
+view_bundle_deployWizard_deploying = Deploying...
+view_bundle_deployWizard_deploymentCreated = Created Deployment...
+view_bundle_deployWizard_deploymentCreatedDetail = You have created the deployment [{0}] with the description [{1}]
+view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
+view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!
+view_bundle_deployWizard_deploymentScheduledDetail = You have scheduled the bundle deployment [{0}] to the destination group [{1}]
+view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
+view_bundle_deployWizard_destinationCreatedDetail = You have created the destination [{0}] with the description [{1}]
+view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
+view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel
+view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)
+view_bundle_deployWizard_error_11 = Failed to find defined deployments.
+view_bundle_deployWizard_error_12 = Failed to find defined bundles.
+view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel
+view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!
+view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}
+view_bundle_deployWizard_error_5 = Failed to Create Deployment!
+view_bundle_deployWizard_error_6 = Failed to create deployment: {0}
+view_bundle_deployWizard_error_7 = Failed to get deployment name.
+view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
+view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
+view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
+view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
+view_bundle_deployWizard_getDestStep = New Destination
+view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
+view_bundle_deployWizard_getDest_desc = Destination Description
+view_bundle_deployWizard_getDest_name = Destination Name
+view_bundle_deployWizard_getInfoStep = Provide Deployment Information
+view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
+view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description
+view_bundle_deployWizard_getInfo_deploymentName = Deployment Name
+view_bundle_deployWizard_getOptionsStep = Deploy Options
+view_bundle_deployWizard_getOptions_deployLater = Deploy Later
+view_bundle_deployWizard_getOptions_deployNow = Deploy Now
+view_bundle_deployWizard_getOptions_deployTime = Deployment Time
+view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle
+view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.
+view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version
+view_bundle_deployWizard_selectVersion_latest = Latest Version [{0}]
+view_bundle_deployWizard_selectVersion_live = Live Version [{0}]
+view_bundle_deployWizard_selectVersion_select = Select Version from List:
+view_bundle_deployWizard_title = バンドルデプロイウィザード
+view_bundle_deploy_action = Action
+view_bundle_deploy_backButton = Back to Destination
+view_bundle_deploy_clickForError = Click the icon for the error message
+view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
+view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
+view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
+view_bundle_deploy_deployedBy = Deployed By
+view_bundle_deploy_deploymentPlatforms = Deployment Platforms
+view_bundle_deploy_installDetails = Install Details
+view_bundle_deploy_loadBundleFailure = Failed to find bundle
+view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
+view_bundle_deploy_loadFailure = Failed to load bundle deployment
+view_bundle_deploy_name = Deployment Name
+view_bundle_deploy_operatingSystem = Operating System
+view_bundle_deploy_selectARow = Select a row to show installation details
+view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
+view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
+view_bundle_deploy_time = Deployment Time
+view_bundle_deployed = Deployed
+view_bundle_deployments = Deployments
+view_bundle_dest_backToBundle = Back to Bundle
+view_bundle_dest_created = Created
+view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
+view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
+view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
+view_bundle_dest_deployDir = Deploy Directory
+view_bundle_dest_group = Group
+view_bundle_dest_lastDeployedVersion = Last Deployed Version
+view_bundle_dest_lastDeploymentDate = Last Deployment Date
+view_bundle_dest_lastDeploymentStatus = Last Deployment Status
+view_bundle_dest_loadFailure = Failed to load bundle destinations
+view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information
+view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
+view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
+view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
+view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
+view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
+view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
+view_bundle_destinations = Destinations
+view_bundle_fileListView_fileSize = File Size
+view_bundle_fileListView_loadFailure = Failed to load bundle file data
+view_bundle_fileListView_md5 = MD5
+view_bundle_fileListView_sha256 = SHA256
+view_bundle_files = Files
+view_bundle_latestVersion = 最新バージョン
+view_bundle_list_backToAll = Back to All Bundles
+view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
+view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
+view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
+view_bundle_list_deletesFailure = Failed to delete the bundles
+view_bundle_list_deletesSuccessful = You successfully deleted the bundles
+view_bundle_list_destinationsCount = Destinations Count
+view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
+view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
+view_bundle_list_error3 = Failed to load bundle
+view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]
+view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data
+view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]
+view_bundle_list_tagUpdateFailure = Failed to update bundle tags
+view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
+view_bundle_list_versionsCount = Versions Count
+view_bundle_purge = Purge
+view_bundle_recipe = Recipe
+view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
+view_bundle_revert = Revert
+view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...
+view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
+view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
+view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation
+view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
+view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
+view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
+view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
+view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment
+view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
+view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
+view_bundle_revertWizard_getInfoStep_name = Provide Revert Information
+view_bundle_revertWizard_getInfoStep_revertDeployDesc = Revert Deploy Description
+view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\n{0}\n\n[REVERT To]\n{1}
+view_bundle_revertWizard_getInfoStep_revertDeployName = Revert Deploy Name
+view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms
+view_bundle_revertWizard_revertStep_reverting = Reverting...
+view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!
+view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]
+view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!
+view_bundle_revertWizard_title = バンドル取り消し
+view_bundle_revertWizard_windowTitle = バンドル取り消しウィザード
+view_bundle_tree_loadFailure = Failed to load bundle data
+view_bundle_version_backToBundle = Back to Bundle
+view_bundle_version_bundleVersionTagUpdateFailure = Failed to update bundle version tags
+view_bundle_version_bundleVersionTagUpdateSuccessful = You have successfully updated the bundle version tags
+view_bundle_version_deleteConfirm = Are you sure you want to delete this bundle version?
+view_bundle_version_deleteFailure = Failed to delete the bundle version [{0}]
+view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
+view_bundle_version_loadFailure = Failed to load bundle version
+view_bundle_versions = バージョン
+view_configCompare_comparingConfigs = Comparing Configurations
+view_configCompare_configCompare = Configuration Comparison
+view_configEdit_addItem = Add Item to List
+view_configEdit_confirm_1 = Are you sure you want to delete the selected properties from the set?
+view_configEdit_confirm_2 = Are you sure you want to delete this row?
+view_configEdit_confirm_3 = Are you sure you want to delete the [{0}] selected [{1}]?
+view_configEdit_editRow = Edit Row
+view_configEdit_enterPropName = Enter the name of the property to be added.
+view_configEdit_error_1 = Configuration is not supported by this Resource.
+view_configEdit_error_2 = Connection settings are not supported by this Resource.
+view_configEdit_error_3 = Cannot add property named [{0}]. The property name is already used in the set.
+view_configEdit_files = Files
+view_configEdit_hideAll = Hide All
+view_configEdit_jumpToSection = セクションへのジャンプ
+view_configEdit_msg_1 = Added property [{0}] to the set.
+view_configEdit_msg_2 = Removed properties from the set.
+view_configEdit_msg_3 = [{0} {1}] deleted from list.
+view_configEdit_msg_4 = Item added to list.
+view_configEdit_properties = Properties
+view_configEdit_tooltip_1 = Delete the selected items from the list.
+view_configEdit_tooltip_2 = Add an item to the list.
+view_configEdit_viewRow = View Row
+view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.
+view_configurationDetails_configNotUpdatedDueToNoChange = Configuration was not updated, since the new configuration is equivalent to the current configuration.
+view_configurationDetails_error_updateFailure = Failed to update configuration.
+view_configurationDetails_messageConcise = Configuration updated - current version is {0}.
+view_configurationDetails_messageDetailed = Configuration updated to version {0} for Resource [{1}].
+view_configurationDetails_noPermission = You do not have permission to edit this Resource''s configuration.
+view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.
+view_configurationHistoryDetails_error_loadFailure = Unable to load configuration history.
+view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
+view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. You must purge that parent group history item before you can delete its individual resource history items.
+view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
+view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
+view_configurationHistoryList_rollback = Rollback
+view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
+view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
+view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
+view_configurationHistoryList_table_statusFailure = This configuration update failed
+view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
+view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
+view_configurationHistoryList_table_statusSuccess = This configuration update was successful
+view_configurationHistoryList_title = 構成履歴
+view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.
+view_connectionSettingsDetails_error_updateFailure = Failed to update connection settings.
+##view_connectionSettingsDetails_messageConcise_updateSuccess = Connection settings update initiated.
+##view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settings update initiated for Resource [{0}].\n
+view_connectionSettingsDetails_noPermission = You do not have permission to edit this Resource''s connection settings.
+view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.
+view_core_error_1 = New Alerts lookup failed
+view_core_loggedOut = Logged out
+view_core_noRecentAlerts = There are no recent alerts to report
+view_core_recentAlerts = There are [{0}] recent alerts - click to go to the recent alerts report
+view_core_uncaught = グローバルにキャッチされない例外
+view_dashboardManager_deleteFail = Failed to delete dashboard.
+view_dashboardManager_deleted = Successfully deleted dashboard {0}
+view_dashboardManager_error = Failed to save dashboard to server
+view_dashboardManager_saved = Saved dashboard {0} to server
+view_dashboardManager_success = Saved dashboard
+view_dashboard_favorites_error1 = Failed to load favorite Resources.
+view_dashboardsManager_error1 = Failed to add new dashboard
+view_dashboardsManager_message_title_details = <h1>RHQへようこそ2</h1>\n<p>RHQプロジェクトは抽象化されたプラグインベースのシステム管理スイートで、複数のプロダクトやプラットフォームに対してコア機能を横断的に適用できる拡張可能で、統合化されたシステム管理を提供します。このプロジェクトはレイヤ化されたモジュールによって設計されていて、デプロイのための柔軟なアーキテクチャを提供します。それは企業全体に対する監査と履歴の管理を提供するコアとなるユーザーインタフェースを導入します。サーバー/エージェントアーキテクチャはリモートでの管理と特定プロダクトのサポートを実現するプラグインを提供します。 </p>\n <p>このデフォルトのダッシュボードは上の「編集モード」ボタンをすることで編集可能です。</p>
+view_dashboards_confirm1 = Are you sure you want to delete
+view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh
+view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh
+view_dashboards_portlets_refresh_multiple_min = {0} minutes
+view_dashboards_portlets_refresh_none = No Refresh
+view_dashboards_portlets_refresh_one_min = 1 minute
+view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
+view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
+view_dashboards_title = ダッシュボード
+view_dynagroup_children = DynaGroup Children
+view_dynagroup_compatible = Compatible
+view_dynagroup_definitionAlreadyExists = A group definition already exists with this name
+view_dynagroup_definitionCreated = You have successfully created a group definition named [{0}]
+view_dynagroup_definitionLoadFailure = Failed to load group definitions
+view_dynagroup_definitions = DynaGroup Definitions
+view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions
+view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions
+view_dynagroup_editing = Editing [{0}]
+view_dynagroup_exprBuilder_addExpression = Add Expression
+view_dynagroup_exprBuilder_comparisonType = Comparison Type
+view_dynagroup_exprBuilder_comparisonType_contains = contains
+view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
+view_dynagroup_exprBuilder_comparisonType_equals = equals
+view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
+view_dynagroup_exprBuilder_comparisonType_tooltip = Comparison Type
+view_dynagroup_exprBuilder_definingPlugin = Defining Plugin
+view_dynagroup_exprBuilder_definingPlugin_tooltip = The plugin to search
+view_dynagroup_exprBuilder_expression = Expression
+view_dynagroup_exprBuilder_expressionType = Expression Type
+view_dynagroup_exprBuilder_expressionType_pluginConfig = Plugin Configuration
+view_dynagroup_exprBuilder_expressionType_resource = Resource
+view_dynagroup_exprBuilder_expressionType_resourceCategory = Resource Category
+view_dynagroup_exprBuilder_expressionType_resourceConfig = Resource Configuration
+view_dynagroup_exprBuilder_expressionType_resourceType = Resource Type
+view_dynagroup_exprBuilder_expressionType_tooltip = The type of property this expression switches on:<br/> <b>Resource</b>: A resource property such as its name or version<br/> <b>Resource Type</b>: Search for resources of a specific type<br/> <b>Resource Category</b>: Search for resources by category: platform, server, service<br/> <b>Trait</b>: Resources that have selected values for a monitored trait<br/> <b>Plugin Configuration</b>: Search by the plugin component configuration setting of the component<br/> <b>Resource Configuration</b>: Search by the configuration setting of the managed resource
+view_dynagroup_exprBuilder_expressionType_trait = Trait
+view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
+view_dynagroup_exprBuilder_groupBy = Group by
+view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
+view_dynagroup_exprBuilder_noPlugins = --No plugins--
+view_dynagroup_exprBuilder_noProperties = --No properties--
+view_dynagroup_exprBuilder_noResourceTypes = --No resource types--
+view_dynagroup_exprBuilder_pluginLoadFailure = Cannot get the list of plugins
+view_dynagroup_exprBuilder_propLoadFailure = Cannot get list of properties
+view_dynagroup_exprBuilder_propertyName = Property Name
+view_dynagroup_exprBuilder_propertyName_tooltip = The name of the property to query. This is defined by the expression type as well as the resource type.
+view_dynagroup_exprBuilder_resTypeLoadFailure = Cannot get list of resource types for plugin [{0}]
+view_dynagroup_exprBuilder_resource = Resource
+view_dynagroup_exprBuilder_resourceType = Resource Type
+view_dynagroup_exprBuilder_resourceType_tooltip = The type of resource
+view_dynagroup_exprBuilder_resource_child = Child
+view_dynagroup_exprBuilder_resource_grandparent = Grandparent
+view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
+view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
+view_dynagroup_exprBuilder_resource_parent = Parent
+view_dynagroup_exprBuilder_resource_resource = Resource
+view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
+view_dynagroup_exprBuilder_title = Expression Builder
+view_dynagroup_exprBuilder_unset = Unset
+view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
+view_dynagroup_exprBuilder_value_tooltip = The string value for the expression to query
+view_dynagroup_expression = Expression
+view_dynagroup_expressionBuilderIconTooltip = Expression Builder...
+view_dynagroup_expressionSet = Expression Set
+view_dynagroup_lastCalculationTime = Last Calculation Time
+view_dynagroup_loadDefinitionFailure = Failed to load group definition [{0}]
+view_dynagroup_loadDefinitionMissing = There is no group definition with the ID of [{0}]
+view_dynagroup_mixed = Mixed
+view_dynagroup_newGroupDefinition = New Group Definition
+view_dynagroup_nextCalculationTime = Next Calculation Time
+view_dynagroup_permDenied = You do not have permission to view group definitions
+view_dynagroup_recalcFailure = Failed to recalculated this group definition
+view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions
+view_dynagroup_recalcSuccessful = You have successfully recalculated this group definition
+view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions
+view_dynagroup_recalculate = Recalculate
+view_dynagroup_recalculationInterval = Recalculation Interval (ms)
+view_dynagroup_recursive = Recursive
+view_dynagroup_saveAndRecalculate = Save & Recalculate
+view_dynagroup_saveFailure = Failed to save the group definition named [{0}]
+view_dynagroup_saveSuccessful = You have successfully saved the group definition named [{0}]
+view_dynagroup_singleSaveFailure = An error occurred - there should have been one created, but instead there were [{0}] created
+view_dynagroup_template_customExpression = Custom Expression...
+view_dynagroup_template_downedResources = All resources currently down
+view_dynagroup_template_jbossas4_clusters = JBossAS 4 - Clusters
+view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
+view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
+view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
+view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
+view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - Clusters
+view_dynagroup_template_platforms = Platform resources in inventory
+view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
+view_groupConfigEdit_member = Member
+view_groupConfigEdit_noListProps = List properties are not currently supported for group configurations.
+view_groupConfigEdit_setAll = Set all values to:
+view_groupConfigEdit_tooltip_1 = Member values differ - click icon to edit them.
+view_groupConfigEdit_unset = Unset
+view_groupConfigEdit_valsDiff = member values differ
+view_groupConfigEdit_valsDiffForProp = Member Values for Property [{0}]
+view_groupCreateWizard_createFailure = Failed to create the resource group
+view_groupCreateWizard_createStepName = Group Settings
+view_groupCreateWizard_createStep_recursive = Recursive
+view_groupCreateWizard_createSuccessful_concise = You have created a new resource group. [<a href="{0}">View Group</a>]
+view_groupCreateWizard_createSuccessful_full = You have created a new [{0}] resource group with the name [{1}] that contains [{2}] member resources
+view_groupCreateWizard_membersStepName = Select Members
+view_groupCreateWizard_title = グループ生成
+view_groupCreateWizard_windowTitle = グループ生成
+view_groupInventoryMembers_button_updateMembership = Update Membership...
+view_groupInventoryMembers_title_updateMembership = Update Membership
+view_group_detail_failLoad = Failed to load group for group with ID [{0}]
+view_group_detail_failLoadComp = Failed to load group composite for group with ID [{0}]
+view_group_detail_failRecursiveChange = Failed to update the recursive setting for group [{0}]
+view_group_detail_recursiveChange = You successfully changed the recursive setting for group [{0}]
+view_group_inventory_activity_no_recent_metrics = This group has no recent metrics
+view_group_meas_schedules_title = Group Metric Collection Schedules
+view_group_membership_failFetch = Failed to fetch Resource Group
+view_group_membership_saveFailure = Failed to update membership of group [{0}]
+view_group_membership_saveSuccessful = You have updated the membership of group [{0}]
+view_group_operationScheduleDetails_failedToLoadMembers = Failed to load group member Resources.
+view_group_operationScheduleDetails_field_execute = Execute
+view_group_operationScheduleDetails_field_haltOnFailure = Halt on Failure?
+view_group_operationScheduleDetails_memberResource = Member Resource
+view_group_operationScheduleDetails_value_parallel = in parallel
+view_group_operationScheduleDetails_value_sequential = in the order specified below (drag and drop member Resources to change order)
+view_group_pluginConfig_edit_currentGroupProperties = Current Group Properties
+view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]
+view_group_pluginConfig_edit_noperm = You do not have permission to edit this group connection settings
+view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]
+view_group_pluginConfig_edit_saveInitiated_concise = The group connection setting updates have been initiated
+view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]
+view_group_pluginConfig_edit_saveTooltip = Update the connection settings of all group members
+view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved
+view_group_pluginConfig_members_fetchFailure = Failed to get plugin config update history for members of group [{0}]
+view_group_pluginConfig_members_fetchFailureConn = Failed to retrieve member connection settings for [{0}]
+view_group_pluginConfig_members_fetchFailureConnInProgress = A group plugin configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
+view_group_pluginConfig_members_statusDetails = Status Details
+view_group_pluginConfig_members_statusFailure = This configuration update failed for an unknown reason
+view_group_pluginConfig_members_statusInprogress = This configuration update is still in progress
+view_group_pluginConfig_members_statusNochange = No changes were made to this configuration
+view_group_pluginConfig_members_statusSuccess = This configuration update was successful
+view_group_pluginConfig_members_title = Group Connection Settings Member Histories
+view_group_pluginConfig_table_clickStatusIcon = Click the status icon for full details
+view_group_pluginConfig_table_deleteFailure = Failed to delete group plugin config history
+view_group_pluginConfig_table_deleteSuccessful = You have deleted [{0}] history items
+view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
+view_group_pluginConfig_table_msg1 = View Member History for status of each individual resource
+view_group_pluginConfig_table_statusDetails = Status Details
+view_group_pluginConfig_table_statusFailure = This group configuration update failed
+view_group_pluginConfig_table_statusInprogress = This group configuration update is still in progress
+view_group_pluginConfig_table_statusNochange = No changes were made to this group configuration
+view_group_pluginConfig_table_statusSuccess = This group configuration update was successful
+view_group_pluginConfig_table_title = Group Connection Settings History
+view_group_pluginConfig_table_viewMemberHistory = View Member History
+view_group_pluginConfig_table_viewSettings = View Settings
+view_group_pluginConfig_view_groupProperties = Group Properties
+view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings
+view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]
+view_group_resConfig_edit_loadFail = Failed to retrieve member Resource configurations for [{0}]
+view_group_resConfig_edit_noperm = You do not have permission to edit this group configuration
+view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for [{0}] compatible group named [{1}]
+view_group_resConfig_edit_saveInitiated_concise = The group configuration updates have been initiated
+view_group_resConfig_edit_saveInitiated_full = The group configuration updates have been initiated for the [{0}] compatible group named [{1}]
+view_group_resConfig_edit_saveTooltip = Update the configurations of all group members
+view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved
+view_group_resConfig_members_fetchFailure = Failed to get resource config update history for members of group [{0}]
+view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource configuration settings for [{0}]
+view_group_resConfig_members_fetchFailureConfigInProgress = A group resource configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
+view_group_resConfig_members_statusDetails = Status Details
+view_group_resConfig_members_statusFailure = This configuration update failed for an unknown reason
+view_group_resConfig_members_statusInprogress = This configuration update is still in progress
+view_group_resConfig_members_statusNochange = No changes were made to this configuration
+view_group_resConfig_members_statusSuccess = This configuration update was successful
+view_group_resConfig_members_title = Group Resource Configuration Member Histories
+view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
+view_group_resConfig_table_deleteFailure = Failed to delete group resource config history
+view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
+view_group_resConfig_table_failFetch = Failed to get group resource config history
+view_group_resConfig_table_msg1 = View Member History for status of each individual resource
+view_group_resConfig_table_statusDetails = Status Details
+view_group_resConfig_table_statusFailure = This group configuration update failed
+view_group_resConfig_table_statusInprogress = This group configuration update is still in progress
+view_group_resConfig_table_statusNochange = No changes were made to this group configuration
+view_group_resConfig_table_statusSuccess = This group configuration update was successful
+view_group_resConfig_table_title = Group Resource Configuration History
+view_group_resConfig_table_viewMemberHistory = View Member History
+view_group_resConfig_table_viewSettings = View Settings
+view_group_resConfig_view_groupProperties = Group Properties
+view_group_resConfig_view_noperm = You do not have permissions to see the resource configuration settings
+view_group_summary_compatible = Compatible
+view_group_summary_descUpdateFailure = Failed to change the description of the resource group with ID [{0}]
+view_group_summary_descUpdateSuccessful = You have changed the description of this resource group
+view_group_summary_dynamic = Dynamic
+view_group_summary_dynamicNote = Dynamic group names and descriptions are managed, and therefore are not editable
+view_group_summary_groupDefinition = Group Definition
+view_group_summary_memberCount = Member Count
+view_group_summary_memberType = Member Type
+view_group_summary_mixed = Mixed
+view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]
+view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]
+view_group_summary_recursive = Recursive
+view_helpTop_description = このセクションはドキュメンテーション、チュートリアル、バージョン、その他のヘルプ情報を提供します。
+view_help_section_product = プロダクト
+view_help_section_product_about = RHQについて
+view_inventory_adq = ディスカバリキュー
+view_inventory_allGroups = すべてのグループ
+view_inventory_allResources = すべてのリソース
+view_inventory_collectionInterval = コレクション間隔
+view_inventory_dynagroupDefs = 動的グループ定義
+view_inventory_eventDetails_loadFailed = An error occurred loading the event details
+view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]
+view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]
+view_inventory_eventHistory_details = Details
+view_inventory_eventHistory_detailsFilter = Details Filter
+view_inventory_eventHistory_groupEventHistory = Group Event History
+view_inventory_eventHistory_purgeFailed = Failed to purge events for [{0}]
+view_inventory_eventHistory_purgeSuccessful = You have successfully purged [{0}] events for [{1}]
+view_inventory_eventHistory_resourceEventHistory = Resource Event History
+view_inventory_eventHistory_severity = Severity
+view_inventory_eventHistory_severityFilter = Severity Filter
+view_inventory_eventHistory_sourceFilter = Source Filter
+view_inventory_eventHistory_sourceLocation = Source Location
+view_inventory_eventHistory_timestamp = Timestamp
+view_inventory_groups = グループ
+view_inventory_groups_children = Children
+view_inventory_groups_deleteFailed = Failed to delete the selected resource groups
+view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
+view_inventory_groups_descendants = Descendants
+view_inventory_groups_loadFailed = Failed to load group composite data
+view_inventory_groups_resourceGroups = Resource Groups
+view_inventory_mixed = mixed
+view_inventory_platforms = プラットフォーム
+view_inventory_problemGroups = 問題グループ
+view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible
+view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?
+view_inventory_resources_deleteFailed = Failed to delete the selected resources
+view_inventory_resources_deleteSuccessful = You have successfully deleted the selected resources
+view_inventory_resources_loadFailed = Failed to load resource composite data
+view_inventory_resources_title = リソース
+view_inventory_resources_title_children = 子リソース
+view_inventory_resources_title_members = メンバーリソース
+view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
+view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
+view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
+view_inventory_sectionHelp = このセクションにおいて、新規に発見されたリソース、インベントリに登録されたリソース、グループの表示と管理がおこなわれます。
+view_inventory_servers = サーバー
+view_inventory_services = サービス
+view_inventory_summary_agent_error1 = Failed to locate agent managing resource id
+view_inventory_summary_agent_error2 = Failed to ping agent managing resource id
+view_inventory_summary_agent_error3 = You do not have permission to view details for this Agent.
+view_inventory_summary_agent_fullEnpoint = Full Endpoint
+view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!
+view_inventory_summary_agent_last_title = Last Received Availability Report
+view_inventory_summary_agent_status_title = Agent Communications Status
+view_inventory_summary_agent_title = Agent Managing this Resource
+view_inventory_unavailableServers = 利用不能サーバー
+view_leftNav_unknownPage = Unknown page name [{0}] for section [{1}] - URL is invalid.
+view_login_invalidEmail = Invalid e-mail address
+view_login_login = ログイン
+view_login_logout = ログアウト
+view_login_noBackend = The backend datasource is unavailable.
+view_login_noLdap = Note: Optional retrieval of ldap details unsuccessful. Manual entry is required.
+view_login_noUser = The username or password provided does not match our records.
+view_login_prompt = ログインしてください
+view_login_registerLater = (Cancel - Complete registration later.)
+view_login_registerLdapSuccess = Successfully registered the new LDAP User.
+view_login_registerUser = Register User
+view_login_welcome = ようこそ
+view_login_welcomeMsg = Welcome to RHQ! <br/><br/> Enter/update the following fields to complete your registration process.<br/> Once you click "OK", you will be logged in.<br/><br/>
+view_measureRange_last = Time Range - Previous
+view_measureRange_simple = Simple...
+view_measureRange_start = Time Range - Start
+view_measureTable_chartMetricValues = Chart Selected Metrics
+view_measureTable_getLive = Get Live Value
+view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
+view_measureTable_live_title = ライブデータ
+view_measure_nan = --no data available--
+view_measurementOob_title = 疑わしいメトリックス
+view_menuBar_logout = ログアウト
+view_messageCenter_clearAllMessages = Clear All Messages
+view_messageCenter_lastNMessages = Last {0} Messages
+view_messageCenter_maxMessages = Max Messages
+view_messageCenter_messageBarShowDetails = Show Details
+view_messageCenter_messageDetail = Detail
+view_messageCenter_messageSeverity = Severity
+view_messageCenter_messageTime = Time
+view_messageCenter_messageTitle = メッセージセンター
+view_messageCenter_noRecentMessages = No Recent Messages
+view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
+view_metric_traits = Traits
+view_metric_viewTraitHistory = Value History for Trait [{0}]
+view_operationHistoryDetails_dateCompleted = 完了日
+view_operationHistoryDetails_dateSubmitted = 発行日
+view_operationHistoryDetails_error_fetchFailure = Failure loading operation history.
+view_operationHistoryDetails_noResults = This operation does not return any results.
+view_operationHistoryDetails_operation = オペレーション
+view_operationHistoryDetails_parameters = パラメータ
+view_operationHistoryDetails_requestor = 要求者
+view_operationHistoryDetails_results = 結果
+view_operationHistoryDetails_status = ステータス
+view_operationHistoryList_button_forceDelete = Force Delete
+view_operationHistoryList_button_runOperation = Run Operation
+view_operationHistoryList_notYetStarted = not yet started
+view_operationHistoryList_title = オペレーション履歴
+view_operationScheduleDetails_enterParametersBelow = Enter parameters below...
+view_operationScheduleDetails_fieldDefault_description = Select an operation to see its description.
+view_operationScheduleDetails_fieldDefault_parameters = Select an operation to see its parameters.
+view_operationScheduleDetails_fieldHelp_description = an optional description of this scheduled operation (e.g. nightly maintenance app server restart)
+view_operationScheduleDetails_fieldHelp_timeout = a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated
+view_operationScheduleDetails_field_description = 説明
+view_operationScheduleDetails_field_parameters = パラメータ
+view_operationScheduleDetails_field_timeout = タイムアウト
+view_operationScheduleDetails_noParameters = This operation does not take any parameters.
+view_operationScheduleDetails_operationSchedule = オペレーションスケジュール
+view_portlet_autodiscovery_setting_platforms = discovered platforms
+view_portlet_configure_definitionDesc = The configuration settings for the portlet.
+view_portlet_configure_definitionTitle = Portlet Configuration
+view_portlet_configure_needed = Click the Settings button to configure this portlet.
+view_portlet_configure_notNeeded = Configuration is not necessary for this portlet.
+view_portlet_defaultName_autodiscovery = ディスカバリキュー
+view_portlet_defaultName_favoriteResources = お気に入りリソース
+view_portlet_defaultName_groupMetric = Resource Group Metric Graph
+view_portlet_defaultName_group_alerts = グループ: アラート
+view_portlet_defaultName_group_bundles = グループ: バンドルデプロイ
+view_portlet_defaultName_group_config_updates = グループ: 構成の更新
+view_portlet_defaultName_group_events = グループ: イベント数
+view_portlet_defaultName_group_metrics = グループ: メトリックス
+view_portlet_defaultName_group_oobs = グループ: OOB 条件
+view_portlet_defaultName_group_operations = グループ: オペレーション
+view_portlet_defaultName_group_pkg_hisory = グループ: パッケージ履歴
+view_portlet_defaultName_inventorySummary = インベントリサマリ
+view_portlet_defaultName_mashup = マッシュアップ
+view_portlet_defaultName_message = メッセージ
+view_portlet_defaultName_operations = 最近のオペレーション
+view_portlet_defaultName_platformSummary = プラットフォーム利用率
+view_portlet_defaultName_problemResources = アラートまたは利用できないリソース
+view_portlet_defaultName_recentAlerts = 最近のアラート
+view_portlet_defaultName_recentlyAddedResources = 最近追加されたリソース
+view_portlet_defaultName_resourceMetric = Resource Metric Graph
+view_portlet_defaultName_resource_alerts = リソース: アラート
+view_portlet_defaultName_resource_bundles = リソース: バンドルデプロイ
+view_portlet_defaultName_resource_config_updates = リソース: 構成の更新
+view_portlet_defaultName_resource_events = リソース: イベント数
+view_portlet_defaultName_resource_metrics = リソース: 測定
+view_portlet_defaultName_resource_oobs = リソース: OOB メトリックス
+view_portlet_defaultName_resource_operations = リソース: オペレーション
+view_portlet_defaultName_resource_pkg_hisory = リソース: パッケージ履歴
+view_portlet_defaultName_tagCloud = タグ数
+view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
+view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
+view_portlet_graph_configure_resource_graph = The resource to graph
+view_portlet_help_autodiscovery = This portlet allows import or ignore of newly discovered resources. Imported resources are added to inventory for monitoring and management. Ignored resources are not imported and are hidden from view unless explicitly unignored.
+view_portlet_help_bundle_deps = This portlet shows relevant bundle deployments based on display criteria configured.
+view_portlet_help_config_updates = This portlet displays recent configuration changes consistent with configuration settings.
+view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
+view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
+view_portlet_help_graph = This portlet displays the resource metric graph.
+view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
+view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
+view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
+view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
+view_portlet_help_none = There is no help available for this portlet.
+view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
+view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
+view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
+view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
+view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
+view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
+view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
+view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
+view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
+view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
+view_portlet_inventory_error1 = Failed to retrieve inventory summary
+view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
+view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
+view_portlet_message_title = The message to display.
+view_portlet_operations_config_completed = completed operations
+view_portlet_operations_config_completed_enable = Whether to enable completed operations results grouping for dashboard.
+view_portlet_operations_config_completed_maximum = Maximum number of Completed operations to display.
+view_portlet_operations_config_scheduled_enable = Whether to enable scheduled operations results grouping for dashboard.
+view_portlet_operations_config_scheduled_maximum = Maximum number of Scheduled operations to display.
+view_portlet_operations_config_show_last = show Last
+view_portlet_operations_config_show_next = show Next
+view_portlet_operations_disabled = (Results currently disabled. Change settings to enable results.
+view_portlet_platform_platform_error_1 = Failed to load platform metrics
+view_portlet_platform_type_error_1 = Could not load type data
+view_portlet_problemResources_config_display_maximum = Maximum number of Problem resources to display.
+view_portlet_problemResources_config_display_range = Show problem resources going back this many hours.
+view_portlet_problemResources_config_display_range2 = From {0} to {1}
+view_portlet_problemResources_maxDisplaySetting = maximum resources.
+view_portlet_recentAlerts_config_members = Select Members
+view_portlet_recentAlerts_config_priority_label = priority Alerts,
+view_portlet_recentAlerts_config_when = within the past
+view_portlet_recentAlerts_fail_msg = Failed to load resources assigned for alert filtering.
+view_portlet_recentlyAdded_error1 = Failed to load recently added resources
+view_portlet_recentlyAdded_setting_addedPlatforms = recently added platforms
+view_portlet_results_empty = 指定されたクライテリアの結果は見つかりません
+view_remoteAgentInstall_agentStatus = エージェントのステータス
+view_remoteAgentInstall_agentStatusDefault = -ステータスの更新ボタンをクリックしてください-
+view_remoteAgentInstall_buttonFindAgent = エージェントの発見
+view_remoteAgentInstall_connInfo = 接続情報
+view_remoteAgentInstall_error_1 = Error occurred while trying to find agent install path
+view_remoteAgentInstall_error_2 = Could not find an agent installed when looking in common locations
+view_remoteAgentInstall_error_3 = Could not find an agent installed at or under [{0}]
+view_remoteAgentInstall_error_4 = Failed to install agent
+view_remoteAgentInstall_error_5 = Failed to start agent
+view_remoteAgentInstall_error_6 = Failed to stop agent
+view_remoteAgentInstall_installAgent = エージェントのインストール
+view_remoteAgentInstall_installInfo = エージェントのインストール情報
+view_remoteAgentInstall_installPath = エージェントのインストールパス
+view_remoteAgentInstall_owner = オーナー
+view_remoteAgentInstall_promptHost = The host where the agent is or will be installed
+view_remoteAgentInstall_promptInstallPath = Where the agent is or will be installed. If you aren''t sure where an agent is installed, enter a parent directory and click the ''Find Agent'' button to scan that directory and below. If you enter an empty path, common locations are searched on the host for an agent install.
+view_remoteAgentInstall_promptPassword = The credentials that are used to authenticate the user on the host via SSH
+view_remoteAgentInstall_promptPort = The port the SSH server is listening to. If not specified, the default is 22
+view_remoteAgentInstall_promptUser = The name of the user whose credentials are passed to the host via SSH
+view_remoteAgentInstall_result = Result
+view_remoteAgentInstall_resultCode = ResultCode
+view_remoteAgentInstall_startAgent = エージェントの起動
+view_remoteAgentInstall_startAgentResults = Agent start results: [{0}]
+view_remoteAgentInstall_step = ステップ
+view_remoteAgentInstall_stopAgent = エージェントの停止
+view_remoteAgentInstall_stopAgentResults = Agent stop results: [{0}]
+view_remoteAgentInstall_success = Agent installation complete
+view_remoteAgentInstall_updateStatus = スタータスの更新
+view_reportsTop_description = このセクションはグローバルレポートへのアクセスを提供します。
+view_reportsTop_title = レポート
+view_reports_alertDefinitions = アラート定義
+view_reports_alertDefinitions_parentHover = Click to go to the parent alert definition
+view_reports_alertDefinitions_resTypeLoadError = Cannot get the template resource type - unable to view the alert template.
+view_reports_inventorySummary_failFetch = Failed to get inventory summary
+view_reports_platforms = プラットフォーム利用率
+view_reports_subsystems = サブシステム
+view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.
+view_resourceResourceGroupList_error_updateFailure = Failed to update assigned Resource groups.
+view_resourceResourceGroupList_message_updateSuccess = Group membership updated for [{0}].
+view_resource_inventory_activity_changed_by = Changed by
+view_resource_inventory_activity_criteria_no_recent_events = 表示クライテリアに基づくイベントはありません
+view_resource_inventory_activity_no_recent_alerts = No recent alerts
+view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
+view_resource_inventory_activity_no_recent_config_history = No configuration change history
+view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
+view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
+view_resource_inventory_activity_no_recent_oob = OOBの条件はみつかりません
+view_resource_inventory_activity_no_recent_operations = No recent operation history
+view_resource_inventory_activity_no_recent_pkg_history = No recent package history
+view_resource_inventory_childhistory_createdChild = Created Child
+view_resource_inventory_childhistory_deletedChild = Deleted Child
+view_resource_inventory_childhistory_filterTitle = Past N Days
+view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
+view_resource_inventory_childhistory_status_invalidConfig = Invalid Configuration
+view_resource_monitor_availability_loadFailed = Failed to load availability history
+view_resource_monitor_calltime_average = Average
+view_resource_monitor_calltime_count = Count
+view_resource_monitor_calltime_destination = Call Destination
+view_resource_monitor_calltime_editFailed = Call time data can not be edited
+view_resource_monitor_calltime_loadFailed = Could not load call time data
+view_resource_monitor_calltime_lookupFailed = Could not load resource for call time
+view_resource_monitor_calltime_maximum = Maximum
+view_resource_monitor_calltime_minimum = Minimum
+view_resource_monitor_calltime_title = Call Time Data
+view_resource_monitor_calltime_total = Total
+view_resource_monitor_detailed_graph_label = Detailed Graph
+view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
+view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
+view_resource_monitor_graphs_loadFailed = Failed to load graph data
+view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
+view_resource_monitor_graphs_noneAvailable = No graphs available
+view_resource_monitor_schedules_title = Resource Metric Collection Schedules
+view_resource_monitor_table_alerts = アラート
+view_resource_monitor_table_avg = Average
+view_resource_monitor_table_last = Last
+view_resource_monitor_table_max = Maximum
+view_resource_monitor_table_min = Minimum
+view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details
+view_resource_title_tagUpdateFailed = Failed to update resource tags
+view_searchBar_defaultPattern = name your pattern
+view_searchBar_error_selectSavedSearch = ''Error selecting saved search''
+view_searchBar_query = Query
+view_searchBar_resourceGroups = リソースグループ
+view_searchBar_resources = リソース
+view_searchBar_welcomeMessage = search for {0}s
+view_searchGUI_loginStatus = Unable to determine login status, check server status
+view_selector_assigned = Assigned {0}
+view_selector_available = Available {0}
+view_subTab_error_disabled = Cannot select disabled subTab [{0}].
+view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
+view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_traitsLoadFailure = Failed to load traits for {0}.
+view_summaryOverviewForm_field_description = 説明
+view_summaryOverviewForm_field_location = 場所
+view_summaryOverviewForm_field_name = 名前
+view_summaryOverviewForm_field_type = タイプ
+view_summaryOverviewForm_field_version = バージョン
+view_summaryOverviewForm_header_summary = サマリ
+view_summaryOverviewForm_label_plugin = プラグイン:
+view_summaryOverviewForm_label_type = タイプ:
+view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverview_header_detectedErrors = 検出済みエラー
+view_summaryOverview_title_errorDetailsWindow = エラー詳細
+view_summaryOverview_tooltip_detectedErrors = Click on the rows to see the error details.
+view_tableSection_backButton = Back to List
+view_tableSection_error_badId = Can not show detail for [{0}]. Illegal 'id': [{1}]. Please report this bug
+view_tableSection_error_noId = Table [{0}] record is missing 'id' attribute - please report this bug.
+view_table_drawFail = Failed to draw Table [{0}].
+view_table_matchingRows = 一致した行: {0} (選択済み: {1})
+view_table_totalRows = 合計行: {0} (選択済み: {1})
+view_tabs_common_activity = アクティビティ
+view_tabs_common_agent = エージェント
+view_tabs_common_alerts = アラート
+view_tabs_common_availability = アベイラビリティ
+view_tabs_common_calltime = 呼び出し時間e
+view_tabs_common_child_history = 子の履歴
+view_tabs_common_child_resources = 子リソース
+view_tabs_common_configuration = 構成
+view_tabs_common_connectionSettings = 接続設定
+view_tabs_common_connectionSettingsHistory = 接続設定の履歴
+view_tabs_common_content = コンテント
+view_tabs_common_current = 現在
+view_tabs_common_dashboard = ダッシュボード
+view_tabs_common_definitions = 定義
+view_tabs_common_deployed = デプロイ済み
+view_tabs_common_events = イベント
+view_tabs_common_graphs = グラフ
+view_tabs_common_group_members = グループメンバー
+view_tabs_common_group_membership = グループメンバーシップ
+view_tabs_common_groups = グループ
+view_tabs_common_history = 履歴
+view_tabs_common_inventory = インベントリ
+view_tabs_common_members = メンバー
+view_tabs_common_monitoring = モニタリング
+view_tabs_common_new = 新規
+view_tabs_common_operations = オペレーション
+view_tabs_common_overview = 概要
+view_tabs_common_schedule = スケジュール
+view_tabs_common_schedules = スケジュール
+view_tabs_common_subscriptions = サブスクリプション
+view_tabs_common_summary = サマリ
+view_tabs_common_tables = テーブル
+view_tabs_common_timeline = タイムライン
+view_tabs_common_traits = Traits
+view_tabs_invalidSubTab = Invalid subtab: {0}
+view_tabs_invalidTab = Invalid tab: {0}
+view_tagCloud_deleteTag = Delete Tag
+view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
+view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
+view_tagCloud_error_fetchFailure = Failed to load tags.
+view_tagCloud_error_tagUsedCount = Tag used {0} times.
+view_tagCloud_title = Tag Cloud
+view_taggedResources_title = リソース
+view_tags_error_1 = Failed to load Tags
+view_tags_tags = タグ
+view_tags_tooltip_1 = Click to remove this Tag
+view_tags_tooltip_2 = Click to edit Tags
+view_tags_tooltip_3 = Enter a Tag in the format: (namespace:)(semantic=)tagname (e.g. it:env=QA, or owner=John)
+view_testTop_description = This section contains pages for testing various GUI components.
+view_testTop_title = テスト
+view_titleBar_common_addedFav = You have added [{0}] as a favorite
+view_titleBar_common_addedFavFailure = Failed to add [{0}] as a favorite
+view_titleBar_common_clickToAddFav = Click to add this as a favorite
+view_titleBar_common_clickToRemoveFav = Click to remove this as a favorite
+view_titleBar_common_loadTagsFailure = Failed to load the tags for [{0}]
+view_titleBar_common_removedFav = You have removed [{0}] as one of your favorites
+view_titleBar_common_removedFavFailure = Failed to remove [{0}] as one of your favorites
+view_titleBar_common_updateTagsFailure = Failed to update the tags for [{0}]
+view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have been updated
+view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
+view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
+view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
+view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]
+view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration
+view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource Configuration
+view_tree_common_contextMenu_groupGraph = Group Metric Graph
+view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
+view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboards
+view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
+view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
+view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children
+view_tree_common_contextMenu_measurements = Measurements
+view_tree_common_contextMenu_operations = Operations
+view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
+view_tree_common_contextMenu_resourceConfiguration = Resource Configuration
+view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
+view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard
+view_tree_common_contextMenu_saveChartToDashboardSuccessful = You have saved dashboard [{0}]
+view_tree_common_contextMenu_type_name_label = Type: {0}
+view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
+view_tree_common_loadFailed_children = Failed to load children for node
+view_tree_common_loadFailed_create = Failed to create view for this node
+view_tree_common_loadFailed_descendants = Failed to load descendants for tree
+view_tree_common_loadFailed_generic = Failed to load data for tree
+view_tree_common_loadFailed_group = Failed to load group with id [{0}]
+view_tree_common_loadFailed_groupTree = Failed to load group tree
+view_tree_common_loadFailed_node = Failed to load data for this node
+view_tree_common_loadFailed_root = Failed to load root for tree
+view_tree_common_loadFailed_selection = Failed to select this node
+view_tree_common_loadFailed_update = Failed to update view for this node
+view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
+view_type_parentId = Parent ID
+view_type_resourceTypes = Resource Types
+view_type_typeTreeLoadFailure = Failed to load resource type tree data
+view_upload_alreadyUploaded = File has already been uploaded
+view_upload_bundleDistFile = Distribution File
+view_upload_error_bundleDistFile = Error uploading Bundle Distribution File
+view_upload_error_file = Error uploading file
+view_upload_error_fileName = Error uploading file [{0}]
+view_upload_error_fileName_2 = Error uploading file [{0}], check for invalid file path.
+view_upload_error_packageVersionFile = Error uploading Package Version File
+view_upload_error_results = Error uploading file, unexpected results: [{0}]
+view_upload_inProgress = Can not submit, upload is currently in progress
+view_upload_prompt_1 = Please select a file to upload [{0}]
+view_upload_prompt_2 = File to Upload
+view_upload_success = File successfully uploaded
+view_upload_tooltip_1a = Select a file to upload, then click Upload or Next
+view_upload_tooltip_1b = Select a file to upload, then click Next
+view_upload_tooltip_2 = File upload had previously failed
+view_upload_upload = Upload
+view_upload_uploadFile = UploadFile
+widget_colorPicker_tooltip = Click to select a new color
+widget_durationItem_inputUnitLessThanTargetUnit = Input unit is less than target unit.
+widget_durationItem_unitTypeNotSupported = Unit type [{0}] is not supported by this DurationItem.
+widget_jobTriggerEditor_fieldHelp_repeatDuration = keep running this operation this many times or until this amount of time has elapsed
+widget_jobTriggerEditor_fieldHelp_repeatInterval = how often the operation should be executed
+widget_jobTriggerEditor_fieldHelp_startDelay = start executing the operation after this amount of time has elapsed
+widget_jobTriggerEditor_field_cronExpression = Cron Expression
+widget_jobTriggerEditor_field_mode = Schedule using
+widget_jobTriggerEditor_field_repeatInterval_later = Repeat every
+widget_jobTriggerEditor_field_repeatInterval_now = Run now and every
+widget_jobTriggerEditor_field_startType = Run
+widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = End time must be after start time.
+widget_jobTriggerEditor_message_endTimeMustBeInFuture = End time must be in the future.
+widget_jobTriggerEditor_message_startTimeMustBeInFuture = Start time must be in the future.
+widget_jobTriggerEditor_tab_examples = Examples
+widget_jobTriggerEditor_tab_format = Format
+widget_jobTriggerEditor_value_calendar = Calendar
+widget_jobTriggerEditor_value_cronExpression = Cron Expression
+widget_jobTriggerEditor_value_for = For
+widget_jobTriggerEditor_value_in = in
+widget_jobTriggerEditor_value_indefinitely = Indefinitely
+widget_jobTriggerEditor_value_later = Later
+widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
+widget_jobTriggerEditor_value_now = Now
+widget_jobTriggerEditor_value_nowAndRepeat = Now & Repeat
+widget_jobTriggerEditor_value_on = on
+widget_jobTriggerEditor_value_until = Until
+widget_recordEditor_error_invalidViewPath = Invalid view path: [{0}]
+widget_recordEditor_error_multipleRecords = Multiple records were returned - expected exactly one.
+widget_recordEditor_error_noRecords = No records were returned - expected exactly one.
+widget_recordEditor_error_operation = Operation failed. An error occurred
+widget_recordEditor_error_operationInvalidValues = Operation failed - one or more fields have invalid values
+widget_recordEditor_error_permissionCreate = You do not have the permissions required to create a new [{0}]
+widget_recordEditor_error_unsupportedOperationType = Unsupported operation type: [{0}]
+widget_recordEditor_info_recordCreatedConcise = {0} created.
+widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created.
+widget_recordEditor_info_recordUpdatedConcise = {0} updated.
+widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
+widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
+widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
+widget_recordEditor_label_loading = ロード中...
+widget_recordEditor_title_edit = Edit {0} [{1}]
+widget_recordEditor_title_new = Create New {0}
+widget_recordEditor_title_view = View {0} [{1}]
+widget_recordEditor_warn_validation = One or more fields have invalid values. This [{0}] cannot be saved until these values are corrected
+widget_resourceFactoryWizard_archPrompt = Package Architecture
+widget_resourceFactoryWizard_configTemplatePrompt = Resource Configuration Templates
+widget_resourceFactoryWizard_contentTemplatePrompt = Deployment Time Configuration Templates
+widget_resourceFactoryWizard_createSubmit = A request to create a resource with the name of [{0}] has been submitted successfully.
+widget_resourceFactoryWizard_createSubmitType = A request to create a resource of type [{0}] has been submitted successfully.
+widget_resourceFactoryWizard_createWizardTitle = Create New Resource of Type [{0}]
+widget_resourceFactoryWizard_createWizardWindowTitle = Resource Create Wizard
+##widget_resourceFactoryWizard_editConfigStepName = Deployment Options
+widget_resourceFactoryWizard_execute1 = Failed to create a new resource - there is no package version
+widget_resourceFactoryWizard_execute2 = Failed to create a new resource
+widget_resourceFactoryWizard_failedToDeleteVersion = Failed to delete package version while canceling a resource create
+widget_resourceFactoryWizard_failedToGetType = Failed to get backing package type for new resource
+widget_resourceFactoryWizard_importFailure = Failed to manually import resource
+widget_resourceFactoryWizard_importSubmitted = A request to import a new resource of type [{0}] has been submitted
+widget_resourceFactoryWizard_importWizardTitle = Import Resource of Type [{0}]
+widget_resourceFactoryWizard_importWizardWindowTitle = Resource Import Wizard
+widget_resourceFactoryWizard_infoStepName = Resource Information
+widget_resourceFactoryWizard_infoStep_loadFail = Failed to get available Architectures
+widget_resourceFactoryWizard_namePrompt = New Resource Name
+widget_resourceFactoryWizard_templatePrompt = Connection Settings Template
+##widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
+widget_resourceFactoryWizard_uploadFailure = Failed to upload file
+widget_resourceFactoryWizard_uploadFileStepName = Upload Resource Content File
+widget_resourceFactoryWizard_uploadInProgress = The upload is in progress... This can take several minutes to complete for large distribution files.
+widget_resourceFactoryWizard_versionPrompt = Package Version
+widget_resourceSelector_groupCategory = Group Category
+widget_resourceSelector_pleaseSelectMultipleResource = Please select one or more resources
+widget_resourceSelector_pleaseSelectResource = Please select a resource
+widget_resourceSelector_selectMultipleResources = Select Resources
+widget_resourceSelector_selectResource = Select a Resource
+widget_typeCache_loadFail = Failed to load resource type metadata
+widget_typeTree_badTemplateType = Invalid URL. Unknown template type [{0}]
+widget_typeTree_badTypeId = Invalid URL. Bad resource type ID [{0}]
+widget_typeTree_loadFail = Failed to load resource types
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index c2e1cb0..390db98 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -1,1921 +1,1912 @@
-#
-# RHQ GUI i18n Messages - Localization: PT
-#
-# Developers: See the following wiki page for how to work with this file:
-#
-# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
-#
-###################################
-
-common_alert_high = Alto
-common_alert_low = Baixo
-common_alert_medium = M\u00E9dio
-common_buildInfo_gwtVersion = ${gwt.version}
-common_button_ack = Confirmar
-common_button_ack_all = Confirmar Todos
-common_button_add = Adicionar
-common_button_advanced = Avan\u00E7ado...
-common_button_apply = Aplicar
-common_button_cancel = Cancelar
-common_button_close = Fechar
-common_button_compare = Comparar
-common_button_create_child = Criar filho
-common_button_delete = Excluir
-common_button_delete_all = Excluir Todos
-common_button_disable = Desabilitar
-common_button_edit = Editar
-common_button_enable = Habilitar
-common_button_finish = Finalizar
-common_button_import = Importar
-common_button_new = Novo
-common_button_next = Pr\u00F3ximo
-common_button_ok = OK
-common_button_previous = Anterior
-common_button_purgeAll = Remover Todos
-common_button_refresh = Atualizar
-common_button_reset = Limpar
-common_button_save = Salvar
-common_button_schedule = Agendar
-common_button_search = Procurar
-common_button_set = Definir
-common_button_showDetails = Mostrar Detalhes...
-common_button_uninventory = Remover do Invent\u00E1rio
-common_calendar_april_short = abr
-common_calendar_august_short = ago
-common_calendar_december_short = dez
-common_calendar_february_short = fev
-common_calendar_january_short = jan
-common_calendar_july_short = jul
-common_calendar_june_short = jun
-common_calendar_march_short = mar
-common_calendar_may_short = mai
-common_calendar_november_short = nov
-common_calendar_october_short = out
-common_calendar_september_short = set
-common_label_ago = ago
-common_label_all = TODOS
-common_label_all_resources = todos os recursos
-common_label_day = dia
-common_label_days = dias
-common_label_hour = hora
-common_label_hours = horas
-common_label_item = item
-common_label_items = itens
-common_label_milliseconds = milisegundos
-common_label_minutes = minutos
-common_label_month = m\u00EAs
-common_label_none = nenhum
-common_label_role = perfil
-common_label_roles = perfis
-common_label_scheduled_operations = opera\u00E7\u00F5es agendadas
-common_label_seconds = segundos
-common_label_selected_resources = recursos selecionados
-common_label_unlimited = ilimitado
-common_label_user = usu\u00E1rio
-common_label_users = usu\u00E1rios
-common_label_week = semana
-common_label_weeks = semanas
-common_label_yesterday = Ontem
-common_msg_areYouSure = Tem certeza?
-common_msg_asyncTimeout = {0}. Isso ocorre porque o servidor est\u00E1 levando muito tempo para atender esta requisi\u00E7\u00E3o. Favor atentar para o fato de que o servidor ainda esteja processando sua requisi\u00E7\u00E3o e pode concluir dentro de mais alguns instantes. Voc\u00EA ainda pode verificar os logs do servidor para identificar se algum erro anormal ocorreu.
-common_msg_changeAutoDetected = Mudan\u00E7as detectadas automaticamente
-common_msg_deleteConfirm = Tem certeza de que deseja excluir o # selecionado {0}?
-common_msg_emphasizedNotePrefix = NOTA:
-common_msg_loading = Carregando...
-common_msg_noItemsToShow = N\u00E3o existem itens para apresentar
-common_msg_notYetImplemented = N\u00E3o implementado ainda
-common_msg_see_more = Ver detalhes...
-common_msg_step_x_of_y = Passo {0} de {1}
-common_severity_debug = Debug
-common_severity_error = Error
-common_severity_fatal = Fatal
-common_severity_info = Info
-common_severity_warn = Warn
-common_status_canceled = Cancelado
-common_status_deferred = Deferido
-common_status_failed = Falha
-common_status_inprogress = Processando
-common_status_nochange = Sem altera\u00E7\u00E3o
-common_status_partial = Parcial
-common_status_success = Sucesso
-common_status_timedOut = Tempo Esgotado
-common_status_unknown = Desconhecido
-common_title_add_column = Adicionar Coluna
-common_title_add_graph_to_view = Adicionar Gr\u00E1fico ao Monitor de Vis\u00E3o
-common_title_add_portlet = Adicionar Portlet
-common_title_address = Endere\u00E7o
-common_title_alert_range = S\u00E9rie de Alertas
-common_title_ancestry = Ancestral
-common_title_availability = Disponibilidade
-common_title_available_resources = Recursos Dispon\u00EDveis
-common_title_average_metrics = M\u00E9tricas da m\u00E9dia por Minuto
-common_title_background = Fundo (background)
-common_title_bundle = Bundle
-common_title_bundles = Bundles
-common_title_category = Categoria
-common_title_change_refresh_time = Atualizar Intervalo
-common_title_columns = Colunas
-common_title_compare_metrics = Comparar M\u00E9tricas
-common_title_compatibleGroups = Grupos Compat\u00EDveis
-common_title_compatibleGroups_total = Total de Grupos Compat\u00EDveis
-common_title_component_errors = Componentes com erro
-common_title_config_update_status = Atualizar Status
-common_title_configuration = Configura\u00E7\u00E3o
-common_title_count = Quantidade
-common_title_custom = Personalizado
-common_title_dashboard_name = Nome do Painel de Controle
-common_title_dateCreated = Data de Cria\u00E7\u00E3o
-common_title_dateRange = Intervalo de Data
-common_title_default = Padr\u00E3o
-common_title_description = Descri\u00E7\u00E3o
-common_title_details = Detalhes
-common_title_display = Display
-common_title_display_name = Nome do Display
-common_title_duration = Dura\u00E7\u00E3o
-common_title_edit_mode = Modo Edi\u00E7\u00E3o
-common_title_enabled = Habilitado?
-common_title_end = Fim
-common_title_error = Erro
-common_title_favorites = Favoritos
-common_title_generalProp = Propriedades Gerais
-common_title_group = Grupo
-common_title_group_def_total = Total de Defini\u00E7\u00E3o de Grupos
-common_title_group_member_health = Sa\u00FAde do Membro do Grupo
-common_title_groups = Grupos
-common_title_help = Ajuda
-common_title_host = Host
-common_title_icon = \u00EDcone
-common_title_id = ID
-common_title_id_parent = ID do Recurso pai
-common_title_info = Info
-common_title_inventory = Invent\u00E1rio
-common_title_inventorySummary = Sum\u00E1rio do Invent\u00E1rio
-common_title_lastUpdated = \u00DAltima Atualiza\u00E7\u00E3o
-common_title_lastUpdatedBy = \u00DAltima Atualiza\u00E7\u00E3o feita por
-common_title_ldapGroups = Grupos LDAP
-common_title_mashup = Mashup
-common_title_members_reporting = Relat\u00F3rio de Membros
-common_title_message = Mensagem
-common_title_metric = M\u00E9trica
-common_title_metric_chart = Gr\u00E1fico de M\u00E9trica
-common_title_mixedGroups = Grupos Mistos
-common_title_mixedGroups_total = Total de Grupos Mistos
-common_title_name = Nome
-common_title_new_dashboard = Novo Painel de Controle
-common_title_numeric_metrics = M\u00E9tricas Num\u00E9ricas
-common_title_numeric_type = Tipo Num\u00E9rico
-common_title_operation_status = Status da Opera\u00E7\u00E3o
-common_title_operations = Opera\u00E7\u00F5es
-common_title_operations_range = S\u00E9rie de Opera\u00E7\u00F5es
-common_title_over = Execesso
-common_title_password = Senha
-common_title_path = Caminho
-common_title_permissions = Permiss\u00F5es
-common_title_platform = Plataforma
-common_title_platform_total = Total de Plataformas
-common_title_plugin = Plugin
-common_title_port = Porta
-common_title_providers = Provedores
-common_title_recent_alerts = Alertas Recentes
-common_title_recent_bundle_deployments = Recent Bundle Deployments
-common_title_recent_configuration_updates = Configura\u00E7\u00F5es Alteradas Recentemente
-common_title_recent_event_counts = Totaliza\u00E7\u00E3o de Eventos Recentes
-common_title_recent_measurements = M\u00E9tricas Recentes
-common_title_recent_oob_metrics = M\u00E9tricas fora dos limites Recentes
-common_title_recent_operations = Opera\u00E7\u00F5es Recentes
-common_title_recent_pkg_history = Hist\u00F3rico de Pacotes Recentes
-common_title_recently_added = Recursos Adicionados Recentemente
-common_title_remove_column = Remover Coluna
-common_title_repositories = Reposit\u00F3rios
-common_title_resource = Recursos
-common_title_resourceGroups = Resource Groups
-common_title_resource_group = Grupo de Recursos
-common_title_resource_id = ID do Recurso
-common_title_resource_inventory = Invent\u00E1rio de Recursos
-common_title_resource_key = Chave do Recurso
-common_title_resource_name = Nome do Recurso
-common_title_resource_type = Tipo do Recurso
-common_title_resources = Recursos
-common_title_results_count = Resultado Total
-common_title_results_count_tooltip = Mostra este n\u00FAmero de resultados
-common_title_role = Perfil
-common_title_roles = Perfis
-common_title_scheduled_operations = Opera\u00E7\u00F5es Agendadas
-common_title_search = Procurar
-common_title_selected_resources = Recursos Selecionados
-common_title_server = Servidor
-common_title_server_total = Total de Servidores
-common_title_service = Servi\u00E7o
-common_title_service_total = Total de Servi\u00E7os
-common_title_settings = Configura\u00E7\u00F5es
-common_title_show = Visualizar
-common_title_show_more = Visualizar mais...
-common_title_sort_order = Ordena\u00E7\u00E3o
-common_title_sort_order_tooltip = Define a ordem dos resultados.
-common_title_start = Iniciar
-common_title_status = Status
-common_title_stop = Parar
-common_title_summary = Sum\u00E1rio
-common_title_summary_counts = Sum\u00E1rio de Contagem
-common_title_tag_cloud = Nuvem de Tags
-common_title_the = O
-common_title_timestamp = Data/Hora
-common_title_total = Total
-common_title_type = Tipo
-common_title_units = Unidades
-common_title_user = Usu\u00E1rio
-common_title_users = Usu\u00E1rios
-common_title_value = Valor
-common_title_version = Vers\u00E3o
-common_title_view_mode = Modo vis\u00E3o
-common_title_web_address = Endere\u00E7o Web
-common_title_welcome = Bem Vindo
-common_unit_days = dias
-common_unit_hours = horas
-common_unit_milliseconds = milisegundos
-common_unit_minutes = minutos
-common_unit_months = meses
-common_unit_seconds = segundos
-common_unit_times = vezes
-common_unit_weeks = semanas
-common_unit_years = anos
-common_val_for = para
-common_val_n1st = {0}\u00BA
-common_val_n2nd = {0}\u00BA
-common_val_n3rd = {0}\u00BA
-common_val_na = N/A
-common_val_never = Nunca
-common_val_no = N\u00E3o
-common_val_no_lower = n\u00E3o
-common_val_none = Nenhum
-common_val_nth = {0}\u00BA
-common_val_yes = Sim
-common_val_yes_lower = sim
-
-dataSource_ContentRepoTree_error_load = Erro ao carregar os reposit\u00F3rios
-dataSource_ContentRepoTree_field_parentId = ID pai
-dataSource_bundle_loadFailed = Falha ao carregar os dados do Bundle
-dataSource_configurationHistory_clickToSeeError = Duplo clique para visualizar a mensagem...
-dataSource_configurationHistory_currentConfig = Esta \u00E9 a configura\u00E7\u00E3o atual
-dataSource_configurationHistory_dateCompleted = Conclu\u00EDdo em
-dataSource_configurationHistory_dateSubmitted = Submetido em
-dataSource_configurationHistory_error_fetchFailure = N\u00E3o foi poss\u00EDvel carregar o hist\u00F3rico de configura\u00E7\u00E3o.
-dataSource_configurationHistory_field_createdTime = Criado
-dataSource_configurationHistory_field_id = ID
-dataSource_configurationHistory_field_resource = Recurso
-dataSource_configurationHistory_field_status = Status
-dataSource_configurationHistory_field_subject = Assunto
-dataSource_configurationHistory_updateType = Tipo de atualiza\u00E7\u00E3o
-dataSource_configurationHistory_updateType_group = Grupo
-dataSource_configurationHistory_updateType_individual = Individual
-dataSource_definitions_loadFailed = Falha ao carregar defini\u00E7\u00E3o de m\u00E9tricas
-dataSource_measurementOob_error_fetchFailure = Falha ao carregar informa\u00E7\u00F5es das m\u00E9tricas OOB
-dataSource_measurementOob_field_factor = Fator fora da faixa (%)
-dataSource_measurementOob_field_formattedBaseband = Faixa
-dataSource_measurementOob_field_formattedOutlier = Fora de s\u00E9rie
-dataSource_measurementOob_field_parentName = Pai
-dataSource_measurementOob_field_resourceName = Recurso
-dataSource_measurementOob_field_scheduleName = M\u00E9trica
-dataSource_operationHistory_error_fetchFailure = Falha ao carregar o hist\u00F3rico de opera\u00E7\u00F5es.
-dataSource_operationHistory_field_createdTime = Data de cria\u00E7\u00E3o
-dataSource_operationHistory_field_operationName = Nome da Opera\u00E7\u00E3o
-dataSource_operationHistory_field_startedTime = Iniciado em
-dataSource_operationHistory_field_subject = Solicitante
-dataSource_operationSchedule_field_description = Notas
-dataSource_operationSchedule_field_id = ID do Agendamento
-dataSource_operationSchedule_field_nextFireTime = Pr\u00F3xima execu\u00E7\u00E3o
-dataSource_operationSchedule_field_operationDisplayName = Opera\u00E7\u00E3o
-dataSource_operationSchedule_field_operationName = Opera\u00E7\u00E3o
-dataSource_operationSchedule_field_subject = Propriet\u00E1rio
-dataSource_operationSchedule_field_timeout = Tempo limite (em segundos)
-dataSource_platforms_field_cpu = CPU
-dataSource_platforms_field_memory = Mem\u00F3ria
-dataSource_platforms_field_swap = Swap
-dataSource_problemResources_error_fetchFailure = Falha com carregar Recursos com alertas/indisponibilidade.
-dataSource_problemResources_field_alerts = Alertas
-dataSource_problemResources_field_available = Disponibilidade Atual
-dataSource_problemResources_field_location = Local
-dataSource_problemResources_field_resource = Recurso
-dataSource_recentOperations_error_fetchFailure = Falha ao carregar a lista de opera\u00E7\u00F5es finalizadas recentemente.
-dataSource_recentOperations_field_location = Localiza\u00E7\u00E3o
-dataSource_recentOperations_field_operation = Opera\u00E7\u00E3o
-dataSource_recentOperations_field_resource = Recurso
-dataSource_recentOperations_field_status = Status
-dataSource_recentOperations_field_time = Data/Hora
-dataSource_resourceErrors_clickStatusIcon = Clique no \u00EDcone para mais detalhes
-dataSource_resourceErrors_deleteFailure = Falha do excluir mensagens de erros do recurso
-dataSource_resourceErrors_deleteSuccess = Mensagens de erro para o recurso [{0}] exclu\u00EDdas com sucesso.
-dataSource_resourceErrors_error_fetchFailure = Falha ao procurar por erros para o Recurso com ID [{0}].
-dataSource_resourceErrors_field_detail = Mensagem detalhada
-dataSource_resourceErrors_field_errorType = Tipo de Erro
-dataSource_resourceErrors_field_summary = Sum\u00E1rio
-dataSource_resourceErrors_field_timeOccured = Tempo
-dataSource_resourceGroups_loadFailed = Falha ao carregar grupos de recurso
-dataSource_resources_field_discoveryTime = Data de Descoberta
-dataSource_resources_field_importTime = Data de Importa\u00E7\u00E3o
-dataSource_resources_field_key = Chave
-dataSource_resources_field_lastModifiedTime = Data da \u00FAltima altera\u00E7\u00E3o
-dataSource_resources_field_lastModifier = \u00DAltima altera\u00E7\u00E3o
-dataSource_resources_field_location = Localiza\u00E7\u00E3o
-dataSource_rpc_error_transformRequestFailure = Ocorreu uma falha na fonte de dados durante o processamento da requisi\u00E7\u00E3o {0}.
-dataSource_rpc_error_unsupportedArrayFilterType = Sem suporte para o array filters do tipo {0}.
-dataSource_rpc_error_unsupportedEnumType = Favor adicionar um trecho de c\u00F3digo apropriado para a enum {0} para RPCDataSource.getEnumArray(Class)
-dataSource_rpc_no = n\u00E3o
-dataSource_rpc_yes = sim
-dataSource_scheduledOperations_error_fetchFailure = Falha ao carregar a lista de opera\u00E7\u00F5es agendadas
-dataSource_scheduledOperations_field_location = Localiza\u00E7\u00E3o
-dataSource_scheduledOperations_field_operation = Opera\u00E7\u00E3o
-dataSource_scheduledOperations_field_resource = Recurso
-dataSource_scheduledOperations_field_time = Data/Hora
-dataSource_schedules_disableFailure_group = Falha ao desabilitar a coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas eram: [{2}]
-dataSource_schedules_disableFailure_resource = Falha ao desabilitar a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas eram: [{2}]
-dataSource_schedules_disableSuccessful_concise = Voc\u00EA desabilitou a coleta de m\u00E9tricas de [{0}]
-dataSource_schedules_disableSuccessful_full_group = Voc\u00EA desabilitou a coleta de m\u00E9tricas de[{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas desabilitadas s\u00E3o: [{2}]
-dataSource_schedules_disableSuccessful_full_resource = Voc\u00EA desabilitou a coleta de m\u00E9tricas de[{0}] para o recurso com ID [{1}]. As m\u00E9tricas desabilitadas s\u00E3o: [{2}]
-dataSource_schedules_enableFailure_group = Falha ao habilitar a coleta de m\u00E9tricas de [{0}] para o grupo com ID [{1}]. As m\u00E9tricas s\u00E3o: [{2}]
-dataSource_schedules_enableFailure_resource = Falha ao habilitar a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas s\u00E3o: [{2}]
-dataSource_schedules_enableSuccessful_concise = Voce habilitou a coleta de m\u00E9tricas de [{0}]
-dataSource_schedules_enableSuccessful_full_group = Voc\u00EA habilitou a coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas habilitadas foram: [{2}]
-dataSource_schedules_enableSuccessful_full_resource = Voc\u00EA habilitou a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas habilitadas foram: [{2}]
-dataSource_schedules_field_resourceGroupId = ID de Grupo
-dataSource_schedules_loadFailed = Falha ao carregar agendamento de m\u00E9tricas
-dataSource_schedules_loadFailedContext = Falha ao carregar agendamentos de m\u00E9tricas para o contexto [{0}]
-dataSource_schedules_loadFailedCriteria = Falha ao carregar agendamentos de m\u00E9tricas com o crit\u00E9io [{0}]
-dataSource_schedules_updateFailure_group = Falha ao configurar o intervalo para coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. M\u00E9tricas: [{2}]. O intervalo de coleta seria de [{3}] segundos.
-dataSource_schedules_updateFailure_resource = Falha ao configurar o intervalo para coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. M\u00E9tricas: [{2}]. O intervalo de coleta seria de [{3}] segundos.
-dataSource_schedules_updateSuccessful_concise = Um novo intervalo de coleta de [{0}] segundos foi configurado para m\u00E9tricas de [{1}]
-dataSource_schedules_updateSuccessful_full_group = Um novo intervalo de coleta de [{0}] segundos foi configurado para m\u00E9tricas de [{1}] para o grupo de recursos com ID [{2}]. M\u00E9tricas atualizadas: [{3}]
-dataSource_schedules_updateSuccessful_full_resource = Um novo intervalo de coleta de [{0}] segundos foi configurado para m\u00E9tricas de [{1}] para o recurso com ID [{2}]. M\u00E9tricas atualizadas: [{3}]
-dataSource_traits_failFetch = Falha ao obter as caracter\u00EDsticas com o crit\u00E9rio [{0}].
-dataSource_traits_field_definitionID = ID da defini\u00E7\u00E3o
-dataSource_traits_field_lastChanged = \u00DAltima Altera\u00E7\u00E3o
-dataSource_traits_field_primaryKey = Chave Prim\u00E1ria
-dataSource_traits_field_trait = Propriedade
-dataSource_traits_group_field_groupId = ID de Grupo
-dataSource_traits_group_field_memberResource = Recurso Membro
-dataSource_users_delete = Usu\u00E1rio exclu\u00EDdo [{0}]
-dataSource_users_deleteFailed = Falha ao excluir o usu\u00E1rio [{0}]
-dataSource_users_field_department = Departamento
-dataSource_users_field_emailAddress = Endere\u00E7o de Email
-dataSource_users_field_factive = Login Habilitado?
-dataSource_users_field_firstName = Primeiro Nome
-dataSource_users_field_id = ID
-dataSource_users_field_lastName = \u00DAltimo Nome
-dataSource_users_field_ldap = LDAP Login?
-dataSource_users_field_name = Nome do Usu\u00E1rio
-dataSource_users_field_password = Senha
-dataSource_users_field_passwordVerify = Verifique a Senha
-dataSource_users_field_phoneNumber = N\u00FAmero de Telefone
-dataSource_users_invalidEmailAddress = Endere\u00E7o de email inv\u00E1lido.
-dataSource_users_passwordsDoNotMatch = Senhas n\u00E3o conferem.
-
-datasource_roles_field_ldapGroups = Grupos LDAP
-datasource_roles_field_permissions = Permiss\u00F5es
-datasource_roles_field_resourceGroups = Grupos de Recurso
-datasource_roles_field_subjects = Subjects
-datasource_templateSchedules_disabled = Desabilitar a coleta da m\u00E9trica selecionada [{0}].
-datasource_templateSchedules_disabled_detailed = Desabilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
-datasource_templateSchedules_disabled_failed = Falha ao desabilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
-datasource_templateSchedules_enabled = Habilitar a coleta da m\u00E9trica selecionada [{0}].
-datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled_failed = Falha ao habilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
-datasource_templateSchedules_updated = Intervalos de coleta atualizados para a m\u00E9trica [{0}].
-datasource_templateSchedules_updated_detail = Intervalo de coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}] configurado para [{3}] segundos.
-datasource_templateSchedules_updated_failed = Falha ao configurar o intervalo de coleta para [{0}] segundos para a m\u00E9trica [{1}] [{2}] para o Tipo de Recurso com id [{3}].
-
-favorites = Favoritos
-
-favorites_groups = Grupos Favoritos
-favorites_recentlyViewed = Acessados Recentemente
-favorites_resources = Recursos Favoritos
-
-group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource
-
-util_ancestry_parentAncestry = Ancestral para:
-util_errorHandler_nullException = Exce\u00E7\u00E3o nula
-util_monitoringRequestCallback_error_checkServerStatusFailure = Imposs\u00EDvel verificar o status do login - verifique o status do Servidor.
-util_rpcManager_activeRequests = {0} Requisi\u00E7\u00F5es ativas
-util_userPerm_loadFailGlobal = Falha ao carregar permiss\u00F5es globais - nenhuma permiss\u00E3o concedida.
-util_userPerm_loadFailGroup = Falha ao carregar suas permiss\u00F5es para o Grupo de Recursos com id [{0}] - nenhuma permiss\u00E3o concedida.
-util_userPerm_loadFailResource = Falha ao carregar suas permiss\u00F5es para o Recurso com id [{0}] - nenhuma permiss\u00E3o concedida.
-util_userSession_loadFailSubject = UserSessionManager: Falha ao carregar a credencial do usu\u00E1rio
-util_userSession_logoutFail = Falha durante o logout.
-util_widgetsField_unlimited = Ilimitado
-
-view_aboutBox_allRightsReserved = Todos os Direitos Reservados.~
-view_aboutBox_buildNumber = N\u00FAmero do Build:~
-view_aboutBox_failedToLoad = Falha ao carregar informa\u00E7oes do produto.~
-view_aboutBox_homepage = P\u00E1gina Inicial~
-view_aboutBox_jbossByRedHat = JBoss by Red Hat~
-view_aboutBox_title = Sobre {0}~
-view_aboutBox_version = Vers\u00E3o:
-view_adminConfig_downloads = Downloads
-view_adminConfig_license = Licen\u00E7a
-view_adminConfig_plugins = Plugins
-view_adminConfig_systemSettings = Propriedades de Sistema
-view_adminConfig_templates = Templates
-view_adminContent_contentSources = Fontes de Conte\u00FAdo
-view_adminContent_repositories = Reposit\u00F3rios
-view_adminRoles_assignedGroups = Grupos de Recursos Associados
-view_adminRoles_assignedSubjects = Perfis Associados
-view_adminRoles_failLdap = Falha ao determinar se o LDAP foi configurado - assumindo como LDAP n\u00E3o configurado.
-view_adminRoles_failLdapGroups = Falha ao recuperar os grupos dispon\u00EDveis no LDAP - assumindo como LDAP sem grupos.
-view_adminRoles_failLdapGroupsRole = Falha ao carregar grupos do LDAP dispon\u00EDveis para o perfil.
-view_adminRoles_failRoles = Falha ao recuperar perfis.
-view_adminRoles_globalPerms = Permiss\u00F5es Globais
-view_adminRoles_ldapGroups = Grupos LDAP
-view_adminRoles_ldapGroupsReadOnly = Informa\u00E7\u00F5es do grupo LDAP com permiss\u00F5es apenas de leitura
-view_adminRoles_noItems = Sem itens para apresentar
-view_adminRoles_noLdap = A integra\u00E7\u00E3o com o LDAP ainda n\u00E3o foi configurada. Para configurar o LDAP acesse <a {0}>{1}</a>.
-view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
-view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
-view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
-view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
-view_adminRoles_permissions_globalPermissions = Permiss\u00F5es Globais
-view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
-view_adminRoles_permissions_isAuthorized = Autorizado?
-view_adminRoles_permissions_isRead = Leitura?
-view_adminRoles_permissions_isWrite = Escrita?
-view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
-view_adminRoles_permissions_permDesc_manageInventory = possui todas as permiss\u00F5es de Recurso, como descrito abaixo, pode criar, atualizar, excluir grupos e importar Recursos descobertos automaticamente ou manualmente.
-view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
-view_adminRoles_permissions_permDesc_manageSecurity = Pode criar, atualizar, ou excluir usu\u00E1rios e perfis (visualiza\u00E7\u00E3o \u00E9 padr\u00E3o para todos)
-view_adminRoles_permissions_permDesc_manageSettings = pode modificar a configura\u00E7\u00E3o do RHQ Server e utilizar qualquer funcionalidade relacionada ao Servidor
-view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
-view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
-view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) view child Resource creation history
-view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view child Resource deletion history
-view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
-view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
-view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
-view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
-view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
-view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
-view_adminRoles_permissions_permWriteDesc_control = execute operations; delete operation execution history items
-view_adminRoles_permissions_permWriteDesc_createChildResources = create new child Resources (for child Resources of types that are creatable)
-view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
-view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
-view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
-view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
-view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
-view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
-view_adminRoles_permissions_perm_configure = Configurar
-view_adminRoles_permissions_perm_control = Controlar
-view_adminRoles_permissions_perm_createChildResources = Create Child Resources
-view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
-view_adminRoles_permissions_perm_inventory = Invent\u00E1rio
-view_adminRoles_permissions_perm_manageAlerts = Gerenciar Alertas
-view_adminRoles_permissions_perm_manageBundles = Gerenciar Bundles
-view_adminRoles_permissions_perm_manageContent = Gerenciar Conte\u00FAdo
-view_adminRoles_permissions_perm_manageEvents = Gerenciar Eventos
-view_adminRoles_permissions_perm_manageInventory = Gerenciar Invent\u00E1rio
-view_adminRoles_permissions_perm_manageMeasurements = Gerenciar M\u00E9tricas
-view_adminRoles_permissions_perm_manageRepositories = Gerenciar Reposit\u00F3rios
-view_adminRoles_permissions_perm_manageSecurity = Gerenciar Seguran\u00E7a
-view_adminRoles_permissions_perm_manageSettings = Gerenciar Configura\u00E7\u00F5es
-view_adminRoles_permissions_read = Leitura:
-view_adminRoles_permissions_readAccessImplied = Acesso de leitura para a permiss\u00E3o {0} \u00E9 impl\u00EDcita e n\u00E3o pode ser desabilitada.
-view_adminRoles_permissions_resourcePermissions = Permiss\u00F5es de Recurso
-view_adminRoles_permissions_write = Escrita:
-view_adminRoles_perms = Permiss\u00F5es
-view_adminRoles_resourcePerms = Permiss\u00F5es do Recurso
-view_adminRoles_roleAdded = Perfil [{0}] adicionado.
-view_adminRoles_roleDeleteFailed = Falha ao excluir o perfil [{0}].
-view_adminRoles_roleDeleted = Perfil [{0}] exclu\u00EDdo.
-view_adminRoles_roleExists = O perfil com nome [{0}] j\u00E1 existe.
-view_adminRoles_roleUpdateFailed = Falha ao atualizar o perfil [{0}].
-view_adminRoles_roleUpdated = Perfil [{0}] atualizado.
-view_adminSecurity_roles = Perfis
-view_adminSecurity_users = Usu\u00E1rios
-view_adminTemplates_disabledAlertTemplates = Templates de Alerta Desabilitados
-view_adminTemplates_disabledMetricTemplates = Templates de M\u00E9trica Desabilitados
-view_adminTemplates_editAlertTemplate = Editar Template de Alerta
-view_adminTemplates_editMetricTemplate = Editar Template de M\u00E9trica
-view_adminTemplates_enabledAlertTemplates = Templates de Alerta Habilitados
-view_adminTemplates_enabledMetricTemplates = Templates de M\u00E9trica Habilitados
-view_adminTemplates_platformServices = Servi\u00E7os da Plataforma
-view_adminTemplates_platforms = Plataformas
-view_adminTemplates_prompt_disabledAlertTemplates = N\u00FAmero de templates de alerta criados mas desabilitados para este tipo de recurso
-view_adminTemplates_prompt_disabledMetricTemplates = N\u00FAmero de coletas de m\u00E9trica desabilitadas por padr\u00E3o para este tipo de recurso
-view_adminTemplates_prompt_enabledAlertTemplates = N\u00FAmero de templates de alerta habilitados para este tipo de recurso
-view_adminTemplates_prompt_enabledMetricTemplates = N\u00FAmero de coletas de m\u00E9trica habilitadas por padr\u00E3o para este tipo de recurso
-view_adminTemplates_servers = Servidores
-view_adminTopology_affinityGroups = Grupos de Afinidade
-view_adminTopology_agents = Agentes
-view_adminTopology_partitionEvents = Eventos na Parti\u00E7\u00E3o
-view_adminTopology_remoteAgentInstall = Instala\u00E7\u00E3o Remota de Agentes
-view_adminTopology_servers = Servidores
-view_adminUsersDetails_dataTypeName = usu\u00E1rio
-view_adminUsersList_dataTypeName = usu\u00E1rio
-view_adminUsersList_dataTypeNamePlural = usu\u00E1rios
-view_admin_administration = Administra\u00E7\u00E3o
-view_admin_configuration = Configura\u00E7\u00E3o
-view_admin_content = Conte\u00FAdo
-view_admin_downloads_agentDownload = Agent Download
-view_admin_downloads_agent_buildNumber = Agent Build
-view_admin_downloads_agent_help = <p> This is the RHQ Agent Update Binary jar file. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>Agent Install</h3> <p> <b>java -jar <agent-download.jar> --install[ = <new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>Agent Update</h3> <p> <b>java -jar <agent-download.jar> --update[ = <old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
-view_admin_downloads_agent_link_label = Link
-view_admin_downloads_agent_link_value = Download Agent {0} ({1})
-view_admin_downloads_agent_loadError = Cannot get agent version info
-view_admin_downloads_agent_md5 = Agent MD5
-view_admin_downloads_agent_version = Agent Version
-view_admin_downloads_bundleDownload = Bundle Deployer Download
-view_admin_downloads_bundle_help = <p> view_admin_downloads_bundle_link_label = Link
-view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
-view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
-view_admin_downloads_cliDownload = Command Line Client Download
-view_admin_downloads_cli_buildNumber = CLI Build
-view_admin_downloads_cli_help = <p> view_admin_downloads_cli_link_label = Link
-view_admin_downloads_cli_link_value = Download CLI {0} ({1})
-view_admin_downloads_cli_loadError = Cannot get CLI version info
-view_admin_downloads_cli_md5 = CLI MD5
-view_admin_downloads_cli_version = CLI Version
-view_admin_downloads_connectorsDownload = Connectors Download
-view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
-view_admin_downloads_connectors_loadError = Cannot get connectors info
-view_admin_downloads_connectors_none = No connectors are available for download
-view_admin_landing = Nesta se\u00E7\u00E3o \u00E9 poss\u00EDvel administrar propriedades globais do RHQ. Isso inclui configura\u00E7\u00F5es de Seguran\u00E7a, Plugins, e gerenciamento de servidores RHQ e agentes.
-view_admin_measTemplates_title = Template Metric Collection Schedules
-view_admin_measTemplates_updateExisting_title = Update Existing Schedules
-view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
-view_admin_security = Seguran\u00E7a
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
-view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
-view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
-view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
-view_admin_systemSettings_BaseURL_name = GUI Console URL
-view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
-view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
-view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
-view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
-view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
-view_admin_systemSettings_DataMaintenance_name = Database Maintenance Period
-view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
-view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
-view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
-view_admin_systemSettings_EnableAgentAutoUpdate_name = Enable Agent Auto-Updates
-view_admin_systemSettings_EnableDebugMode_desc = If enabled, the server will enter debug mode.
-view_admin_systemSettings_EnableDebugMode_name = Enable Debug Mode
-view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
-view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
-view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_EventPurge_name = Delete Events Older Than
-view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
-view_admin_systemSettings_JAASProvider_name = Enable LDAP
-view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou = People,dc = redhat,dc = com
-view_admin_systemSettings_LDAPBaseDN_name = Search Base
-view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn = Manager,dc = redhat,dc = com
-view_admin_systemSettings_LDAPBindDN_name = Username
-view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
-view_admin_systemSettings_LDAPBindPW_name = Password
-view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser = true
-view_admin_systemSettings_LDAPFilter_name = Search Filter
-view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
-view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
-view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
-view_admin_systemSettings_LDAPLoginProperty_name = Login Property
-view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
-view_admin_systemSettings_LDAPProtocol_name = SSL
-view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
-view_admin_systemSettings_LDAPUrl_name = LDAP URL
-view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
-view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
-view_admin_systemSettings_cannotLoadServerDetails = Cannot load server details
-view_admin_systemSettings_cannotLoadSettings = Cannot obtain the current system settings
-view_admin_systemSettings_fixBeforeSaving = Please fix the invalid values before saving
-view_admin_systemSettings_group_baseline = Automatic Baseline Configuration Properties
-view_admin_systemSettings_group_dataMgr = Data Manager Configuration Properties
-view_admin_systemSettings_group_general = General Configuration Properties
-view_admin_systemSettings_group_ldap = LDAP Configuration Properties
-view_admin_systemSettings_saveFailure = Failed to save the system settings
-view_admin_systemSettings_savedSettings = You successfully saved the system properties
-view_admin_systemSettings_serverDetails = Server Details
-view_admin_systemSettings_serverDetails_buildNumber = Build Number
-view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
-view_admin_systemSettings_serverDetails_dbDriverName = Database Driver Name
-view_admin_systemSettings_serverDetails_dbDriverVersion = Database Driver Version
-view_admin_systemSettings_serverDetails_dbName = Database Product Name
-view_admin_systemSettings_serverDetails_dbUrl = Database Connection URL
-view_admin_systemSettings_serverDetails_dbVersion = Database Product Version
-view_admin_systemSettings_serverDetails_installDir = Server Installation Directory
-view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
-view_admin_systemSettings_serverDetails_time = Server Local Time
-view_admin_systemSettings_serverDetails_tz = Server Time Zone
-view_admin_topology = Topologia
-view_alert_common_tab_conditions = Condi\u00E7\u00F5es
-view_alert_common_tab_conditions_expression = Disparar alerta quando
-view_alert_common_tab_conditions_expression_tooltip = Determina se QUALQUER UMA ou TODAS as condi\u00E7\u00F5es devem ser satisfeitas para que todo o conjunto de condi\u00E7\u00F5es seja considerado verdadeiro.
-view_alert_common_tab_conditions_modal_title = Adicionar nova condi\u00E7\u00E3o.
-view_alert_common_tab_conditions_recovery_disabled = Este alerta desativou a sua defini\u00E7\u00E3o.
-view_alert_common_tab_conditions_recovery_enabled = ''{0}'' disparado para ser reativado.
-view_alert_common_tab_conditions_text = Condi\u00E7\u00E3o
-view_alert_common_tab_conditions_type_availability = Mudan\u00E7a na Disponibilidade
-view_alert_common_tab_conditions_type_availability_down = Indispon\u00EDvel
-view_alert_common_tab_conditions_type_availability_up = Dispon\u00EDvel
-view_alert_common_tab_conditions_type_event = Detec\u00E7\u00E3o de Envento
-view_alert_common_tab_conditions_type_event_matching = combinando com o evento de origem
-view_alert_common_tab_conditions_type_metric_baseline = Valor da m\u00E9trica excede a linha de base (baseline)
-view_alert_common_tab_conditions_type_metric_baseline_verb = de
-view_alert_common_tab_conditions_type_metric_calltime_change = Mudan\u00E7a no tempo de chamada
-view_alert_common_tab_conditions_type_metric_calltime_change_verb = ao menos
-view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Aumento
-view_alert_common_tab_conditions_type_metric_calltime_delta_other = Mudan\u00E7a
-view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Redu\u00E7\u00E3o
-view_alert_common_tab_conditions_type_metric_calltime_destination = com o destino da chamada correspondente
-view_alert_common_tab_conditions_type_metric_calltime_threshold = Tempo de chamada excede o limiar (threshold)
-view_alert_common_tab_conditions_type_metric_change = Mudan\u00E7a no valor da m\u00E9trica
-view_alert_common_tab_conditions_type_metric_threshold = Valor da M\u00E9trica excede o limiar (threshold)
-view_alert_common_tab_conditions_type_metric_trait_change = Mudan\u00E7a de Carater\u00EDstica
-view_alert_common_tab_conditions_type_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
-view_alert_common_tab_conditions_type_operation_status = resultado com status
-view_alert_common_tab_conditions_type_resource_configuration = Mudan\u00E7a na Configura\u00E7\u00E3o do Recurso
-view_alert_common_tab_conditions_value = Valor
-view_alert_common_tab_dampening = Sensibilidade
-view_alert_common_tab_dampening_category_consecutive_count = Consecutivos
-view_alert_common_tab_dampening_category_consecutive_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias consecutivas em que o conjunto de condi\u00E7\u1E4Des for satisfeito.
-view_alert_common_tab_dampening_category_duration_count = Per\u00EDodo de Tempo
-view_alert_common_tab_dampening_category_duration_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias em que o conjunto de condi\u00E7\u00F5es \u00E9 satisfeito dentro de um dado per\u00EDodo de tempo.
-view_alert_common_tab_dampening_category_none = N\u00E3o definido
-view_alert_common_tab_dampening_category_none_tooltip = Sensibilidade desabilitada. Cada vez que o conjunto de condi\u00E7\u00F5es for satisfeito, um alerta ser\u00E1 disparado.
-view_alert_common_tab_dampening_category_partial_count = \u00DAltimas N verifica\u00E7\u00F5es
-view_alert_common_tab_dampening_category_partial_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias em que o conjunto de condi\u00E7\u00F5es \u00E9 satisfeito durante as \u00FAltimas N verifica\u00E7\u00F5es.
-view_alert_common_tab_dampening_consecutive_occurrences_label = Ocorr\u00EAcias
-view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = O n\u00FAmero de vezes que o conjunto de condi\u00E7\u00F5es deve ser satisfeito antes do alerta ser disparado.
-view_alert_common_tab_dampening_duration_occurrences_label = Ocorr\u00EAncias
-view_alert_common_tab_dampening_duration_occurrences_label_tooltip = O n\u00FAmero de vezes que o conjunto de condi\u00E7\u00F5es deve ser satisfeito durante o per\u00EDodo de tempo definido antes do alerta ser disparado.
-view_alert_common_tab_dampening_duration_period_label = Per\u00EDodo de Tempo
-view_alert_common_tab_dampening_duration_period_label_tooltip = Espa\u00E7o de tempo em que o conjunto de condi\u00E7\u00F5es ser\u00E1 testado para verificar se o n\u00FAmero de ocorr\u00EAncias definido \u00E9 satisfeito.
-view_alert_common_tab_dampening_partial_evalatuions_label = Verifica\u00E7\u00F5es
-view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = O total de vezes que o conjunto de condi\u00E7\u00F5es ser\u00E1 testado para certificar-se de que o n\u00FAmero de ocorr\u00EAncias definido foi satisfeito.
-view_alert_common_tab_dampening_partial_occurrences_label = Ocorr\u00EAncias
-view_alert_common_tab_dampening_partial_occurrences_label_tooltip = O n\u00FAmero de vezes que o conjunto de condi\u00E7\u00F5es deve ser satisfeito durante as \u00FAltimas N verifica\u00E7\u00F5es antes do alerta ser disparado.
-view_alert_common_tab_general = Propriedades Gerais
-view_alert_common_tab_invalid_condition_category = Categoria de condi\u00E7\u00E3o inv\u00E1lida - favor reportar como um bug: {0}
-view_alert_common_tab_invalid_dampening_category = Categora de sensibilidade inv\u00E1lida - favor reportar como um bug: {0}
-view_alert_common_tab_invalid_time_units = Unidade de tempo inv\u00E1lida - favor reportar como um bug: {0}
-view_alert_common_tab_notifications = Notifica\u00E7\u00F5es
-view_alert_common_tab_notifications_all_emails = Todos os Emails
-view_alert_common_tab_notifications_bad_emails = Emails recusados
-view_alert_common_tab_notifications_message = Mensagem
-view_alert_common_tab_notifications_sender = Remetente
-view_alert_common_tab_notifications_status = Status
-view_alert_common_tab_recovery = Recupera\u00E7\u00E3o~
-view_alert_definition_condition_editor_avilability_option_down = INDISPON\u00CDVEL
-view_alert_definition_condition_editor_avilability_option_up = DISPON\u00CDVEL
-view_alert_definition_condition_editor_avilability_tooltip = Especifica a mudan\u00E7a de estado na disponibilidade do recurso que ir\u00E1 disparar a condi\u00E7\u00E3o.
-view_alert_definition_condition_editor_avilability_value = Disponibilidade
-view_alert_definition_condition_editor_common_avg = M\u00E9dio
-view_alert_definition_condition_editor_common_max = M\u00E1ximo
-view_alert_definition_condition_editor_common_min = M\u00EDnimo
-view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
-view_alert_definition_condition_editor_event_regex = Express\u00E3o Regular
-view_alert_definition_condition_editor_event_regex_tooltip = Se definida, a condi\u00E7\u00E3o somente ser\u00E1 disparada caso o evento satisfa\u00E7a a express\u00E3o.
-view_alert_definition_condition_editor_event_severity = Severidade do Evento
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
-view_alert_definition_condition_editor_event_tooltip = Define a severeidade do evento para disparar a condi\u00E7\u00E3o. Caso seja definida uma express\u00E3o regular, a condi\u00E7\u00E3o somente ser\u00E1 disparada se o evento satisfazer a express\u00E3o.
-view_alert_definition_condition_editor_metric_baseline_percentage = Percentual da linha de base
-view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = Valor da m\u00E9trica coletada usada para disparo da condi\u00E7\u00E3o quando comparado ao valor da linha de base selecionada
-view_alert_definition_condition_editor_metric_baseline_tooltip = Especifica a linha de base que, quando violada, dispara a condi\u00E7\u00E3o. O valor especificado \u00E9 o percentual do valor da linha de base informado.
-view_alert_definition_condition_editor_metric_baseline_value = Linha de base (<i>baseline</i>)
-view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentual de Mudan\u00E7a
-view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = Valor do tempo de chamada coletado usado para disparar a condi\u00E7\u00E3o quando diferir do percentual do valor limite do tempo de chamada definido.
-view_alert_definition_condition_editor_metric_calltime_change_tooltip = Especifica o valor do tempo de chamada que, quanto alterado, dispara a condi\u00E7\u00E3o. \u00C9 necess\u00E1rio especificar o tempo limite para a chamada (m\u00EDnimo, m\u00E1ximo ou m\u00E9dio) e o percental de mudan\u00E7a que deve ocorrer.
-view_alert_definition_condition_editor_metric_calltime_common_comparator = Compara\u00E7\u00E3o
-view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Mudan\u00E7as
-view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Ganhos
-view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Redu\u00E7\u00F5es
-view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = Como o valor do tempo de chamada deve ser comparado ao valor limite
-view_alert_definition_condition_editor_metric_calltime_common_limit = Tempo limite da chamada
-view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = Tempo de chamada limite a ser comparado com o valor informado
-view_alert_definition_condition_editor_metric_calltime_common_name = M\u00E9trica do tempo de chamada
-view_alert_definition_condition_editor_metric_calltime_common_regex = Express\u00E3o Regular
-view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = Se especificada, essa \u00E9 a express\u00E3o regular a ser satisfeita pela chamada para disparar a condi\u00E7\u00E3o.
-view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Especifica um tempo limite para a chamada que, quando alcan\u00E7ado, dispara a condi\u00E7\u00E3o. O valor especificado deve ser absoluto e com uma unidade de medida opcional. \u00C9 necess\u00E1rio especificar o tempo limite da chamada para compar\u00E1-lo ao valor: m\u00EDnimo, m\u00E1ximo ou m\u00E9dio.
-view_alert_definition_condition_editor_metric_calltime_threshold_value = Valor do tempo de chamada
-view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = O valor do limiar (<i>threshold</i>) da m\u00E9trica usado para disparar a condi\u00E7\u00E3o quando comparado ao mecanismo de compara\u00E7\u00E3o escolhido.
-view_alert_definition_condition_editor_metric_change_tooltip = Especifica a m\u00E9trica cujo valor deve ser alterado para disparar a condi\u00E7\u00E3o.
-view_alert_definition_condition_editor_metric_common_definition_not_found = Deve existir uma defini\u00E7\u00E3o para a m\u00E9trica - algo est\u00E1 incorreto
-view_alert_definition_condition_editor_metric_threshold_comparator = Mecanismo de Compara\u00E7\u00E3o
-view_alert_definition_condition_editor_metric_threshold_comparator_equal = Igual \u00E0
-view_alert_definition_condition_editor_metric_threshold_comparator_greater = Maior que
-view_alert_definition_condition_editor_metric_threshold_comparator_less = Menor que
-view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = Como a m\u00E9trica coletada deve ser comparada ao threshold estabelecido
-view_alert_definition_condition_editor_metric_threshold_name = M\u00E9trica
-view_alert_definition_condition_editor_metric_threshold_tooltip = Especifica um threshold que, quando alcan\u00E7ado, dispara a condi\u00E7\u00E3o. O valor especificado deve ser absoluto e com uma unidade de medida opcional.
-view_alert_definition_condition_editor_metric_threshold_value = Valor da M\u00E9trica
-view_alert_definition_condition_editor_metric_threshold_value_tooltip = Limiar (threshold) da m\u00E9trica utilizado na compara\u00E7\u00E3o como condi\u00E7\u00E3o de disparo.
-view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_trait_change_value = Caracter\u00EDstica
-view_alert_definition_condition_editor_operation_status = Status da Opera\u00E7\u00E3o
-view_alert_definition_condition_editor_operation_status_canceled = Cancelada
-view_alert_definition_condition_editor_operation_status_failure = Falha
-view_alert_definition_condition_editor_operation_status_inprogress = Em andamento
-view_alert_definition_condition_editor_operation_status_success = Sucesso
-view_alert_definition_condition_editor_operation_tooltip = Define o resultado esperado quando a opera\u00E7\u00E3o selecionada for executada para dispararo da confi\u00E7\u00E3o.
-view_alert_definition_condition_editor_operation_value = Opera\u00E7\u00E3o
-view_alert_definition_condition_editor_option_availability = Mudan\u00E7a de Disponibilidade
-view_alert_definition_condition_editor_option_event = Detec\u00E7\u00E3o de Evento
-view_alert_definition_condition_editor_option_label = Tipo de Condi\u00E7\u00E3o
-view_alert_definition_condition_editor_option_metric_baseline = Threshold base da M\u00E9trica
-view_alert_definition_condition_editor_option_metric_calltime_change = Mudan\u00E7a no tempo de chamada
-view_alert_definition_condition_editor_option_metric_calltime_threshold = Tempo limite da chamada
-view_alert_definition_condition_editor_option_metric_change = Mudan\u00E7a no valor da M\u00E9trica
-view_alert_definition_condition_editor_option_metric_threshold = Threshold (valor absoluto) da M\u00E9trica
-view_alert_definition_condition_editor_option_metric_trait_change = Mudan\u00E7a de Carcter\u00EDstica
-view_alert_definition_condition_editor_option_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
-view_alert_definition_condition_editor_option_resource_configuration = Mudan\u00E7a na Configura\u00E7\u00E3o do Recurso
-view_alert_definition_condition_editor_resource_configuration_tooltip = Essa condi\u00E7\u00E3o \u00E9 disparada quando a configura\u00E7\u00E3o do recurso for alterada.
-view_alert_definition_for_group = Visualizar Defini\u00E7\u00E3o de Grupo
-view_alert_definition_for_type = Visualizar Template
-view_alert_definition_notification_cliScript_editor_anotherUser = Another User
-view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
-view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
-view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
-view_alert_definition_notification_cliScript_editor_repository = Repository
-view_alert_definition_notification_cliScript_editor_script = Script
-view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
-view_alert_definition_notification_cliScript_editor_selectRepoFirst = Select a repository first.
-view_alert_definition_notification_cliScript_editor_thisUser = Myself
-view_alert_definition_notification_cliScript_editor_uploadNewScript = Upload New Script
-view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
-view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
-view_alert_definition_notification_editor_delete_confirm = Tem certeza de que deseja excluir as notifica\u00E7\u00F5es selecionadas?
-view_alert_definition_notification_editor_field_configuration = Configura\u00E7\u00E3o
-view_alert_definition_notification_editor_field_configuration_loadFailed = Falha ao obter a configura\u00E7\u00E3o
-view_alert_definition_notification_editor_field_configuration_not_loaded = Desconhecido
-view_alert_definition_notification_editor_field_sender = Remetente
-view_alert_definition_notification_editor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel obter remetentes
-view_alert_definition_notification_editor_loadFailed_single = N\u00E3o \u00E9 poss\u00EDvel obter a configura\u00E7\u00E3o do remetente
-view_alert_definition_notification_editor_none_available = Remetentes n\u00E3o dispon\u00EDveis
-view_alert_definition_notification_editor_saveFailed = N\u00E3o foi poss\u00EDvel salvar a configura\u00E7\u00E3o
-view_alert_definition_notification_editor_sender = Remetente da Notifica\u00E7\u00E3o
-view_alert_definition_notification_editor_title_add = Adicionar Notifica\u00E7\u00E3o
-view_alert_definition_notification_editor_title_edit = Editar Notifica\u00E7\u00E3o
-view_alert_definition_notification_operation_editor_common_operation = Opera\u00E7\u00E3o
-view_alert_definition_notification_operation_editor_mode_relative = Recurso parente
-view_alert_definition_notification_operation_editor_mode_specific = Recurso Espec\u00EDfico
-view_alert_definition_notification_operation_editor_mode_this = Este Recurso
-view_alert_definition_notification_operation_editor_mode_title = Modo de Sele\u00E7\u00E3o do Recurso
-view_alert_definition_notification_operation_editor_mode_unknown = OP\u00C7\u00C3O INV\u00C1LIDA - BUG!
-view_alert_definition_notification_operation_editor_operations_loadFailed = Falha ao carregar a lista de opera\u00E7\u00F5es dispon\u00EDveis
-view_alert_definition_notification_operation_editor_operations_no_parameters = Esta opera\u00E7\u00E3o n\u00E3o recebe par\u00E2metros
-view_alert_definition_notification_operation_editor_relative_ancestor = Iniciar a busca a partir de
-view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel obter a ascend\u00EAncia do tipo
-view_alert_definition_notification_operation_editor_relative_ancestor_root = Tipo do Ancestral Raiz
-view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Selecione o topo da hierarquia para buscar a \u00E1rvore de descendentes para Filtro por Tipo
-view_alert_definition_notification_operation_editor_relative_descendant = Ent\u00E3o procure por
-view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = Um nome especifico para identificar unicamente um recurso quando existir mais de um do mesmo tipo. Isso \u00E9 opcional, se definido, sempre ser\u00E1 um recurso do tipo slecionda na hierarquia.
-view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = N\u00E3o \u00E9 poss\u00EDvel obter os tipos de descendentes
-view_alert_definition_notification_operation_editor_relative_descendant_tooltip = Tipo do recurso a ser procurado a baixo do tipo raiz definido na sele\u00E7\u00E3o 'Inicia a Pesquesa a partir de'.
-view_alert_definition_notification_operation_editor_specific_pick_button = Selecionar
-view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Favor selecionar um recurso
-view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Selecione um recurso que possua um ou mais opera\u00E7\u00F5es
-view_alert_definition_notification_operation_editor_specific_pick_text = Selecione um recurso...
-view_alert_definition_notification_operation_editor_specific_resource = Recurso
-view_alert_definition_notification_role_editor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel determinar os perfis atuais - iniciando vazio
-view_alert_definition_notification_role_editor_restoreFailed = N\u00E3o \u00E9 poss\u00EDvel usar os perfis atuais - iniciando vazio
-view_alert_definition_notification_role_editor_saveFailed = N\u00E3o foi poss\u00EDvel salvar os perfis selecionados
-view_alert_definition_notification_user_editor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel determinar os usu\u00E1rios atuais - iniciando vazio
-view_alert_definition_notification_user_editor_restoreFailed = N\u00E3o foi poss\u00EDvel usar os usu\u00E1rios atuais - iniciando vazio
-view_alert_definition_notification_user_editor_saveFailed = N\u00E3o foi poss\u00EDvel salvar os usu\u00E1rios seleciondados
-view_alert_definition_recovery_editor_disable_when_fired = Desabilitar quando disparado
-view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indica se este alerta deve ser desabilitado ap\u00F3s ser disparado. Uma vez desabilitado, o alerta pode ser reativado manualmente ou um alerta de recupera\u00E7\u00E3o pode ser definido para reativ\u00E1-lo automaticamente. If this alert is a recovery alert itself, this setting cannot be turned on.
-view_alert_definition_recovery_editor_loadFailed = N\u00E3o foi poss\u00EDvel construir o menu de recupera\u00E7\u00E3o
-view_alert_definition_recovery_editor_none_available = Nenhum
-view_alert_definition_recovery_editor_recovery_alert = Alerta de Recupera\u00E7\u00E3o
-view_alert_definition_recovery_editor_recovery_alert_tooltip = O Alerta a ser recuperado (reativado) ap\u00F3s o disparo deste alerta. N\u00E3o selecione um alerta aqui caso n\u00E3o esteja definindo um alerta de recupera\u00E7\u00E3o.
-view_alert_definitions_create_failure = Falha na cria\u00E7\u00E3o da defini\u00E7\u00E3o do alerta
-view_alert_definitions_create_success = Defini\u00E7\u00E3o do alerta criada com sucesso
-view_alert_definitions_delete_confirm = Excluir defini\u00E7\u00F5es para o alerta selecionado?
-view_alert_definitions_delete_failure = Falha aos excluir as defini\u00E7\u00F5es do alerta selecionado
-view_alert_definitions_delete_success = Defini\u00E7\u00F5es do alerta {0} exclu\u00EDdas com sucesso
-view_alert_definitions_disable_confirm = Desabilitar as defini\u00E7\u00F5es para o alerta selecionado?
-view_alert_definitions_disable_failure = Falha ao desabilitar defini\u00E7\u00F5es para o alerta selecionado
-view_alert_definitions_disable_success = Defini\u00E7\u00F5es do alerta {0} desabilitadas com sucesso
-view_alert_definitions_enable_confirm = Habilitar a(s) defini\u00E7\u00E3o(\u00F5es) para o alerta selecionado?
-view_alert_definitions_enable_failure = Falha ao habilitar defini\u00E7\u00F5es para o alerta selecionado
-view_alert_definitions_enable_success = Defini\u00E7\u00F5es do alerta {0} habilitados com sucesso
-view_alert_definitions_loadFailed = Falha ao obter a defini\u00E7\u00E3o do alerta
-view_alert_definitions_loadFailed_single = Falha ao obter a defini\u00E7\u00E3o do alerta com ID {0}
-view_alert_definitions_table_title_group = Defini\u00E7\u00F5es de Alertas para Grupo
-view_alert_definitions_table_title_resource = Defini\u00E7\u00F5es de Alerta para Recurso
-view_alert_definitions_update_failure = Falha ao atualizar a defini\u00E7\u00E3o do alerta
-view_alert_definitions_update_success = Defini\u00E7\u00E3o do alerta atualizada com sucesso
-view_alert_details_breadcrumb = Detalhes
-view_alert_details_field_ack_at = Verificado em
-view_alert_details_field_ack_by = Verificado por
-view_alert_details_field_recovery_info = Informa\u00E7\u00E3o de Recupera\u00E7\u00E3o
-view_alert_details_loadFailed = Falha ao recuperar detalhes do alerta
-view_alerts_ack_confirm = Confirma o(s) alerta(s) selecionado(s)?
-view_alerts_ack_confirm_all = Confirma todos os alertas?
-view_alerts_ack_failure = Falha ao confirmar alertas com os seguintes IDs: {0}
-view_alerts_ack_failure_all = N\u00E3o foi poss\u00EDvel confirmar todos os alertas
-view_alerts_ack_success = Alertas {0} confirmados com sucesso
-view_alerts_delete_confirm = Excluir o(s) alerta(s) selecionado(s)?
-view_alerts_delete_confirm_all = Excluir todos os alertas?
-view_alerts_delete_failure = Falha ao excluir alertas com os seguintes IDs: {0}
-view_alerts_delete_failure_all = N\u00E3o foi poss\u00EDvel excluir os alertas
-view_alerts_delete_success = Alertas {0} exclu\u00EDdos com sucesso
-view_alerts_field_ack_status = Status
-view_alerts_field_ack_status_ack = Ack ({0})
-view_alerts_field_ack_status_ackHover = Acknowledged by {0} at {1}
-view_alerts_field_ack_status_empty = Ainda n\u00E3o verificado
-view_alerts_field_ack_status_filled = {0} verificado em {1}
-view_alerts_field_ack_status_noAck = No Ack
-view_alerts_field_ack_status_noAckHover = Not yet Acknowledged
-view_alerts_field_ack_subject = Assunto da Verifica\u00E7\u00E3o
-view_alerts_field_ack_time = Data de Verifica\u00E7\u00E3o
-view_alerts_field_condition_text = Condi\u00E7\u00E3o
-view_alerts_field_condition_text_many = M\u00FAltiplas condi\u00E7\u00F5es
-view_alerts_field_condition_text_none = Sem condi\u00E7\u00F5es
-view_alerts_field_condition_value = Valor da Condi\u00E7\u00E3o
-view_alerts_field_created_time = Data de Cria\u00E7\u00E3o
-view_alerts_field_enabled = Habilitado
-view_alerts_field_modified_time = Data de Altera\u00E7\u00E3o
-view_alerts_field_name = Nome
-view_alerts_field_parent = Pai
-view_alerts_field_priority = Prioridade
-view_alerts_field_protected = Protegido
-view_alerts_field_protected_tooltip = Se verdadeiro, esta defini\u00E7\u00E3o \u00E9 protegida de altera\u00E7\u00F5es feitas na defini\u00E7\u00E3o pai, ou seja, altera\u00E7\u00F5es realizadas no pai n\u00E3o sobrescrevem esta defini\u00E7\u00E3o.
-view_alerts_field_resource = Recurso
-view_alerts_loadFailed = Falha ao carregar dados dos alertas
-view_alerts_table_filter_priority = Filtro de Prioridade
-view_alerts_table_title_group = Hist\u00F3rico de Alertas do Grupo
-view_alerts_table_title_resource = Hist\u00F3rico de Alertas do Recurso
-view_autoDiscoveryQ_committed = Committed
-view_autoDiscoveryQ_confirmSelect = Also select the platform children?
-view_autoDiscoveryQ_deleted = Deleted
-view_autoDiscoveryQ_field_discoveryTime = Data e Hora da Descoberta
-view_autoDiscoveryQ_field_inventoryStatus = Status do Invet\u00E1rio
-view_autoDiscoveryQ_field_key = Chave do Recurso
-view_autoDiscoveryQ_field_name = Nome do Recurso
-view_autoDiscoveryQ_field_parentId = ID Pai
-view_autoDiscoveryQ_ignore = Ignorar
-view_autoDiscoveryQ_ignoreFailure = Falha ao ignorar recursos.
-view_autoDiscoveryQ_ignoreSuccessful = Os recursos selecionados foram ignorados com sucesso.
-view_autoDiscoveryQ_ignored = Ignorado
-view_autoDiscoveryQ_import = Importar
-view_autoDiscoveryQ_importFailure = Falha ao importar recursos
-view_autoDiscoveryQ_importSuccessful = Os recursos selecionados foram importados com sucesso.
-view_autoDiscoveryQ_loadFailure = Falha ao carregar a fila de descoberta do invent\u00E1rio
-view_autoDiscoveryQ_new = Novo
-view_autoDiscoveryQ_newAndIgnored = Novo e Ignorado
-view_autoDiscoveryQ_noItems = N\u00E3o h\u00E1 itens a serem mostrados
-view_autoDiscoveryQ_noperm = (Required manage inventory permissions missing. See Administrator to change)~
-view_autoDiscoveryQ_showStatus = Show
-view_autoDiscoveryQ_title = Fila de Autodescoberta
-view_autoDiscoveryQ_unignore = N\u00E3o ignorar
-view_autoDiscoveryQ_unignoreFailure = Falha ao reimportar os recursos
-view_autoDiscoveryQ_unignoreSuccessful = You have successfully unignored the selected resources.~
-view_autoDiscoveryQ_uninventoried = Uninventoried
-view_bundleVersion_loadFailure = Failed to load bundle version data~
-view_bundle_bundle = Bundle~
-view_bundle_bundleDeployment = Bundle Deployment~
-view_bundle_bundleDeployments = Bundle Deployments~
-view_bundle_bundleDestinations = Bundle Destinations~
-view_bundle_bundleFiles = Bundle Files~
-view_bundle_bundleType = Bundle Type~
-view_bundle_bundleVersion = Bundle Version~
-view_bundle_bundleVersions = Bundle Versions~
-view_bundle_bundles = Bundles~
-view_bundle_createWizard_bundleDistro = Bundle Distribution~
-view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database~
-view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]~
-view_bundle_createWizard_clickToUploadRecipe = Click to upload a recipe file~
-view_bundle_createWizard_createFailure = Failed to create the bundle~
-view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]~
-view_bundle_createWizard_enterRecipe = Please supply a valid recipe
-view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
-view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file~
-view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file~
-view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server~
-view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle~
-view_bundle_createWizard_noBundleTypesAvail = No bundle types are available~
-view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments~
-view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
-view_bundle_createWizard_recipeOption = Recipe~
-view_bundle_createWizard_title = Create Bundle~
-view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files~
-view_bundle_createWizard_uploadOption = Upload~
-view_bundle_createWizard_uploadStepName = Provide a Bundle Distribution~
-view_bundle_createWizard_urlOption = URL~
-view_bundle_createWizard_windowTitle = Bundle Creation Wizard~
-view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
-view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted.
-view_bundle_deploy = Deploy~
-view_bundle_deployDir = Deploy Directory~
-view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms~
-view_bundle_deployWizard_deploying = Deploying...~
-view_bundle_deployWizard_deploymentCreated = Created Deployment...~
-view_bundle_deployWizard_deploymentCreatedDetail = Created deployment [{0}] description [{1}]~
-view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
-view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!~
-view_bundle_deployWizard_deploymentScheduledDetail = Scheduled bundle deployment [{0}] destination group [{1}]~
-view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
-view_bundle_deployWizard_destinationCreatedDetail = Created destination [{0}] description [{1}]~
-view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
-view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel:
-view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)~
-view_bundle_deployWizard_error_11 = Failed to find defined deployments.~
-view_bundle_deployWizard_error_12 = Failed to find defined bundles.~
-view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel:
-view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!~
-view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}~
-view_bundle_deployWizard_error_5 = Failed to Create Deployment!~
-view_bundle_deployWizard_error_6 = Failed to create deployment: {0}~
-view_bundle_deployWizard_error_7 = Failed to get deployment name.~
-view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down~
-view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage:~
-view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.~
-view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
-view_bundle_deployWizard_getDestStep = New Destination~
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)~
-view_bundle_deployWizard_getDest_desc = Destination Description~
-view_bundle_deployWizard_getDest_name = Destination Name~
-view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
-view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)~
-view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description~
-view_bundle_deployWizard_getInfo_deploymentName = Deployment Name~
-view_bundle_deployWizard_getOptionsStep = Deploy Options~
-view_bundle_deployWizard_getOptions_deployLater = Deploy Later~
-view_bundle_deployWizard_getOptions_deployNow = Deploy Now~
-view_bundle_deployWizard_getOptions_deployTime = Deployment Time~
-view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle~
-view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.~
-view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version~
-view_bundle_deployWizard_selectVersion_latest = Latest Version [{0}]~
-view_bundle_deployWizard_selectVersion_live = Live Version [{0}]~
-view_bundle_deployWizard_selectVersion_select = Select Version from List:~
-view_bundle_deployWizard_title = Bundle Deployment Wizard~
-view_bundle_deploy_action = Action~
-view_bundle_deploy_backButton = Back to Destination~
-view_bundle_deploy_clickForError = Click the icon for the error message
-view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
-view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
-view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
-view_bundle_deploy_deployedBy = Deployed By
-view_bundle_deploy_deploymentPlatforms = Deployment Platforms~
-view_bundle_deploy_installDetails = Install Details~
-view_bundle_deploy_loadBundleFailure = Failed to find bundle~
-view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments~
-view_bundle_deploy_loadFailure = Failed to load bundle deployment~
-view_bundle_deploy_name = Deployment Name~
-view_bundle_deploy_operatingSystem = Operating System~
-view_bundle_deploy_selectARow = Select a row to show installation details~
-view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags~
-view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags~
-view_bundle_deploy_time = Deployment Time~
-view_bundle_deployed = Deployed~
-view_bundle_deployments = Deployments~
-view_bundle_dest_backToBundle = Back to Bundle~
-view_bundle_dest_created = Created~
-view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
-view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
-view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
-view_bundle_dest_deployDir = Deploy Directory~
-view_bundle_dest_group = Group~
-view_bundle_dest_lastDeployedVersion = Last Deployed Version~
-view_bundle_dest_lastDeploymentDate = Last Deployment Date~
-view_bundle_dest_lastDeploymentStatus = Last Deployment Status~
-view_bundle_dest_loadFailure = Failed to load bundle destinations~
-view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information~
-view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
-view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
-view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
-view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
-view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags~
-view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags~
-view_bundle_destinations = Destinations~
-view_bundle_fileListView_fileSize = File Size~
-view_bundle_fileListView_loadFailure = Failed to load bundle file data~
-view_bundle_fileListView_md5 = MD5
-view_bundle_fileListView_sha256 = SHA256
-view_bundle_files = Files~
-view_bundle_latestVersion = Latest Version~
-view_bundle_list_backToAll = Back to All Bundles~
-view_bundle_list_deleteConfirm = Are you sure you want to delete this bundle?~
-view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]~
-view_bundle_list_deleteSuccessful = You successfully deleted the bundle named [{0}]~
-view_bundle_list_deletesFailure = Failed to delete the bundles
-view_bundle_list_deletesSuccessful = You successfully deleted the bundles
-view_bundle_list_destinationsCount = Destinations Count~
-view_bundle_list_error1 = Failed to load bundle to deploy [{0}]~
-view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]~
-view_bundle_list_error3 = Failed to load bundle~
-view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]~
-view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data~
-view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]~
-view_bundle_list_tagUpdateFailure = Failed to update bundle tags~
-view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags~
-view_bundle_list_versionsCount = Versions Count~
-view_bundle_purge = Purge
-view_bundle_recipe = Recipe~
-view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments~
-view_bundle_revert = Revert~
-view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...~
-view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert~
-view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment~
-view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation~
-view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]~
-view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
-view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]~
-view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
-view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment~
-view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)~
-view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name~
-view_bundle_revertWizard_getInfoStep_name = Provide Revert Information~
-view_bundle_revertWizard_getInfoStep_revertDeployDesc = Revert Deploy Description~
-view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\\n\\n[REVERT To]\\n{1}~
-view_bundle_revertWizard_getInfoStep_revertDeployName = Revert Deploy Name~
-view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms~
-view_bundle_revertWizard_revertStep_reverting = Reverting...~
-view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!~
-view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]~
-view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!~
-view_bundle_revertWizard_title = Bundle Revert~
-view_bundle_revertWizard_windowTitle = Bundle Revert Wizard~
-view_bundle_tree_loadFailure = Failed to load bundle data~
-view_bundle_version_backToBundle = Back to Bundle~
-view_bundle_version_bundleVersionTagUpdateFailure = Failed to update bundle version tags~
-view_bundle_version_bundleVersionTagUpdateSuccessful = You have successfully updated the bundle version tags~
-view_bundle_version_deleteConfirm = Are you sure you want to delete this bundle version?
-view_bundle_version_deleteFailure = Failed to delete the bundle version [{0}]
-view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
-view_bundle_version_loadFailure = Failed to load bundle version~
-view_bundle_versions = Versions~
-view_configCompare_comparingConfigs = Comparando Configura\u00E7\u00F5es
-view_configCompare_configCompare = Compara\u00E7\u00E3o de Configura\u00E7\u00F5es
-view_configEdit_addItem = Adicionar Item \u00E0 Lista
-view_configEdit_confirm_1 = Tem certeza de que deseja excluir as propriedades selecionadas?
-view_configEdit_confirm_2 = Tem certeza de que deseja excluir esta linha?
-view_configEdit_confirm_3 = Tem certeza de que deseja excluir [{0}] selecionado [{1}]?
-view_configEdit_editRow = Editar Linha de Configura\u00E7\u00E3o
-view_configEdit_enterPropName = Informe o nome da propriedade a ser adicionada.
-view_configEdit_error_1 = Este recurso n\u00E3o suporta Configura\u00E7\u00E3o.
-view_configEdit_error_2 = Este recurso n\u00E3o possui suporte \u00E0 propriedades de conex\u00E3o.
-view_configEdit_error_3 = N\u00E3o f\u00F3 poss\u00EDvel adicionar a propriedade com nome [{0}]. Nome de propriedade j\u00E1 utilizada neste conjunto.
-view_configEdit_files = Arquivos
-view_configEdit_hideAll = Ocultar todos
-view_configEdit_jumpToSection = Ir direto para a Sele\u00E7\u00E3o
-view_configEdit_msg_1 = Propriedade [{0}] adicionada ao conjunto.
-view_configEdit_msg_2 = Propriedades removidas do conjunto.
-view_configEdit_msg_3 = [{0} {1}] removido da lista.
-view_configEdit_msg_4 = Item adicionado \u00E0 lista.
-view_configEdit_properties = Propriedades
-view_configEdit_tooltip_1 = Remove os itens selecionados da lista.
-view_configEdit_tooltip_2 = Adiciona um item \u00E0 lista.
-view_configEdit_viewRow = View Row
-view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.~
-view_configurationDetails_configNotUpdatedDueToNoChange = Configuration was not updated, since the new configuration is equivalent to the current configuration.
-view_configurationDetails_error_updateFailure = Failed to update configuration.~
-view_configurationDetails_messageConcise = Configuration updated - current version is {0}.~
-view_configurationDetails_messageDetailed = Configuration updated to version {0} for Resource [{1}].
-view_configurationDetails_noPermission = You do not have permission to edit this Resource''s configuration.~
-view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.~
-view_configurationHistoryDetails_dialogTitle = Configuration Details~
-view_configurationHistoryDetails_error_loadFailure = Unable to load configuration history.~
-view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
-view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
-view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
-view_configurationHistoryList_itemNamePlural = configuration history items
-view_configurationHistoryList_rollback = Rollback
-view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
-view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
-view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
-view_configurationHistoryList_table_statusFailure = This configuration update failed
-view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
-view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
-view_configurationHistoryList_table_statusSuccess = This configuration update was successful
-view_configurationHistoryList_title = Configuration History~
-view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.~
-view_connectionSettingsDetails_error_updateFailure = Failed to update connection settings.~
-##view_connectionSettingsDetails_messageConcise_updateSuccess = Connection settings updated.~
-##view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settings updated for Resource [{0}].~
-view_connectionSettingsDetails_noPermission = You do not have permission to edit this Resource''s connection settings.~
-view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.~
-view_core_error_1 = Falha ao perquisar novos alertas~
-view_core_loggedInAs = Logado como {0}~
-view_core_loggedOut = Logged out~
-view_core_noRecentAlerts = There are no recent alerts to report
-view_core_recentAlerts = [{0}] alertas recentes~
-view_core_uncaught = Exce\u00E7\u00E3o n\u00E3o capturada~
-view_dashboardManager_deleteFail = Failed to delete dashboard.
-view_dashboardManager_deleted = Successfully deleted dashboard {0}~
-view_dashboardManager_error = Failed to save dashboard to server~
-view_dashboardManager_saved = Saved dashboard {0} to server~
-view_dashboardManager_success = Saved dashboard~
-view_dashboard_favorites_error1 = Failed to load favorite Resources.~
-view_dashboardsManager_error1 = Failed to add new dashboard~
-view_dashboardsManager_inventory_title = Inventory Summary~
-view_dashboardsManager_mashup_title = RHQ News~
-view_dashboardsManager_message_title = Welcome To RHQ~
-view_dashboardsManager_message_title_details = <h1>Welcome to RHQ</h1>\n<p>The RHQ project is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p>~
-view_dashboardsManager_tagcloud_title = Tag Cloud~
-view_dashboards_confirm1 = Are you sure you want to delete~
-view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh
-view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh
-view_dashboards_portlets_refresh_multiple_min = {0} minutes
-view_dashboards_portlets_refresh_none = No Refresh
-view_dashboards_portlets_refresh_one_min = 1 minute
-view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
-view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
-view_dashboards_title = Dashboard~
-view_dynagroup_children = DynaGroup Children~
-view_dynagroup_compatible = Compatible
-view_dynagroup_definitionAlreadyExists = A group definition already exists with this name~
-view_dynagroup_definitionCreated = You have successfully created a group definition named [{0}]~
-view_dynagroup_definitionLoadFailure = Failed to load group definitions~
-view_dynagroup_definitions = DynaGroup Definitions~
-view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions~
-view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions~
-view_dynagroup_editing = Editing [{0}]~
-view_dynagroup_exprBuilder_addExpression = Add Expression
-view_dynagroup_exprBuilder_comparisonType = Comparison Type
-view_dynagroup_exprBuilder_comparisonType_contains = contains
-view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
-view_dynagroup_exprBuilder_comparisonType_equals = equals
-view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
-view_dynagroup_exprBuilder_comparisonType_tooltip = Comparison Type
-view_dynagroup_exprBuilder_definingPlugin = Defining Plugin
-view_dynagroup_exprBuilder_definingPlugin_tooltip = The plugin to search
-view_dynagroup_exprBuilder_expression = Expression
-view_dynagroup_exprBuilder_expressionType = Expression Type
-view_dynagroup_exprBuilder_expressionType_pluginConfig = Plugin Configuration
-view_dynagroup_exprBuilder_expressionType_resource = Resource
-view_dynagroup_exprBuilder_expressionType_resourceCategory = Resource Category
-view_dynagroup_exprBuilder_expressionType_resourceConfig = Resource Configuration
-view_dynagroup_exprBuilder_expressionType_resourceType = Resource Type
-view_dynagroup_exprBuilder_expressionType_tooltip = The type of property this expression switches on:<br/> <b>Resource</b>: A resource property such as its name or version<br/> <b>Resource Type</b>: Search for resources of a specific type<br/> <b>Resource Category</b>: Search for resources by category: platform, server, service<br/> <b>Trait</b>: Resources that have selected values for a monitored trait<br/> <b>Plugin Configuration</b>: Search by the plugin component configuration setting of the component<br/> <b>Resource Configuration</b>: Search by the configuration setting of the managed resource
-view_dynagroup_exprBuilder_expressionType_trait = Trait
-view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
-view_dynagroup_exprBuilder_groupBy = Group by
-view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
-view_dynagroup_exprBuilder_noPlugins = --No plugins--
-view_dynagroup_exprBuilder_noProperties = --No properties--
-view_dynagroup_exprBuilder_noResourceTypes = --No resource types--
-view_dynagroup_exprBuilder_pluginLoadFailure = Cannot get the list of plugins
-view_dynagroup_exprBuilder_propLoadFailure = Cannot get list of properties
-view_dynagroup_exprBuilder_propertyName = Property Name
-view_dynagroup_exprBuilder_propertyName_tooltip = The name of the property to query. This is defined by the expression type as well as the resource type.
-view_dynagroup_exprBuilder_resTypeLoadFailure = Cannot get list of resource types for plugin [{0}]
-view_dynagroup_exprBuilder_resource = Resource
-view_dynagroup_exprBuilder_resourceType = Resource Type
-view_dynagroup_exprBuilder_resourceType_tooltip = The type of resource
-view_dynagroup_exprBuilder_resource_child = Child
-view_dynagroup_exprBuilder_resource_grandparent = Grandparent
-view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
-view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
-view_dynagroup_exprBuilder_resource_parent = Parent
-view_dynagroup_exprBuilder_resource_resource = Resource
-view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
-view_dynagroup_exprBuilder_title = Expression Builder
-view_dynagroup_exprBuilder_unset = Unset
-view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the " = " operator because of how databases store and query data.
-view_dynagroup_exprBuilder_value_tooltip = The string value for the expression to query
-view_dynagroup_expression = Expression~
-view_dynagroup_expressionBuilderIconTooltip = Expression Builder...
-view_dynagroup_expressionSet = Expression Set~
-view_dynagroup_lastCalculationTime = Last Calculation Time~
-view_dynagroup_loadDefinitionFailure = Failed to load group definition [{0}]~
-view_dynagroup_loadDefinitionMissing = There is no group definition with the ID of [{0}]~
-view_dynagroup_mixed = Mixed
-view_dynagroup_newGroupDefinition = New Group Definition~
-view_dynagroup_nextCalculationTime = Next Calculation Time~
-view_dynagroup_permDenied = You do not have permission to view group definitions~
-view_dynagroup_permUnknown = Could not determine if you have the proper permissions - access is denied~
-view_dynagroup_recalcFailure = Failed to recalculated this group definition~
-view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions~
-view_dynagroup_recalcSuccessful = You have successfully recalculated this group definition~
-view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions~
-view_dynagroup_recalculate = Recalculate~
-view_dynagroup_recalculationInterval = Recalculation Interval~
-view_dynagroup_recursive = Recursive~
-view_dynagroup_saveAndRecalculate = Save & Recalculate~
-view_dynagroup_saveFailure = Failed to save the group definition named [{0}]~
-view_dynagroup_saveSuccessful = You have successfully saved the group definition named [{0}]~
-view_dynagroup_singleSaveFailure = An error occurred - there should have been one created, but instead there were [{0}] created~
-view_dynagroup_template_customExpression = Custom Expression...
-view_dynagroup_template_downedResources = All resources currently down
-view_dynagroup_template_jbossas4_clusters = JBossAS 4 - Clusters
-view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
-view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
-view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
-view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
-view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - Clusters
-view_dynagroup_template_platforms = Platform resources in inventory
-view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
-view_groupConfigEdit_member = Membro
-view_groupConfigEdit_noListProps = Lista de propriedades n\u00E3o suportada atualmente para configura\u00E7\u00F5es em grupo.
-view_groupConfigEdit_setAll = Atribuir todos os valores \u00E0:
-view_groupConfigEdit_tooltip_1 = Valores dos membros diferem - clique no \u00EDcone para edit\u00E1-los.
-view_groupConfigEdit_unset = Remover atribui\u00E7\u00E3o
-view_groupConfigEdit_valsDiff = valores dos membros diferem
-view_groupConfigEdit_valsDiffForProp = Valores dos membros para a Propriedade [{0}]
-view_groupCreateWizard_createFailure = Failed to create the resource group~
-view_groupCreateWizard_createStepName = Group Settings~
-view_groupCreateWizard_createStep_recursive = Recursive~
-view_groupCreateWizard_createSuccessful_concise = You have created a new resource group. [<a href = "{0}">View Group</a>]~
-view_groupCreateWizard_createSuccessful_full = You have created a new [{0}] resource group with the name [{1}] that contains [{2}] member resources~
-view_groupCreateWizard_membersStepName = Select Members~
-view_groupCreateWizard_title = Create Group~
-view_groupCreateWizard_windowTitle = Create Group~
-view_groupInventoryMembers_button_updateMembership = Update Membership...
-view_groupInventoryMembers_title_updateMembership = Update Membership
-view_group_detail_failLoad = Failed to load group for group with ID [{0}]
-view_group_detail_failLoadComp = Failed to load group composite for group with ID [{0}]
-view_group_detail_failRecursiveChange = Failed to update the recursive setting for group [{0}]
-view_group_detail_recursiveChange = You successfully changed the recursive setting for group [{0}]
-view_group_inventory_activity_no_recent_metrics = This group has no recent metrics
-view_group_meas_schedules_title = Group Metric Collection Schedules~
-view_group_membership_failFetch = Failed to fetch Resource Group
-view_group_membership_saveFailure = Failed to update membership of group [{0}]~
-view_group_membership_saveSuccessful = You have updated the membership of group [{0}]~
-view_group_operationScheduleDetails_failedToLoadMembers = Failed to load group member Resources.
-view_group_operationScheduleDetails_field_execute = Execute
-view_group_operationScheduleDetails_field_haltOnFailure = Halt on Failure?
-view_group_operationScheduleDetails_memberResource = Member Resource
-view_group_operationScheduleDetails_value_parallel = in parallel
-view_group_operationScheduleDetails_value_sequential = in the order specified below (drag and drop member Resources to change order)
-view_group_pluginConfig_edit_currentGroupProperties = Current Group Properties~
-view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]~
-view_group_pluginConfig_edit_noperm = You do not have permission to edit this group connection settings~
-view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]~
-view_group_pluginConfig_edit_saveInitiated_concise = The group connection setting updates have been initiated~
-view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]~
-view_group_pluginConfig_edit_saveTooltip = Update the connection settings of all group members~
-view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved~
-view_group_pluginConfig_members_fetchFailure = Failed to get plugin config update history for members of group [{0}]~
-view_group_pluginConfig_members_fetchFailureConn = Failed to retrieve member connection settings for [{0}]
-view_group_pluginConfig_members_fetchFailureConnInProgress = A group plugin configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
-view_group_pluginConfig_members_statusDetails = Status Details~
-view_group_pluginConfig_members_statusFailure = This configuration update failed for an unknown reason~
-view_group_pluginConfig_members_statusInprogress = This configuration update is still in progress~
-view_group_pluginConfig_members_statusNochange = No changes were made to this configuration~
-view_group_pluginConfig_members_statusSuccess = This configuration update was successful~
-view_group_pluginConfig_members_title = Group Connection Settings Member Histories~
-view_group_pluginConfig_table_clickStatusIcon = Click the status icon for full details~
-view_group_pluginConfig_table_deleteFailure = Failed to delete group plugin config history~
-view_group_pluginConfig_table_deleteSuccessful = You have deleted [{0}] history items~
-view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
-view_group_pluginConfig_table_msg1 = View Member History for status of each individual resource~
-view_group_pluginConfig_table_statusDetails = Status Details~
-view_group_pluginConfig_table_statusFailure = This group configuration update failed~
-view_group_pluginConfig_table_statusInprogress = This group configuration update is still in progress~
-view_group_pluginConfig_table_statusNochange = No changes were made to this group configuration~
-view_group_pluginConfig_table_statusSuccess = This group configuration update was successful~
-view_group_pluginConfig_table_title = Group Connection Settings History~
-view_group_pluginConfig_table_viewMemberHistory = View Member History~
-view_group_pluginConfig_table_viewSettings = View Settings~
-view_group_pluginConfig_view_groupProperties = Group Properties~
-view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings~
-view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]~
-view_group_resConfig_edit_loadFail = Failed to retrieve member Resource configurations for [{0}]
-view_group_resConfig_edit_noperm = You do not have permission to edit this group configuration~
-view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for [{0}] compatible group named [{1}]~
-view_group_resConfig_edit_saveInitiated_concise = The group configuration updates have been initiated~
-view_group_resConfig_edit_saveInitiated_full = The group configuration updates have been initiated for the [{0}] compatible group named [{1}]~
-view_group_resConfig_edit_saveTooltip = Update the configurations of all group members~
-view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved~
-view_group_resConfig_members_fetchFailure = Failed to get resource config update history for members of group [{0}]
-view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource configuration settings for [{0}]
-view_group_resConfig_members_fetchFailureConfigInProgress = A group resource configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
-view_group_resConfig_members_statusDetails = Status Details
-view_group_resConfig_members_statusFailure = This configuration update failed for an unknown reason
-view_group_resConfig_members_statusInprogress = This configuration update is still in progress
-view_group_resConfig_members_statusNochange = No changes were made to this configuration
-view_group_resConfig_members_statusSuccess = This configuration update was successful
-view_group_resConfig_members_title = Group Resource Configuration Member Histories
-view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
-view_group_resConfig_table_deleteFailure = Failed to delete group resource config history
-view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
-view_group_resConfig_table_failFetch = Failed to get group resource config history
-view_group_resConfig_table_msg1 = View Member History for status of each individual resource
-view_group_resConfig_table_statusDetails = Status Details
-view_group_resConfig_table_statusFailure = This group configuration update failed
-view_group_resConfig_table_statusInprogress = This group configuration update is still in progress
-view_group_resConfig_table_statusNochange = No changes were made to this group configuration
-view_group_resConfig_table_statusSuccess = This group configuration update was successful
-view_group_resConfig_table_title = Group Resource Configuration History
-view_group_resConfig_table_viewMemberHistory = View Member History
-view_group_resConfig_table_viewSettings = View Settings
-view_group_resConfig_view_groupProperties = Group Properties
-view_group_resConfig_view_noperm = You do not have permissions to see the resource configuration settings
-view_group_summary_compatible = Compatible
-view_group_summary_descUpdateFailure = Failed to change the description of the resource group with ID [{0}]~
-view_group_summary_descUpdateSuccessful = You have changed the description of this resource group~
-view_group_summary_dynamic = Dynamic~
-view_group_summary_dynamicNote = Dynamic group names and descriptions are managed, and therefore are not editable~
-view_group_summary_groupDefinition = Group Definition~
-view_group_summary_memberCount = Member Count~
-view_group_summary_memberType = Member Type~
-view_group_summary_mixed = Mixed~
-view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]~
-view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]~
-view_group_summary_recursive = Recursive~
-view_helpTop_description = This section provides access to documentation, tutorials, version, and other helpful information.
-view_help_section_product = Product
-view_help_section_product_about = About
-view_inventory_adq = Discovery Queue~
-view_inventory_allGroups = All Groups~
-view_inventory_allResources = All Resources~
-view_inventory_cannotGetGlobalPerms = Could not determine global permissions - assuming none.~
-view_inventory_collectionInterval = Collection Interval~
-view_inventory_downServers = Down Servers~
-view_inventory_dynagroupDefs = Dynagroup Definitions~
-view_inventory_eventDetails_loadFailed = An error occurred loading the event details~
-view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]~
-view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]~
-view_inventory_eventHistory_details = Details~
-view_inventory_eventHistory_detailsFilter = Details Filter~
-view_inventory_eventHistory_groupEventHistory = Group Event History~
-view_inventory_eventHistory_purgeFailed = Failed to purge events for [{0}]~
-view_inventory_eventHistory_purgeSuccessful = You have successfully purged [{0}] events for [{1}]~
-view_inventory_eventHistory_resourceEventHistory = Resource Event History~
-view_inventory_eventHistory_severity = Severity~
-view_inventory_eventHistory_severityFilter = Severity Filter~
-view_inventory_eventHistory_sourceFilter = Source Filter~
-view_inventory_eventHistory_sourceLocation = Source Location~
-view_inventory_eventHistory_timestamp = Timestamp~
-view_inventory_groups = Groups~
-view_inventory_groups_children = Children~
-view_inventory_groups_deleteFailed = Failed to delete the selected resource groups~
-view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups~
-view_inventory_groups_descendants = Descendants~
-view_inventory_groups_loadFailed = Failed to load group composite data~
-view_inventory_groups_resourceGroups = Resource Groups~
-view_inventory_mixed = mixed~
-view_inventory_platforms = Platforms~
-view_inventory_problemGroups = Problem Groups~
-view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible~
-view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?~
-view_inventory_resources_deleteFailed = Failed to delete the selected resources~
-view_inventory_resources_deleteSuccessful = You have successfully deleted the selected resources~
-view_inventory_resources_loadFailed = Failed to load resource composite data~
-view_inventory_resources_title = Member Resources~
-view_inventory_resources_title_children = Child Resources~
-view_inventory_resources_title_members = Member Resources~
-view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
-view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
-view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
-view_inventory_sectionHelp = From this section, newly discovered Resources, inventoried Resources, and Groups can be viewed and managed.~
-view_inventory_servers = Servers~
-view_inventory_services = Services~
-view_inventory_summary_agent_error1 = Failed to locate agent managing resource id~
-view_inventory_summary_agent_error2 = Failed to ping agent managing resource id~
-view_inventory_summary_agent_error3 = You do not have permission to view details for this Agent.
-view_inventory_summary_agent_fullEnpoint = Full Endpoint~
-view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!~
-view_inventory_summary_agent_last_title = Last Received Availability Report~
-view_inventory_summary_agent_status_title = Agent Communications Status~
-view_inventory_summary_agent_title = Agent Managing this Resource~
-view_inventory_unavailableServers = Unavailable Servers
-view_leftNav_unknownPage = P\u00E1gina desconhecida [{0}] para a se\u00E7\u00E3o [{1}] - URL inv\u00E1lida.
-view_login_invalidEmail = Endere\u00E7o de e-mail inv\u00E1lido
-view_login_login = Entrar
-view_login_logout = Sair
-view_login_noBackend = Fonte de Dados indispon\u00EDvel.
-view_login_noLdap = Note: Optional retrieval of ldap details unsuccessful. Manual entry is required.~
-view_login_noUser = Usu\u00E1rio ou senha inv\u00E1lidos.
-view_login_prompt = Favor efetuar Login
-view_login_registerLater = (Sair - Concluir registro mais tarde.)
-view_login_registerLdapSuccess = Novo usu\u00E1rios do LDAP registrado com sucesso.
-view_login_registerUser = Registrar Usu\u00E1rio
-view_login_welcome = Bem Vindo
-view_login_welcomeMsg = Seja Bem Vindo ao JBoss ON! <br/><br/> Informe ou altere os seguintes campos para completar o processo de registro.<br/> Clique em "OK" para acessar o sistema.<br/><br/>
-view_measureRange_day = 1 Dia
-view_measureRange_days = {0} Dias
-view_measureRange_hour = 1 Hora
-view_measureRange_hours = {0} Horas
-view_measureRange_last = \u00DAltimo
-view_measureRange_minutes = {0} Minutos
-view_measureRange_range = Faixa
-view_measureRange_simple = Simples...
-view_measureRange_start = Time Range - Start
-view_measureTable_chartMetricValues = Chart Selected Metrics
-view_measureTable_getLive = Get Live Value
-view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
-view_measureTable_live_title = Live Data
-view_measure_nan = --dados indispon\u00EDveis--
-view_measurementOob_title = M\u00E9tricas Suspeitas~
-view_menuBar_help = Ajuda~
-view_menuBar_logout = Sair
-view_messageCenter_button_messages = Mensagens~
-view_messageCenter_clearAllMessages = Clear All Messages
-view_messageCenter_lastNMessages = Last {0} Messages
-view_messageCenter_maxMessages = Max Messages
-view_messageCenter_messageBarShowDetails = Show Details
-view_messageCenter_messageDetail = Detalhe~
-view_messageCenter_messageSeverity = Severidade~
-view_messageCenter_messageTime = Tempo~
-view_messageCenter_messageTitle = Centro de Mensagens~
-view_messageCenter_noRecentMessages = N\u00E3o existem Mensagens Recentes~
-view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
-view_metric_traits = Traits~
-view_metric_viewTraitHistory = Value History for Trait [{0}]~
-view_operationCreateWizard_button_execute = Execute~
-view_operationCreateWizard_button_executeImmediately = Execute Immediately~
-view_operationCreateWizard_error_scheduleOperationFailure = Failed to schedule operation execution.~
-view_operationCreateWizard_header = Execute {0} on {1}~
-view_operationCreateWizard_message_scheduleOperationSuccess = Schedule operation [{0}] on Resource [{1}] with cron string [{2}].~
-view_operationCreateWizard_parametersStep_name = Operation Parameters~
-view_operationCreateWizard_parametersStep_noParameters = This operation does not take any parameters.~
-view_operationCreateWizard_schedulingStep_label_daily = Daily~
-view_operationCreateWizard_schedulingStep_label_dailyAt = Daily At~
-view_operationCreateWizard_schedulingStep_label_date = Date~
-view_operationCreateWizard_schedulingStep_label_dayOfMonth = Day of Month~
-view_operationCreateWizard_schedulingStep_label_dayOfWeek = Day of Week~
-view_operationCreateWizard_schedulingStep_label_endDate = End Date~
-view_operationCreateWizard_schedulingStep_label_everyNMinutes = Every n Minutes~
-view_operationCreateWizard_schedulingStep_label_hourly = Hourly~
-view_operationCreateWizard_schedulingStep_label_hourlyAt = Hourly At~
-view_operationCreateWizard_schedulingStep_label_minuteInterval = Minute Interval~
-view_operationCreateWizard_schedulingStep_label_minuteOfHour = Minute of Hour~
-view_operationCreateWizard_schedulingStep_label_monthly = Monthly~
-view_operationCreateWizard_schedulingStep_label_monthlyOn = Monthly On~
-view_operationCreateWizard_schedulingStep_label_nMinutes = n Minutes~
-view_operationCreateWizard_schedulingStep_label_onceAt = Once At~
-view_operationCreateWizard_schedulingStep_label_recurrence = Recurrence~
-view_operationCreateWizard_schedulingStep_label_recurrenceEnd = Recurrence End~
-view_operationCreateWizard_schedulingStep_label_runAt = Run At~
-view_operationCreateWizard_schedulingStep_label_schedule = Schedule~
-view_operationCreateWizard_schedulingStep_label_start = Start~
-view_operationCreateWizard_schedulingStep_label_startDate = Start Date~
-view_operationCreateWizard_schedulingStep_label_time = Time~
-view_operationCreateWizard_schedulingStep_label_timeOfDay = Time of Day~
-view_operationCreateWizard_schedulingStep_label_timePeriod = Time Period~
-view_operationCreateWizard_schedulingStep_label_weekly = Weekly~
-view_operationCreateWizard_schedulingStep_label_weeklyOn = Weekly On~
-view_operationCreateWizard_schedulingStep_label_willExecuteImmediately = Will execute immediately~
-view_operationCreateWizard_schedulingStep_name = Schedule~
-view_operationCreateWizard_title = Operation Wizard~
-view_operationHistoryDetails_dateCompleted = Date Completed
-view_operationHistoryDetails_dateSubmitted = Date Submitted
-view_operationHistoryDetails_error_fetchFailure = Failure loading operation history.~
-view_operationHistoryDetails_noResults = This operation does not return any results.
-view_operationHistoryDetails_operation = Operation
-view_operationHistoryDetails_parameters = Parameters
-view_operationHistoryDetails_requestor = Requestor
-view_operationHistoryDetails_results = Results
-view_operationHistoryDetails_status = Status
-view_operationHistoryList_button_forceDelete = Force Delete
-view_operationHistoryList_button_runOperation = Run Operation~
-view_operationHistoryList_notYetStarted = not yet started
-view_operationHistoryList_title = Operation History~
-view_operationScheduleDetails_enterParametersBelow = Enter parameters below...
-view_operationScheduleDetails_fieldDefault_description = Select an operation to see its description.
-view_operationScheduleDetails_fieldDefault_parameters = Select an operation to see its parameters.
-view_operationScheduleDetails_fieldHelp_description = an optional description of this scheduled operation (e.g. nightly maintenance app server restart)
-view_operationScheduleDetails_fieldHelp_timeout = a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated
-view_operationScheduleDetails_field_description = Description
-view_operationScheduleDetails_field_parameters = Parameters
-view_operationScheduleDetails_field_timeout = Timeout
-view_operationScheduleDetails_noParameters = This operation does not take any parameters.
-view_operationScheduleDetails_operationSchedule = Operation Schedule
-view_portlet_autodiscovery_config_platform_selection = Number of platforms to display~
-view_portlet_autodiscovery_help_msg = This portlet offers the ability to import newly discovered resources into the inventory for monitoring and management or to ignore them from further action.~
-view_portlet_autodiscovery_setting_platforms = discovered platforms
-view_portlet_autodiscovery_title = Discovery Queue~
-view_portlet_configure_definitionDesc = The configuration settings for the portlet.
-view_portlet_configure_definitionTitle = Portlet Configuration
-view_portlet_configure_needed = Click the Settings button to configure this portlet.
-view_portlet_configure_notNeeded = Configuration is not necessary for this portlet.
-view_portlet_defaultName_autodiscovery = Discovery Queue
-view_portlet_defaultName_favoriteResources = Favorite Resources
-view_portlet_defaultName_groupMetric = Resource Group Metric Graph
-view_portlet_defaultName_group_alerts = Group: Alerts
-view_portlet_defaultName_group_bundles = Group: Bundle Deployments
-view_portlet_defaultName_group_config_updates = Group: Configuration Updates
-view_portlet_defaultName_group_events = Group: Event Counts
-view_portlet_defaultName_group_metrics = Group: Metrics
-view_portlet_defaultName_group_oobs = Group: OOB Conditions
-view_portlet_defaultName_group_operations = Group: Operations
-view_portlet_defaultName_group_pkg_hisory = Group: Package History
-view_portlet_defaultName_inventorySummary = Inventory Summary
-view_portlet_defaultName_mashup = Mashup
-view_portlet_defaultName_message = Message
-view_portlet_defaultName_operations = Recent Operations
-view_portlet_defaultName_platformSummary = Platform Utilization
-view_portlet_defaultName_problemResources = Alerted or Unavailable Resources
-view_portlet_defaultName_recentAlerts = Recent Alerts
-view_portlet_defaultName_recentlyAddedResources = Recently Added Resources
-view_portlet_defaultName_resourceMetric = Resource Metric Graph
-view_portlet_defaultName_resource_alerts = Resource: Alerts
-view_portlet_defaultName_resource_bundles = Resource: Bundle Deployments
-view_portlet_defaultName_resource_config_updates = Resource: Configuration Updates
-view_portlet_defaultName_resource_events = Resource: Event Counts
-view_portlet_defaultName_resource_metrics = Resource: Measurements
-view_portlet_defaultName_resource_oobs = Resource: OOB Metrics
-view_portlet_defaultName_resource_operations = Resource: Operations
-view_portlet_defaultName_resource_pkg_hisory = Resource: Package History
-view_portlet_defaultName_tagCloud = Tag Count
-view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
-view_portlet_favoriteResources_msg = This portlet displays your favorite resources~
-view_portlet_favoriteResources_title = Favorite Resources~
-view_portlet_generic_help = No help available for this portlet~
-view_portlet_generic_unconfigured = No settings available for this portlet~
-view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph~
-view_portlet_graph_configure_resource_graph = The resource to graph~
-view_portlet_graph_configure_title = Graph Config~
-view_portlet_graph_configure_title_desc = Configuration of the graph portlet~
-view_portlet_graph_help_msg = This Portlet supports the graphing of a resource metric.~
-view_portlet_graph_help_title = Graph Portlet~
-view_portlet_graph_help_unconfigured = This graph is unconfigured, click the settings button to configure.~
-view_portlet_graph_title = Resource Graph~
-view_portlet_help_autodiscovery = This portlet allows import or ignore of newly discovered resources. Imported resources are added to inventory for monitoring and management. Ignored resources are not imported and are hidden from view unless explicitly unignored.
-view_portlet_help_bundle_deps = This portlet shows relevant bundle deployments based on display criteria configured.
-view_portlet_help_config_updates = This portlet displays recent configuration changes consistent with configuration settings.
-view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
-view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
-view_portlet_help_graph = This portlet displays the resource metric graph.
-view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
-view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
-view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
-view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
-view_portlet_help_none = There is no help available for this portlet.
-view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
-view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
-view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
-view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
-view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
-view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
-view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
-view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
-view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
-view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
-view_portlet_inventory_error1 = Failed to retrieve inventory summary~
-view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
-view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
-view_portlet_mashup_config_title = MashupPorlet Configuration~
-view_portlet_mashup_config_title_desc = The configuration settings for the mashup portlet.~
-view_portlet_mashup_help = This portlet can include a web page via an HTTP request into an iframe on the dashboard.~
-view_portlet_mashup_unconfigured = Page address not yet configured, click the settings button to setup this portlet.~
-view_portlet_message_config_title = MessagePortlet Configuration~
-view_portlet_message_config_title_desc = The configuration settings for the message portlet.~
-view_portlet_message_help = This portlet can display an HTML message on the dashboard.~
-view_portlet_message_title = Message~
-view_portlet_message_unconfigured = Message not yet configured, click the settings button to setup this portlet.~
-view_portlet_operations_config_completed = completed operations~
-view_portlet_operations_config_completed_enable = Whether to enable completed operations results grouping for dashboard.~
-view_portlet_operations_config_completed_maximum = Maximum number of Completed operations to display.~
-view_portlet_operations_config_scheduled_enable = Whether to enable scheduled operations results grouping for dashboard.~
-view_portlet_operations_config_scheduled_maximum = Maximum number of Scheduled operations to display.~
-view_portlet_operations_config_show_last = show Last~
-view_portlet_operations_config_show_next = show Next~
-view_portlet_operations_config_title = OperationsPortlet Configuration~
-view_portlet_operations_config_title_desc = The configuration settings for the Operations portlet.~
-view_portlet_operations_disabled = (Results currently disabled. Change settings to enable results.~
-view_portlet_operations_help_msg = This portlet displays both operations that have occurred and are scheduled to occur.~
-view_portlet_platform_help_msg = This portlet displays information about platforms in inventory.~
-view_portlet_platform_platform_error_1 = Failed to load platform metrics~
-view_portlet_platform_title = Platforms Summary~
-view_portlet_platform_type_error_1 = Could not load type data~
-view_portlet_problemResources_config_display_maximum = Maximum number of Problem resources to display.
-view_portlet_problemResources_config_display_range = Show problem resources going back this many hours.
-view_portlet_problemResources_config_display_range2 = From {0} to {1}
-view_portlet_problemResources_maxDisplaySetting = maximum resources.
-view_portlet_problem_resources_config_display_maximum = Maximum number of Problem resources to display.~
-view_portlet_problem_resources_config_display_range = Show problem resources going back this many hours.~
-view_portlet_problem_resources_config_display_range2 = From {0} to {1}~
-view_portlet_problem_resources_config_problem_label = problem resources on dashboard.~
-view_portlet_problem_resources_config_title = ProblemResourcesPortlet Configuration~
-view_portlet_problem_resources_config_title_desc = The configuration settings for the Problem resources portlet.~
-view_portlet_problem_resources_help = This portlet displays resources that have reported alerts or Down availability.~
-view_portlet_problem_resources_title = Has Alerts or Currently Unavailable~
-view_portlet_recentAlerts_config_members = Select Members~
-view_portlet_recentAlerts_config_priority_label = priority Alerts,~
-view_portlet_recentAlerts_config_when = within the past~
-view_portlet_recentAlerts_fail_msg = Failed to load resources assigned for alert filtering.
-view_portlet_recentAlerts_help_msg = Displays recent alerts fired on resources visible to the current user login.~
-view_portlet_recentAlerts_title = Recent Alerts~
-view_portlet_recentlyAdded_approved_platforms = recently approved platforms on dashboard.~
-view_portlet_recentlyAdded_error1 = Failed to load recently added resources~
-view_portlet_recentlyAdded_help_msg = This portlet displays resources that have recently been imported into the inventory.~
-view_portlet_recentlyAdded_setting_addedPlatforms = recently added platforms
-view_portlet_recentlyAdded_title = Recently Added Portlet~
-view_portlet_results_empty = No results found using specified criteria.
-view_portlet_tagCloud_help = portlet displays the relative tag counts in the system visible to the current user.~
-view_portlet_tagCloud_title = TagCloud~
-view_remoteAgentInstall_agentStatus = Status do Agente
-view_remoteAgentInstall_agentStatusDefault = -Pressione o Bot\u00E3o Atualizar Status-
-view_remoteAgentInstall_buttonFindAgent = Procurar Agente
-view_remoteAgentInstall_connInfo = Informa\u00E7\u00E3o de Conex\u00E3o
-view_remoteAgentInstall_error_1 = Ocorreu um erro ao tentar localizar o caminho de instala\u00E7\u00E3o do agente
-view_remoteAgentInstall_error_2 = N\u00E3o foi poss\u00EDvel encontrar uma instala\u00E7\u00E3o do agente nos locais comuns
-view_remoteAgentInstall_error_3 = N\u00E3o foi poss\u00EDvel encontar a instala\u00E7\u00E3o do agente em [{0}]
-view_remoteAgentInstall_error_4 = Falha ao instalar o agente
-view_remoteAgentInstall_error_5 = Falha a iniciar o agente
-view_remoteAgentInstall_error_6 = Falha ao parar o agente
-view_remoteAgentInstall_installAgent = Instalar Agente
-view_remoteAgentInstall_installInfo = Informa\u00E7\u00E3o sobre a instala\u00E7\u00E3o do Agente
-view_remoteAgentInstall_installPath = Caminho de Instala\u00E7\u00E3o do Agente
-view_remoteAgentInstall_owner = Propriet\u00E1rio
-view_remoteAgentInstall_promptHost = O host onde o agente est\u00E1 ou ser\u00E1 instalado
-view_remoteAgentInstall_promptInstallPath = Onde o agente est\u00E1 ou ser\u00E1 instalado. Caso n\u00E3o tenha certeza onde o agente est\u00E1 instalado, informe um diret\u00F3rio pai e clique em ''Procurar Agente'' para encontrar o agente. Caso informe um diret\u00F3rio vazio, a busca pelo agente ser\u00E1 realizada em locais de instala\u00E7\u00E3o comuns.
-view_remoteAgentInstall_promptPassword = Credenciais usadas para autentica\u00E7\u00E3o do usu\u00E1rio no host via SSH
-view_remoteAgentInstall_promptPort = Porta onde o servidor SSH escuta. Se n\u00E3o especificada, o padr\u00E3o \u00E9 22
-view_remoteAgentInstall_promptUser = Nome do usu\u00E1rio informado nas credenciais passadas ao host via SSH
-view_remoteAgentInstall_result = Resultado
-view_remoteAgentInstall_resultCode = ResultCode
-view_remoteAgentInstall_startAgent = Iniciar Agente
-view_remoteAgentInstall_startAgentResults = resultado da inicializa\u00E7\u00E3o do Agente: [{0}]
-view_remoteAgentInstall_step = Step
-view_remoteAgentInstall_stopAgent = Parar Agente
-view_remoteAgentInstall_stopAgentResults = resultado do encerramento do Agente: [{0}]
-view_remoteAgentInstall_success = Instala\u00E7\u00E3o do Agente finalizada
-view_remoteAgentInstall_updateStatus = Status da Atualiza\u00E7\u00E3o
-view_reportsTop_description = This section provides access to global reports.~
-view_reportsTop_title = Relat\u00F3rios
-view_reports_alertDefinitions = Defini\u00E7\u00E3o de Alertas~
-view_reports_alertDefinitions_parentHover = Click to go to the parent alert definition
-view_reports_alertDefinitions_resTypeLoadError = Cannot get the template resource type - unable to view the alert template.
-view_reports_inventorySummary_failFetch = Failed to get inventory summary
-view_reports_platforms = Utiliza\u00E7\u00E3o de Mem\u00F3ria e CPU~
-view_reports_subsystems = Subsistemas~
-view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.~
-view_resourceResourceGroupList_error_updateFailure = Failed to update assigned Resource groups.~
-view_resourceResourceGroupList_message_updateSuccess = Group membership updated for [{0}].
-view_resource_inventory_activity_changed_by = Changed by
-view_resource_inventory_activity_criteria_no_recent_events = No event counts based off display criteria.
-view_resource_inventory_activity_no_recent_alerts = No recent alerts
-view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
-view_resource_inventory_activity_no_recent_config_history = No configuration change history
-view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
-view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
-view_resource_inventory_activity_no_recent_oob = No OOB conditions found
-view_resource_inventory_activity_no_recent_operations = No recent operation history
-view_resource_inventory_activity_no_recent_pkg_history = No recent package history
-view_resource_inventory_childhistory_createdChild = Created Child
-view_resource_inventory_childhistory_deletedChild = Deleted Child
-view_resource_inventory_childhistory_filterTitle = Past N Days
-view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
-view_resource_inventory_childhistory_status_invalidConfig = Invalid Configuration
-view_resource_monitor_availability_loadFailed = Failed to load availability history~
-view_resource_monitor_calltime_average = Average~
-view_resource_monitor_calltime_count = Count~
-view_resource_monitor_calltime_destination = Call Destination~
-view_resource_monitor_calltime_editFailed = Call time data can not be edited~
-view_resource_monitor_calltime_loadFailed = Could not load call time data~
-view_resource_monitor_calltime_lookupFailed = Could not load resource for call time~
-view_resource_monitor_calltime_maximum = Maximum~
-view_resource_monitor_calltime_minimum = Minimum~
-view_resource_monitor_calltime_title = Call Time Data~
-view_resource_monitor_calltime_total = Total~
-view_resource_monitor_detailed_graph_label = Detailed Graph~
-view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart~
-view_resource_monitor_graph_live_tooltip = Click for a live graph of current values~
-view_resource_monitor_graphs_loadFailed = Failed to load graph data~
-view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph~
-view_resource_monitor_graphs_noneAvailable = No graphs available~
-view_resource_monitor_schedules_title = Resource Metric Collection Schedules~
-view_resource_monitor_table_alerts = Alerts
-view_resource_monitor_table_avg = Average
-view_resource_monitor_table_last = Last
-view_resource_monitor_table_max = Maximum
-view_resource_monitor_table_min = Minimum
-view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details~
-view_resource_title_tagUpdateFailed = Failed to update resource tags~
-view_searchBar_defaultPattern = definir nome para o padr\u00E3o
-view_searchBar_error_selectSavedSearch = ''Erro ao selecionar a pesquisa''
-view_searchBar_query = Pesquisa
-view_searchBar_resourceGroups = Grupos de Recursos
-view_searchBar_resources = Recursos
-view_searchBar_welcomeMessage = procurar por {0}s
-view_searchGUI_loginStatus = Imposs\u00EDvel determinar o status do login, verifique o status do servidor~
-view_selector_assigned = Associado {0}
-view_selector_available = Dispon\u00EDvel {0}
-view_subTab_error_disabled = N\u00E3o \u00E9 poss\u00EDvel selecionar uma subTab desabilidada [{0}].
-view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
-view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].~
-view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].~
-view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].~
-view_summaryOverviewForm_error_traitsLoadFailure = Failed to load traits for {0}.~
-view_summaryOverviewForm_field_description = Description~
-view_summaryOverviewForm_field_location = Location~
-view_summaryOverviewForm_field_name = Name~
-view_summaryOverviewForm_field_parent = Parent~
-view_summaryOverviewForm_field_type = Type~
-view_summaryOverviewForm_field_version = Version~
-view_summaryOverviewForm_header_summary = Summary~
-view_summaryOverviewForm_label_plugin = Plugin:
-view_summaryOverviewForm_label_type = Type:
-view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].~
-view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].~
-view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].~
-view_summaryOverview_header_detectedErrors = Detected Errors~
-view_summaryOverview_title_errorDetailsWindow = Error Details~
-view_summaryOverview_tooltip_detectedErrors = Click on the rows to see the error details.~
-view_tableSection_backButton = Voltar \u00E0 Lista
-view_tableSection_error_badId = Can not show detail for [{0}]. Illegal 'id': [{1}]. Please report this bug~
-view_tableSection_error_noId = Table [{0}] record is missing 'id' attribute - please report this bug.~
-view_table_drawFail = Failed to draw Table [{0}].
-view_table_matchingRows = Matching Rows: {0} (selected: {1})
-view_table_totalRows = Total de Linhas: {0} (selecionada: {1})
-view_tabs_common_activity = Activity
-view_tabs_common_agent = Agent
-view_tabs_common_alerts = Alerts~
-view_tabs_common_availability = Availability~
-view_tabs_common_calltime = Calltime~
-view_tabs_common_child_history = Child History~
-view_tabs_common_child_resources = Child Resources~
-view_tabs_common_configuration = Configuration~
-view_tabs_common_connectionSettings = Connection Settings~
-view_tabs_common_connectionSettingsHistory = Connection Settings History~
-view_tabs_common_content = Content~
-view_tabs_common_current = Current~
-view_tabs_common_dashboard = Dashboard~
-view_tabs_common_definitions = Definitions~
-view_tabs_common_deployed = Deployed~
-view_tabs_common_events = Events~
-view_tabs_common_graphs = Graphs~
-view_tabs_common_group_members = Group Members
-view_tabs_common_group_membership = Group Membership~
-view_tabs_common_groups = Groups~
-view_tabs_common_history = History~
-view_tabs_common_inventory = Inventory~
-view_tabs_common_members = Members~
-view_tabs_common_monitoring = Monitoring~
-view_tabs_common_new = New~
-view_tabs_common_operations = Operations~
-view_tabs_common_overview = Overview~
-view_tabs_common_schedule = Schedule
-view_tabs_common_scheduled = Scheduled~
-view_tabs_common_schedules = Schedules~
-view_tabs_common_subscriptions = Subscriptions~
-view_tabs_common_summary = Summary~
-view_tabs_common_tables = Tables~
-view_tabs_common_timeline = Timeline~
-view_tabs_common_traits = Traits~
-view_tabs_invalidSubTab = Invalid subtab: {0}
-view_tabs_invalidTab = Invalid tab: {0}
-view_tagCloud_deleteTag = Delete Tag
-view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
-view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
-view_tagCloud_error_fetchFailure = Falha ao carregar etiquetas (tags).~
-view_tagCloud_error_tagUsedCount = Etiqueta (tag) usada {0} vezes.~
-view_tagCloud_title = Nuvem de Tags~
-view_taggedResources_title = Recursos Etiquetados~
-view_tags_error_1 = Failed to load Tags~
-view_tags_tags = Tags~
-view_tags_title = Tags:~
-view_tags_tooltip_1 = Click to remove this Tag~
-view_tags_tooltip_2 = Click to edit Tags~
-view_tags_tooltip_3 = Enter a Tag in the format: (namespace:)(semantic = )tagname (e.g. it:env = QA, or owner = John)
-view_testTop_description = Esta se\u00E7\u00E3o cont\u00E9m p\u00E1ginas para realiza\u00E7\u00E3o de testes em v\u00E1rios componentes UI.~
-view_testTop_title = Teste~
-view_titleBar_common_addedFav = You have added [{0}] as a favorite~
-view_titleBar_common_addedFavFailure = Failed to add [{0}] as a favorite~
-view_titleBar_common_clickToAddFav = Click to add this as a favorite~
-view_titleBar_common_clickToRemoveFav = Click to remove this as a favorite~
-view_titleBar_common_loadTagsFailure = Failed to load the tags for [{0}]~
-view_titleBar_common_removedFav = You have removed [{0}] as one of your favorites~
-view_titleBar_common_removedFavFailure = Failed to remove [{0}] as one of your favorites~
-view_titleBar_common_updateTagsFailure = Failed to update the tags for [{0}]~
-view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have been updated~
-view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
-view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
-view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
-view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]~
-view_tree_common_contextMenu_chart = Chart~
-view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration~
-view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource Configuration~
-view_tree_common_contextMenu_groupGraph = Group Metric Graph
-view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
-view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboards
-view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
-view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
-view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children~
-view_tree_common_contextMenu_measurements = Measurements~
-view_tree_common_contextMenu_operations = Operations~
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations~
-view_tree_common_contextMenu_pluginConfiguration = Plugin Configuration~
-view_tree_common_contextMenu_resourceConfiguration = Resource Configuration~
-view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
-view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard~
-view_tree_common_contextMenu_saveChartToDashboardSuccessful = You have saved dashboard [{0}]~
-view_tree_common_contextMenu_type_name_label = Type: {0}
-view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
-view_tree_common_loadFailed_children = Failed to load children for node~
-view_tree_common_loadFailed_create = Failed to create view for this node~
-view_tree_common_loadFailed_descendants = Failed to load descendants for tree~
-view_tree_common_loadFailed_generic = Failed to load data for tree~
-view_tree_common_loadFailed_group = Failed to load group with id [{0}]
-view_tree_common_loadFailed_groupTree = Failed to load group tree
-view_tree_common_loadFailed_node = Failed to load data for this node~
-view_tree_common_loadFailed_root = Failed to load root for tree~
-view_tree_common_loadFailed_selection = Failed to select this node~
-view_tree_common_loadFailed_update = Failed to update view for this node~
-view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
-view_type_parentId = Parent ID~
-view_type_resourceTypes = Resource Types~
-view_type_typeTreeLoadFailure = Failed to load resource type tree data~
-view_upload_alreadyUploaded = File has already been uploaded~
-view_upload_bundleDistFile = Distribution File~
-view_upload_error_bundleDistFile = Error uploading Bundle Distribution File~
-view_upload_error_file = Error uploading file~
-view_upload_error_fileName = Error uploading file [{0}]~
-view_upload_error_fileName_2 = Error uploading file [{0}], check for invalid file path.~
-view_upload_error_packageVersionFile = Error uploading Package Version File~
-view_upload_error_results = Error uploading file, unexpected results: [{0}]~
-view_upload_inProgress = Can not submit, upload is currently in progress~
-view_upload_prompt_1 = [{0}] File to Upload~
-view_upload_prompt_2 = File to Upload~
-view_upload_success = File successfully uploaded~
-view_upload_tooltip_1 = Select a file to upload, then click Upload or Next~
-view_upload_tooltip_1a = Select a file to upload, then click Upload or Next
-view_upload_tooltip_1b = Select a file to upload, then click Next
-view_upload_tooltip_2 = File upload had previously failed~
-view_upload_upload = Upload~
-view_upload_uploadFile = UploadFile~
-
-widget_colorPicker_tooltip = Clique para selecionar uma nova cor
-widget_durationItem_inputUnitLessThanTargetUnit = A unidade de entrada \u00E9 menor que a unidade final.
-widget_durationItem_unitTypeNotSupported = Tipo de unidade [{0}] n\u00E3o suportada por este Item de Dura\u00E7\u00E3o.
-widget_jobTriggerEditor_fieldHelp_repeatDuration = permanecer executando esta opera\u00E7\u00E3o por tantas vezes ou at\u00E9 o t\u00E9rmino deste tempo
-widget_jobTriggerEditor_fieldHelp_repeatInterval = qual a frequ\u00EAncia de execu\u00E7\u00E3o da opera\u00E7\u00E3o
-widget_jobTriggerEditor_fieldHelp_startDelay = iniciar a execu\u00E7\u00E3o da opera\u00E7\u00E3o ap\u00F3s passar esta quantidade de tempo
-widget_jobTriggerEditor_field_cronExpression = Express\u00E3o da Cron
-widget_jobTriggerEditor_field_mode = Agendar usando
-widget_jobTriggerEditor_field_repeatInterval_later = Sempre repetir
-widget_jobTriggerEditor_field_repeatInterval_now = Executar agora e sempre
-widget_jobTriggerEditor_field_startType = Executar
-widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = O t\u00E9rmino deve ser ap\u00F3s o in\u00EDcio.
-widget_jobTriggerEditor_message_endTimeMustBeInFuture = O t\u00E9rmino deve ser no futuro.
-widget_jobTriggerEditor_message_startTimeMustBeInFuture = O in\u00EDcio deve ser no futuro.
-widget_jobTriggerEditor_tab_examples = Exemplos
-widget_jobTriggerEditor_tab_format = Formato
-widget_jobTriggerEditor_value_calendar = Calend\u00E1rio
-widget_jobTriggerEditor_value_cronExpression = Express\u00E3o da Cron
-widget_jobTriggerEditor_value_for = Para
-widget_jobTriggerEditor_value_in = em
-widget_jobTriggerEditor_value_indefinitely = Indefinidamente
-widget_jobTriggerEditor_value_later = Mais tarde
-widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
-widget_jobTriggerEditor_value_now = Agora
-widget_jobTriggerEditor_value_nowAndRepeat = Agora & Repetir
-widget_jobTriggerEditor_value_on = em
-widget_jobTriggerEditor_value_until = At\u00E9
-widget_recordEditor_error_invalidViewPath = Caminho inv\u00E1lido: [{0}]
-widget_recordEditor_error_multipleRecords = Foram encontrados v\u00E1rios registros - era esperado apenas um.
-widget_recordEditor_error_noRecords = Nenhum registro encontrado - era esperado exatamente um.
-widget_recordEditor_error_operation = Falha na Opera\u00E7\u00E3o. Ocorreu um Erro
-widget_recordEditor_error_operationInvalidValues = Falha na Opera\u00E7\u00E3o - um ou mais campos possuem valores inv\u00E1lidos
-widget_recordEditor_error_permissionCreate = Voc\u00EA n\u00E3o possui permiss\u00E3o necess\u00E1ria para criar um novo [{0}]
-widget_recordEditor_error_unsupportedOperationType = Tipo de opera\u00E7\u00E3o n\u00E3o suportada: [{0}]
-widget_recordEditor_info_recordCreatedConcise = {0} criado.
-widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] criado.
-widget_recordEditor_info_recordUpdatedConcise = {0} atualizado.
-widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] atualizado.
-widget_recordEditor_info_recordsDeletedConcise = {0} {1} exclu\u00EDdo.
-widget_recordEditor_info_recordsDeletedDetailed = {0} {1} exclu\u00EDdo: {2}.
-widget_recordEditor_label_loading = Carregar...
-widget_recordEditor_title_edit = Editar {0} [{1}]
-widget_recordEditor_title_new = Criar Novo {0}
-widget_recordEditor_title_view = Visualizar {0} [{1}]
-widget_recordEditor_warn_validation = Um ou mais campos possuem valores inv\u00E1lidos. Este [{0}] n\u00E3o pode ser salvo at\u00E9 que os valores sejam corrigidos.
-widget_resourceFactoryWizard_archPrompt = Arquitetura do Pacote
-widget_resourceFactoryWizard_configTemplatePrompt = Modelo de Configura\u00E7\u00E3o de Recurso
-widget_resourceFactoryWizard_contentTemplatePrompt = Modelos de Configura\u00E7\u00E3o do Tempo de Deploy
-widget_resourceFactoryWizard_createSubmit = A requisi\u00E7\u00E3o para cria\u00E7\u00E3o de um recurso com nome [{0}] foi submetida com sucesso.
-widget_resourceFactoryWizard_createSubmitType = A requisi\u00E7\u00E3o para cria\u00E7\u00E3o de um recurso do tipo [{0}] foi submetida com sucesso.
-widget_resourceFactoryWizard_createWizardTitle = Criar novo recurso do tipo [{0}]
-widget_resourceFactoryWizard_createWizardWindowTitle = Assistente para Cria\u00E7\u00E3o de Recurso
-##widget_resourceFactoryWizard_editConfigStepName = Deployment Options
-widget_resourceFactoryWizard_execute1 = Falha ao criar novo recurso - vers\u00E3o do pacote inexistente
-widget_resourceFactoryWizard_execute2 = Falha ao criar novo recurso
-widget_resourceFactoryWizard_failedToDeleteVersion = Falha ao excluir a vers\u00E3o do pacote durante o cancelamento da cria\u00E7\u00E3o do recurso
-widget_resourceFactoryWizard_failedToGetType = Falha ao recuperar o tipo de pacote para o novo recurso
-widget_resourceFactoryWizard_importFailure = Falha ao importar recursos manualmente
-widget_resourceFactoryWizard_importSubmitted = Uma requisi\u00E7\u00E3o para importar um novo recurso do tipo [{0}] foi submetida
-widget_resourceFactoryWizard_importWizardTitle = Importar Recursos do Tipo [{0}]
-widget_resourceFactoryWizard_importWizardWindowTitle = Assistente para Importa\u00E7\u00E3o de Recurso
-widget_resourceFactoryWizard_infoStepName = Informa\u00E7\u00E3o do Recurso
-widget_resourceFactoryWizard_infoStep_loadFail = Falha ao recuperar Arquiteturas dispon\u00EDveis.
-widget_resourceFactoryWizard_namePrompt = Novo Nome do Recurso
-widget_resourceFactoryWizard_templatePrompt = Modelo de Propriedades para Conex\u00E3o
-##widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
-widget_resourceFactoryWizard_uploadFailure = Falha ao realizar o upload do arquivo
-widget_resourceFactoryWizard_uploadFileStepName = Upload do Arquivo do Recurso
-widget_resourceFactoryWizard_uploadInProgress = Upload em andamento... Esse processo pode demorar alguns minutos para ser finalizado em caso de arquivos muito grandes.
-widget_resourceFactoryWizard_versionPrompt = Vers\u00E3o do Pacote
-widget_resourceSelector_groupCategory = Categoria do Grupo
-widget_resourceSelector_pleaseSelectMultipleResource = Favor selecionar um ou mais recursos
-widget_resourceSelector_pleaseSelectResource = Favor selecionar um recurso
-widget_resourceSelector_selectMultipleResources = Selecionar Recursos
-widget_resourceSelector_selectResource = Selecionar um Recurso
-widget_typeCache_loadFail = Falha ao carregar o metadado do tipo de recurso
-widget_typeTree_badTemplateType = URL inv\u00E1lida. Tipo de template desconhecido [{0}]
-widget_typeTree_badTypeId = URL inv\u00E1lida. Tipo de recurso inv\u00E1lido: ID [{0}]
-widget_typeTree_loadFail = Falha ao carregar tipos de recurso
+#
+# RHQ GUI i18n Messages - Localization: PT
+#
+# Developers: See the following wiki page for how to work with this file:
+#
+# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
+#
+###################################
+common_alert_high = Alto
+common_alert_low = Baixo
+common_alert_medium = M\u00E9dio
+common_buildInfo_gwtVersion = ${gwt.version}
+common_button_ack = Confirmar
+common_button_ack_all = Confirmar Todos
+common_button_add = Adicionar
+common_button_advanced = Avan\u00E7ado...
+common_button_apply = Aplicar
+common_button_cancel = Cancelar
+common_button_close = Fechar
+common_button_compare = Comparar
+common_button_create_child = Criar filho
+common_button_delete = Excluir
+common_button_delete_all = Excluir Todos
+common_button_disable = Desabilitar
+common_button_edit = Editar
+common_button_enable = Habilitar
+common_button_finish = Finalizar
+common_button_import = Importar
+common_button_new = Novo
+common_button_next = Pr\u00F3ximo
+common_button_ok = OK
+common_button_previous = Anterior
+common_button_purgeAll = Remover Todos
+common_button_refresh = Atualizar
+common_button_reset = Limpar
+common_button_save = Salvar
+common_button_schedule = Agendar
+common_button_search = Procurar
+common_button_set = Definir
+common_button_showDetails = Mostrar Detalhes...
+common_button_uninventory = Remover do Invent\u00E1rio
+common_calendar_april_short = abr
+common_calendar_august_short = ago
+common_calendar_december_short = dez
+common_calendar_february_short = fev
+common_calendar_january_short = jan
+common_calendar_july_short = jul
+common_calendar_june_short = jun
+common_calendar_march_short = mar
+common_calendar_may_short = mai
+common_calendar_november_short = nov
+common_calendar_october_short = out
+common_calendar_september_short = set
+common_label_ago = ago
+common_label_all = TODOS
+common_label_all_resources = todos os recursos
+common_label_day = dia
+common_label_days = dias
+common_label_hour = hora
+common_label_hours = horas
+common_label_item = item
+common_label_items = itens
+common_label_milliseconds = milisegundos
+common_label_minutes = minutos
+common_label_month = m\u00EAs
+common_label_none = nenhum
+common_label_role = perfil
+common_label_roles = perfis
+common_label_scheduled_operations = opera\u00E7\u00F5es agendadas
+common_label_seconds = segundos
+common_label_selected_resources = recursos selecionados
+common_label_unlimited = ilimitado
+common_label_user = usu\u00E1rio
+common_label_users = usu\u00E1rios
+common_label_week = semana
+common_label_weeks = semanas
+common_label_yesterday = Ontem
+common_msg_areYouSure = Tem certeza?
+common_msg_asyncTimeout = {0}. Isso ocorre porque o servidor est\u00E1 levando muito tempo para atender esta requisi\u00E7\u00E3o. Favor atentar para o fato de que o servidor ainda esteja processando sua requisi\u00E7\u00E3o e pode concluir dentro de mais alguns instantes. Voc\u00EA ainda pode verificar os logs do servidor para identificar se algum erro anormal ocorreu.
+common_msg_changeAutoDetected = Mudan\u00E7as detectadas automaticamente
+common_msg_deleteConfirm = Tem certeza de que deseja excluir o # selecionado {0}?
+common_msg_emphasizedNotePrefix = NOTA:
+common_msg_loading = Carregando...
+common_msg_noItemsToShow = N\u00E3o existem itens para apresentar
+common_msg_notYetImplemented = N\u00E3o implementado ainda
+common_msg_see_more = Ver detalhes...
+common_msg_step_x_of_y = Passo {0} de {1}
+common_severity_debug = Debug
+common_severity_error = Error
+common_severity_fatal = Fatal
+common_severity_info = Info
+common_severity_warn = Warn
+common_status_canceled = Cancelado
+common_status_deferred = Deferido
+common_status_failed = Falha
+common_status_inprogress = Processando
+common_status_nochange = Sem altera\u00E7\u00E3o
+common_status_partial = Parcial
+common_status_success = Sucesso
+common_status_timedOut = Tempo Esgotado
+common_status_unknown = Desconhecido
+common_title_add_column = Adicionar Coluna
+common_title_add_graph_to_view = Adicionar Gr\u00E1fico ao Monitor de Vis\u00E3o
+common_title_add_portlet = Adicionar Portlet
+common_title_address = Endere\u00E7o
+common_title_alert_range = S\u00E9rie de Alertas
+common_title_ancestry = Ancestral
+common_title_availability = Disponibilidade
+common_title_available_resources = Recursos Dispon\u00EDveis
+common_title_average_metrics = M\u00E9tricas da m\u00E9dia por Minuto
+common_title_background = Fundo (background)
+common_title_bundle = Bundle
+common_title_bundles = Bundles
+common_title_category = Categoria
+common_title_change_refresh_time = Atualizar Intervalo
+common_title_columns = Colunas
+common_title_compare_metrics = Comparar M\u00E9tricas
+common_title_compatibleGroups = Grupos Compat\u00EDveis
+common_title_compatibleGroups_total = Total de Grupos Compat\u00EDveis
+common_title_component_errors = Componentes com erro
+common_title_config_update_status = Atualizar Status
+common_title_configuration = Configura\u00E7\u00E3o
+common_title_count = Quantidade
+common_title_custom = Personalizado
+common_title_dashboard_name = Nome do Painel de Controle
+common_title_dateCreated = Data de Cria\u00E7\u00E3o
+common_title_dateRange = Intervalo de Data
+common_title_default = Padr\u00E3o
+common_title_description = Descri\u00E7\u00E3o
+common_title_details = Detalhes
+common_title_display = Display
+common_title_display_name = Nome do Display
+common_title_duration = Dura\u00E7\u00E3o
+common_title_edit_mode = Modo Edi\u00E7\u00E3o
+common_title_enabled = Habilitado?
+common_title_end = Fim
+common_title_error = Erro
+common_title_favorites = Favoritos
+common_title_generalProp = Propriedades Gerais
+common_title_group = Grupo
+common_title_group_def_total = Total de Defini\u00E7\u00E3o de Grupos
+common_title_group_member_health = Sa\u00FAde do Membro do Grupo
+common_title_groups = Grupos
+common_title_help = Ajuda
+common_title_host = Host
+common_title_icon = \u00EDcone
+common_title_id = ID
+common_title_id_parent = ID do Recurso pai
+common_title_info = Info
+common_title_inventory = Invent\u00E1rio
+common_title_inventorySummary = Sum\u00E1rio do Invent\u00E1rio
+common_title_lastUpdated = \u00DAltima Atualiza\u00E7\u00E3o
+common_title_lastUpdatedBy = \u00DAltima Atualiza\u00E7\u00E3o feita por
+common_title_ldapGroups = Grupos LDAP
+common_title_mashup = Mashup
+common_title_members_reporting = Relat\u00F3rio de Membros
+common_title_message = Mensagem
+common_title_metric = M\u00E9trica
+common_title_metric_chart = Gr\u00E1fico de M\u00E9trica
+common_title_mixedGroups = Grupos Mistos
+common_title_mixedGroups_total = Total de Grupos Mistos
+common_title_name = Nome
+common_title_new_dashboard = Novo Painel de Controle
+common_title_numeric_metrics = M\u00E9tricas Num\u00E9ricas
+common_title_numeric_type = Tipo Num\u00E9rico
+common_title_operation_status = Status da Opera\u00E7\u00E3o
+common_title_operations = Opera\u00E7\u00F5es
+common_title_operations_range = S\u00E9rie de Opera\u00E7\u00F5es
+common_title_over = Execesso
+common_title_password = Senha
+common_title_path = Caminho
+common_title_permissions = Permiss\u00F5es
+common_title_platform = Plataforma
+common_title_platform_total = Total de Plataformas
+common_title_plugin = Plugin
+common_title_port = Porta
+common_title_providers = Provedores
+common_title_recent_alerts = Alertas Recentes
+common_title_recent_bundle_deployments = Recent Bundle Deployments
+common_title_recent_configuration_updates = Configura\u00E7\u00F5es Alteradas Recentemente
+common_title_recent_event_counts = Totaliza\u00E7\u00E3o de Eventos Recentes
+common_title_recent_measurements = M\u00E9tricas Recentes
+common_title_recent_oob_metrics = M\u00E9tricas fora dos limites Recentes
+common_title_recent_operations = Opera\u00E7\u00F5es Recentes
+common_title_recent_pkg_history = Hist\u00F3rico de Pacotes Recentes
+common_title_recently_added = Recursos Adicionados Recentemente
+common_title_remove_column = Remover Coluna
+common_title_repositories = Reposit\u00F3rios
+common_title_resource = Recursos
+common_title_resourceGroups = Resource Groups
+common_title_resource_group = Grupo de Recursos
+common_title_resource_id = ID do Recurso
+common_title_resource_inventory = Invent\u00E1rio de Recursos
+common_title_resource_key = Chave do Recurso
+common_title_resource_name = Nome do Recurso
+common_title_resource_type = Tipo do Recurso
+common_title_resources = Recursos
+common_title_results_count = Resultado Total
+common_title_results_count_tooltip = Mostra este n\u00FAmero de resultados
+common_title_role = Perfil
+common_title_roles = Perfis
+common_title_scheduled_operations = Opera\u00E7\u00F5es Agendadas
+common_title_search = Procurar
+common_title_selected_resources = Recursos Selecionados
+common_title_server = Servidor
+common_title_server_total = Total de Servidores
+common_title_service = Servi\u00E7o
+common_title_service_total = Total de Servi\u00E7os
+common_title_settings = Configura\u00E7\u00F5es
+common_title_show = Visualizar
+common_title_show_more = Visualizar mais...
+common_title_sort_order = Ordena\u00E7\u00E3o
+common_title_sort_order_tooltip = Define a ordem dos resultados.
+common_title_start = Iniciar
+common_title_status = Status
+common_title_stop = Parar
+common_title_summary = Sum\u00E1rio
+common_title_summary_counts = Sum\u00E1rio de Contagem
+common_title_tag_cloud = Nuvem de Tags
+common_title_the = O
+common_title_timestamp = Data/Hora
+common_title_total = Total
+common_title_type = Tipo
+common_title_units = Unidades
+common_title_user = Usu\u00E1rio
+common_title_users = Usu\u00E1rios
+common_title_value = Valor
+common_title_version = Vers\u00E3o
+common_title_view_mode = Modo vis\u00E3o
+common_title_web_address = Endere\u00E7o Web
+common_title_welcome = Bem Vindo
+common_unit_days = dias
+common_unit_hours = horas
+common_unit_milliseconds = milisegundos
+common_unit_minutes = minutos
+common_unit_months = meses
+common_unit_seconds = segundos
+common_unit_times = vezes
+common_unit_weeks = semanas
+common_unit_years = anos
+common_val_for = para
+common_val_n1st = {0}\u00BA
+common_val_n2nd = {0}\u00BA
+common_val_n3rd = {0}\u00BA
+common_val_na = N/A
+common_val_never = Nunca
+common_val_no = N\u00E3o
+common_val_no_lower = n\u00E3o
+common_val_none = Nenhum
+common_val_nth = {0}\u00BA
+common_val_yes = Sim
+common_val_yes_lower = sim
+dataSource_ContentRepoTree_error_load = Erro ao carregar os reposit\u00F3rios
+dataSource_ContentRepoTree_field_parentId = ID pai
+dataSource_bundle_loadFailed = Falha ao carregar os dados do Bundle
+dataSource_configurationHistory_clickToSeeError = Duplo clique para visualizar a mensagem...
+dataSource_configurationHistory_currentConfig = Esta \u00E9 a configura\u00E7\u00E3o atual
+dataSource_configurationHistory_dateCompleted = Conclu\u00EDdo em
+dataSource_configurationHistory_dateSubmitted = Submetido em
+dataSource_configurationHistory_error_fetchFailure = N\u00E3o foi poss\u00EDvel carregar o hist\u00F3rico de configura\u00E7\u00E3o.
+dataSource_configurationHistory_field_createdTime = Criado
+dataSource_configurationHistory_field_id = ID
+dataSource_configurationHistory_field_resource = Recurso
+dataSource_configurationHistory_field_status = Status
+dataSource_configurationHistory_field_subject = Assunto
+dataSource_configurationHistory_updateType = Tipo de atualiza\u00E7\u00E3o
+dataSource_configurationHistory_updateType_group = Grupo
+dataSource_configurationHistory_updateType_individual = Individual
+dataSource_definitions_loadFailed = Falha ao carregar defini\u00E7\u00E3o de m\u00E9tricas
+dataSource_measurementOob_error_fetchFailure = Falha ao carregar informa\u00E7\u00F5es das m\u00E9tricas OOB
+dataSource_measurementOob_field_factor = Fator fora da faixa (%)
+dataSource_measurementOob_field_formattedBaseband = Faixa
+dataSource_measurementOob_field_formattedOutlier = Fora de s\u00E9rie
+dataSource_measurementOob_field_parentName = Pai
+dataSource_measurementOob_field_resourceName = Recurso
+dataSource_measurementOob_field_scheduleName = M\u00E9trica
+dataSource_operationHistory_error_fetchFailure = Falha ao carregar o hist\u00F3rico de opera\u00E7\u00F5es.
+dataSource_operationHistory_field_createdTime = Data de cria\u00E7\u00E3o
+dataSource_operationHistory_field_operationName = Nome da Opera\u00E7\u00E3o
+dataSource_operationHistory_field_startedTime = Iniciado em
+dataSource_operationHistory_field_subject = Solicitante
+dataSource_operationSchedule_field_description = Notas
+dataSource_operationSchedule_field_id = ID do Agendamento
+dataSource_operationSchedule_field_nextFireTime = Pr\u00F3xima execu\u00E7\u00E3o
+dataSource_operationSchedule_field_operationDisplayName = Opera\u00E7\u00E3o
+dataSource_operationSchedule_field_operationName = Opera\u00E7\u00E3o
+dataSource_operationSchedule_field_subject = Propriet\u00E1rio
+dataSource_operationSchedule_field_timeout = Tempo limite (em segundos)
+dataSource_platforms_field_cpu = CPU
+dataSource_platforms_field_memory = Mem\u00F3ria
+dataSource_platforms_field_swap = Swap
+dataSource_problemResources_error_fetchFailure = Falha com carregar Recursos com alertas/indisponibilidade.
+dataSource_problemResources_field_alerts = Alertas
+dataSource_problemResources_field_available = Disponibilidade Atual
+dataSource_problemResources_field_location = Local
+dataSource_problemResources_field_resource = Recurso
+dataSource_recentOperations_error_fetchFailure = Falha ao carregar a lista de opera\u00E7\u00F5es finalizadas recentemente.
+dataSource_recentOperations_field_location = Localiza\u00E7\u00E3o
+dataSource_recentOperations_field_operation = Opera\u00E7\u00E3o
+dataSource_recentOperations_field_resource = Recurso
+dataSource_recentOperations_field_status = Status
+dataSource_recentOperations_field_time = Data/Hora
+dataSource_resourceErrors_clickStatusIcon = Clique no \u00EDcone para mais detalhes
+dataSource_resourceErrors_deleteFailure = Falha do excluir mensagens de erros do recurso
+dataSource_resourceErrors_deleteSuccess = Mensagens de erro para o recurso [{0}] exclu\u00EDdas com sucesso.
+dataSource_resourceErrors_error_fetchFailure = Falha ao procurar por erros para o Recurso com ID [{0}].
+dataSource_resourceErrors_field_detail = Mensagem detalhada
+dataSource_resourceErrors_field_errorType = Tipo de Erro
+dataSource_resourceErrors_field_summary = Sum\u00E1rio
+dataSource_resourceErrors_field_timeOccured = Tempo
+dataSource_resourceGroups_loadFailed = Falha ao carregar grupos de recurso
+dataSource_resources_field_discoveryTime = Data de Descoberta
+dataSource_resources_field_importTime = Data de Importa\u00E7\u00E3o
+dataSource_resources_field_key = Chave
+dataSource_resources_field_lastModifiedTime = Data da \u00FAltima altera\u00E7\u00E3o
+dataSource_resources_field_lastModifier = \u00DAltima altera\u00E7\u00E3o
+dataSource_resources_field_location = Localiza\u00E7\u00E3o
+dataSource_rpc_error_transformRequestFailure = Ocorreu uma falha na fonte de dados durante o processamento da requisi\u00E7\u00E3o {0}.
+dataSource_rpc_error_unsupportedArrayFilterType = Sem suporte para o array filters do tipo {0}.
+dataSource_rpc_error_unsupportedEnumType = Favor adicionar um trecho de c\u00F3digo apropriado para a enum {0} para RPCDataSource.getEnumArray(Class)
+dataSource_rpc_no = n\u00E3o
+dataSource_rpc_yes = sim
+dataSource_scheduledOperations_error_fetchFailure = Falha ao carregar a lista de opera\u00E7\u00F5es agendadas
+dataSource_scheduledOperations_field_location = Localiza\u00E7\u00E3o
+dataSource_scheduledOperations_field_operation = Opera\u00E7\u00E3o
+dataSource_scheduledOperations_field_resource = Recurso
+dataSource_scheduledOperations_field_time = Data/Hora
+dataSource_schedules_disableFailure_group = Falha ao desabilitar a coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas eram: [{2}]
+dataSource_schedules_disableFailure_resource = Falha ao desabilitar a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas eram: [{2}]
+dataSource_schedules_disableSuccessful_concise = Voc\u00EA desabilitou a coleta de m\u00E9tricas de [{0}]
+dataSource_schedules_disableSuccessful_full_group = Voc\u00EA desabilitou a coleta de m\u00E9tricas de[{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas desabilitadas s\u00E3o: [{2}]
+dataSource_schedules_disableSuccessful_full_resource = Voc\u00EA desabilitou a coleta de m\u00E9tricas de[{0}] para o recurso com ID [{1}]. As m\u00E9tricas desabilitadas s\u00E3o: [{2}]
+dataSource_schedules_enableFailure_group = Falha ao habilitar a coleta de m\u00E9tricas de [{0}] para o grupo com ID [{1}]. As m\u00E9tricas s\u00E3o: [{2}]
+dataSource_schedules_enableFailure_resource = Falha ao habilitar a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas s\u00E3o: [{2}]
+dataSource_schedules_enableSuccessful_concise = Voce habilitou a coleta de m\u00E9tricas de [{0}]
+dataSource_schedules_enableSuccessful_full_group = Voc\u00EA habilitou a coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas habilitadas foram: [{2}]
+dataSource_schedules_enableSuccessful_full_resource = Voc\u00EA habilitou a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas habilitadas foram: [{2}]
+dataSource_schedules_field_resourceGroupId = ID de Grupo
+dataSource_schedules_loadFailed = Falha ao carregar agendamento de m\u00E9tricas
+dataSource_schedules_loadFailedContext = Falha ao carregar agendamentos de m\u00E9tricas para o contexto [{0}]
+dataSource_schedules_loadFailedCriteria = Falha ao carregar agendamentos de m\u00E9tricas com o crit\u00E9io [{0}]
+dataSource_schedules_updateFailure_group = Falha ao configurar o intervalo para coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. M\u00E9tricas: [{2}]. O intervalo de coleta seria de [{3}] segundos.
+dataSource_schedules_updateFailure_resource = Falha ao configurar o intervalo para coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. M\u00E9tricas: [{2}]. O intervalo de coleta seria de [{3}] segundos.
+dataSource_schedules_updateSuccessful_concise = Um novo intervalo de coleta de [{0}] segundos foi configurado para m\u00E9tricas de [{1}]
+dataSource_schedules_updateSuccessful_full_group = Um novo intervalo de coleta de [{0}] segundos foi configurado para m\u00E9tricas de [{1}] para o grupo de recursos com ID [{2}]. M\u00E9tricas atualizadas: [{3}]
+dataSource_schedules_updateSuccessful_full_resource = Um novo intervalo de coleta de [{0}] segundos foi configurado para m\u00E9tricas de [{1}] para o recurso com ID [{2}]. M\u00E9tricas atualizadas: [{3}]
+dataSource_traits_failFetch = Falha ao obter as caracter\u00EDsticas com o crit\u00E9rio [{0}].
+dataSource_traits_field_definitionID = ID da defini\u00E7\u00E3o
+dataSource_traits_field_lastChanged = \u00DAltima Altera\u00E7\u00E3o
+dataSource_traits_field_primaryKey = Chave Prim\u00E1ria
+dataSource_traits_field_trait = Propriedade
+dataSource_traits_group_field_groupId = ID de Grupo
+dataSource_traits_group_field_memberResource = Recurso Membro
+dataSource_users_delete = Usu\u00E1rio exclu\u00EDdo [{0}]
+dataSource_users_deleteFailed = Falha ao excluir o usu\u00E1rio [{0}]
+dataSource_users_field_department = Departamento
+dataSource_users_field_emailAddress = Endere\u00E7o de Email
+dataSource_users_field_factive = Login Habilitado?
+dataSource_users_field_firstName = Primeiro Nome
+dataSource_users_field_id = ID
+dataSource_users_field_lastName = \u00DAltimo Nome
+dataSource_users_field_ldap = LDAP Login?
+dataSource_users_field_name = Nome do Usu\u00E1rio
+dataSource_users_field_password = Senha
+dataSource_users_field_passwordVerify = Verifique a Senha
+dataSource_users_field_phoneNumber = N\u00FAmero de Telefone
+dataSource_users_invalidEmailAddress = Endere\u00E7o de email inv\u00E1lido.
+dataSource_users_passwordsDoNotMatch = Senhas n\u00E3o conferem.
+datasource_roles_field_ldapGroups = Grupos LDAP
+datasource_roles_field_permissions = Permiss\u00F5es
+datasource_roles_field_resourceGroups = Grupos de Recurso
+datasource_roles_field_subjects = Subjects
+datasource_templateSchedules_disabled = Desabilitar a coleta da m\u00E9trica selecionada [{0}].
+datasource_templateSchedules_disabled_detailed = Desabilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
+datasource_templateSchedules_disabled_failed = Falha ao desabilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
+datasource_templateSchedules_enabled = Habilitar a coleta da m\u00E9trica selecionada [{0}].
+datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled_failed = Falha ao habilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
+datasource_templateSchedules_updated = Intervalos de coleta atualizados para a m\u00E9trica [{0}].
+datasource_templateSchedules_updated_detail = Intervalo de coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}] configurado para [{3}] segundos.
+datasource_templateSchedules_updated_failed = Falha ao configurar o intervalo de coleta para [{0}] segundos para a m\u00E9trica [{1}] [{2}] para o Tipo de Recurso com id [{3}].
+favorites = Favoritos
+favorites_groups = Grupos Favoritos
+favorites_recentlyViewed = Acessados Recentemente
+favorites_resources = Recursos Favoritos
+group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource
+util_ancestry_parentAncestry = Ancestral para:
+util_errorHandler_nullException = Exce\u00E7\u00E3o nula
+util_monitoringRequestCallback_error_checkServerStatusFailure = Imposs\u00EDvel verificar o status do login - verifique o status do Servidor.
+util_rpcManager_activeRequests = {0} Requisi\u00E7\u00F5es ativas
+util_userPerm_loadFailGlobal = Falha ao carregar permiss\u00F5es globais - nenhuma permiss\u00E3o concedida.
+util_userPerm_loadFailGroup = Falha ao carregar suas permiss\u00F5es para o Grupo de Recursos com id [{0}] - nenhuma permiss\u00E3o concedida.
+util_userPerm_loadFailResource = Falha ao carregar suas permiss\u00F5es para o Recurso com id [{0}] - nenhuma permiss\u00E3o concedida.
+util_userSession_loadFailSubject = UserSessionManager: Falha ao carregar a credencial do usu\u00E1rio
+util_userSession_logoutFail = Falha durante o logout.
+util_widgetsField_unlimited = Ilimitado
+view_aboutBox_allRightsReserved = Todos os Direitos Reservados.~
+view_aboutBox_buildNumber = N\u00FAmero do Build:~
+view_aboutBox_failedToLoad = Falha ao carregar informa\u00E7oes do produto.~
+view_aboutBox_homepage = P\u00E1gina Inicial~
+view_aboutBox_jbossByRedHat = JBoss by Red Hat~
+view_aboutBox_title = Sobre {0}~
+view_aboutBox_version = Vers\u00E3o:
+view_adminConfig_downloads = Downloads
+view_adminConfig_license = Licen\u00E7a
+view_adminConfig_plugins = Plugins
+view_adminConfig_systemSettings = Propriedades de Sistema
+view_adminConfig_templates = Templates
+view_adminContent_contentSources = Fontes de Conte\u00FAdo
+view_adminContent_repositories = Reposit\u00F3rios
+view_adminRoles_assignedGroups = Grupos de Recursos Associados
+view_adminRoles_assignedSubjects = Perfis Associados
+view_adminRoles_failLdap = Falha ao determinar se o LDAP foi configurado - assumindo como LDAP n\u00E3o configurado.
+view_adminRoles_failLdapGroups = Falha ao recuperar os grupos dispon\u00EDveis no LDAP - assumindo como LDAP sem grupos.
+view_adminRoles_failLdapGroupsRole = Falha ao carregar grupos do LDAP dispon\u00EDveis para o perfil.
+view_adminRoles_failRoles = Falha ao recuperar perfis.
+view_adminRoles_globalPerms = Permiss\u00F5es Globais
+view_adminRoles_ldapGroups = Grupos LDAP
+view_adminRoles_ldapGroupsReadOnly = Informa\u00E7\u00F5es do grupo LDAP com permiss\u00F5es apenas de leitura
+view_adminRoles_noItems = Sem itens para apresentar
+view_adminRoles_noLdap = A integra\u00E7\u00E3o com o LDAP ainda n\u00E3o foi configurada. Para configurar o LDAP acesse <a {0}>{1}</a>.
+view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
+view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
+view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
+view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
+view_adminRoles_permissions_globalPermissions = Permiss\u00F5es Globais
+view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
+view_adminRoles_permissions_isAuthorized = Autorizado?
+view_adminRoles_permissions_isRead = Leitura?
+view_adminRoles_permissions_isWrite = Escrita?
+view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
+view_adminRoles_permissions_permDesc_manageInventory = possui todas as permiss\u00F5es de Recurso, como descrito abaixo, pode criar, atualizar, excluir grupos e importar Recursos descobertos automaticamente ou manualmente.
+view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
+view_adminRoles_permissions_permDesc_manageSecurity = Pode criar, atualizar, ou excluir usu\u00E1rios e perfis (visualiza\u00E7\u00E3o \u00E9 padr\u00E3o para todos)
+view_adminRoles_permissions_permDesc_manageSettings = pode modificar a configura\u00E7\u00E3o do RHQ Server e utilizar qualquer funcionalidade relacionada ao Servidor
+view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
+view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
+view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) view child Resource creation history
+view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view child Resource deletion history
+view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
+view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
+view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
+view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
+view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
+view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
+view_adminRoles_permissions_permWriteDesc_control = execute operations; delete operation execution history items
+view_adminRoles_permissions_permWriteDesc_createChildResources = create new child Resources (for child Resources of types that are creatable)
+view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
+view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
+view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
+view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
+view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
+view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
+view_adminRoles_permissions_perm_configure = Configurar
+view_adminRoles_permissions_perm_control = Controlar
+view_adminRoles_permissions_perm_createChildResources = Create Child Resources
+view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
+view_adminRoles_permissions_perm_inventory = Invent\u00E1rio
+view_adminRoles_permissions_perm_manageAlerts = Gerenciar Alertas
+view_adminRoles_permissions_perm_manageBundles = Gerenciar Bundles
+view_adminRoles_permissions_perm_manageContent = Gerenciar Conte\u00FAdo
+view_adminRoles_permissions_perm_manageEvents = Gerenciar Eventos
+view_adminRoles_permissions_perm_manageInventory = Gerenciar Invent\u00E1rio
+view_adminRoles_permissions_perm_manageMeasurements = Gerenciar M\u00E9tricas
+view_adminRoles_permissions_perm_manageRepositories = Gerenciar Reposit\u00F3rios
+view_adminRoles_permissions_perm_manageSecurity = Gerenciar Seguran\u00E7a
+view_adminRoles_permissions_perm_manageSettings = Gerenciar Configura\u00E7\u00F5es
+view_adminRoles_permissions_read = Leitura:
+view_adminRoles_permissions_readAccessImplied = Acesso de leitura para a permiss\u00E3o {0} \u00E9 impl\u00EDcita e n\u00E3o pode ser desabilitada.
+view_adminRoles_permissions_resourcePermissions = Permiss\u00F5es de Recurso
+view_adminRoles_permissions_write = Escrita:
+view_adminRoles_perms = Permiss\u00F5es
+view_adminRoles_resourcePerms = Permiss\u00F5es do Recurso
+view_adminRoles_roleAdded = Perfil [{0}] adicionado.
+view_adminRoles_roleDeleteFailed = Falha ao excluir o perfil [{0}].
+view_adminRoles_roleDeleted = Perfil [{0}] exclu\u00EDdo.
+view_adminRoles_roleExists = O perfil com nome [{0}] j\u00E1 existe.
+view_adminRoles_roleUpdateFailed = Falha ao atualizar o perfil [{0}].
+view_adminRoles_roleUpdated = Perfil [{0}] atualizado.
+view_adminSecurity_roles = Perfis
+view_adminSecurity_users = Usu\u00E1rios
+view_adminTemplates_disabledAlertTemplates = Templates de Alerta Desabilitados
+view_adminTemplates_disabledMetricTemplates = Templates de M\u00E9trica Desabilitados
+view_adminTemplates_editAlertTemplate = Editar Template de Alerta
+view_adminTemplates_editMetricTemplate = Editar Template de M\u00E9trica
+view_adminTemplates_enabledAlertTemplates = Templates de Alerta Habilitados
+view_adminTemplates_enabledMetricTemplates = Templates de M\u00E9trica Habilitados
+view_adminTemplates_platformServices = Servi\u00E7os da Plataforma
+view_adminTemplates_platforms = Plataformas
+view_adminTemplates_prompt_disabledAlertTemplates = N\u00FAmero de templates de alerta criados mas desabilitados para este tipo de recurso
+view_adminTemplates_prompt_disabledMetricTemplates = N\u00FAmero de coletas de m\u00E9trica desabilitadas por padr\u00E3o para este tipo de recurso
+view_adminTemplates_prompt_enabledAlertTemplates = N\u00FAmero de templates de alerta habilitados para este tipo de recurso
+view_adminTemplates_prompt_enabledMetricTemplates = N\u00FAmero de coletas de m\u00E9trica habilitadas por padr\u00E3o para este tipo de recurso
+view_adminTemplates_servers = Servidores
+view_adminTopology_affinityGroups = Grupos de Afinidade
+view_adminTopology_agents = Agentes
+view_adminTopology_partitionEvents = Eventos na Parti\u00E7\u00E3o
+view_adminTopology_remoteAgentInstall = Instala\u00E7\u00E3o Remota de Agentes
+view_adminTopology_servers = Servidores
+view_adminUsersDetails_dataTypeName = usu\u00E1rio
+view_adminUsersList_dataTypeName = usu\u00E1rio
+view_adminUsersList_dataTypeNamePlural = usu\u00E1rios
+view_admin_administration = Administra\u00E7\u00E3o
+view_admin_configuration = Configura\u00E7\u00E3o
+view_admin_content = Conte\u00FAdo
+view_admin_downloads_agentDownload = Agent Download
+view_admin_downloads_agent_buildNumber = Agent Build
+view_admin_downloads_agent_help = <p> This is the RHQ Agent Update Binary jar file. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>Agent Install</h3> <p> <b>java -jar <agent-download.jar> --install[ = <new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>Agent Update</h3> <p> <b>java -jar <agent-download.jar> --update[ = <old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
+view_admin_downloads_agent_link_label = Link
+view_admin_downloads_agent_link_value = Download Agent {0} ({1})
+view_admin_downloads_agent_loadError = Cannot get agent version info
+view_admin_downloads_agent_md5 = Agent MD5
+view_admin_downloads_agent_version = Agent Version
+view_admin_downloads_bundleDownload = Bundle Deployer Download
+view_admin_downloads_bundle_help = <p> view_admin_downloads_bundle_link_label = Link
+view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
+view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
+view_admin_downloads_cliDownload = Command Line Client Download
+view_admin_downloads_cli_buildNumber = CLI Build
+view_admin_downloads_cli_help = <p> view_admin_downloads_cli_link_label = Link
+view_admin_downloads_cli_link_value = Download CLI {0} ({1})
+view_admin_downloads_cli_loadError = Cannot get CLI version info
+view_admin_downloads_cli_md5 = CLI MD5
+view_admin_downloads_cli_version = CLI Version
+view_admin_downloads_connectorsDownload = Connectors Download
+view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
+view_admin_downloads_connectors_loadError = Cannot get connectors info
+view_admin_downloads_connectors_none = No connectors are available for download
+view_admin_landing = Nesta se\u00E7\u00E3o \u00E9 poss\u00EDvel administrar propriedades globais do RHQ. Isso inclui configura\u00E7\u00F5es de Seguran\u00E7a, Plugins, e gerenciamento de servidores RHQ e agentes.
+view_admin_measTemplates_title = Template Metric Collection Schedules
+view_admin_measTemplates_updateExisting_title = Update Existing Schedules
+view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
+view_admin_security = Seguran\u00E7a
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
+view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
+view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
+view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
+view_admin_systemSettings_BaseURL_name = GUI Console URL
+view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
+view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
+view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
+view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
+view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
+view_admin_systemSettings_DataMaintenance_name = Database Maintenance Period
+view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
+view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
+view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
+view_admin_systemSettings_EnableAgentAutoUpdate_name = Enable Agent Auto-Updates
+view_admin_systemSettings_EnableDebugMode_desc = If enabled, the server will enter debug mode.
+view_admin_systemSettings_EnableDebugMode_name = Enable Debug Mode
+view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
+view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
+view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_EventPurge_name = Delete Events Older Than
+view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
+view_admin_systemSettings_JAASProvider_name = Enable LDAP
+view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou = People,dc = redhat,dc = com
+view_admin_systemSettings_LDAPBaseDN_name = Search Base
+view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn = Manager,dc = redhat,dc = com
+view_admin_systemSettings_LDAPBindDN_name = Username
+view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
+view_admin_systemSettings_LDAPBindPW_name = Password
+view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser = true
+view_admin_systemSettings_LDAPFilter_name = Search Filter
+view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
+view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
+view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
+view_admin_systemSettings_LDAPLoginProperty_name = Login Property
+view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
+view_admin_systemSettings_LDAPProtocol_name = SSL
+view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
+view_admin_systemSettings_LDAPUrl_name = LDAP URL
+view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
+view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
+view_admin_systemSettings_cannotLoadServerDetails = Cannot load server details
+view_admin_systemSettings_cannotLoadSettings = Cannot obtain the current system settings
+view_admin_systemSettings_fixBeforeSaving = Please fix the invalid values before saving
+view_admin_systemSettings_group_baseline = Automatic Baseline Configuration Properties
+view_admin_systemSettings_group_dataMgr = Data Manager Configuration Properties
+view_admin_systemSettings_group_general = General Configuration Properties
+view_admin_systemSettings_group_ldap = LDAP Configuration Properties
+view_admin_systemSettings_saveFailure = Failed to save the system settings
+view_admin_systemSettings_savedSettings = You successfully saved the system properties
+view_admin_systemSettings_serverDetails = Server Details
+view_admin_systemSettings_serverDetails_buildNumber = Build Number
+view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
+view_admin_systemSettings_serverDetails_dbDriverName = Database Driver Name
+view_admin_systemSettings_serverDetails_dbDriverVersion = Database Driver Version
+view_admin_systemSettings_serverDetails_dbName = Database Product Name
+view_admin_systemSettings_serverDetails_dbUrl = Database Connection URL
+view_admin_systemSettings_serverDetails_dbVersion = Database Product Version
+view_admin_systemSettings_serverDetails_installDir = Server Installation Directory
+view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
+view_admin_systemSettings_serverDetails_time = Server Local Time
+view_admin_systemSettings_serverDetails_tz = Server Time Zone
+view_admin_topology = Topologia
+view_alert_common_tab_conditions = Condi\u00E7\u00F5es
+view_alert_common_tab_conditions_expression = Disparar alerta quando
+view_alert_common_tab_conditions_expression_tooltip = Determina se QUALQUER UMA ou TODAS as condi\u00E7\u00F5es devem ser satisfeitas para que todo o conjunto de condi\u00E7\u00F5es seja considerado verdadeiro.
+view_alert_common_tab_conditions_modal_title = Adicionar nova condi\u00E7\u00E3o.
+view_alert_common_tab_conditions_recovery_disabled = Este alerta desativou a sua defini\u00E7\u00E3o.
+view_alert_common_tab_conditions_recovery_enabled = ''{0}'' disparado para ser reativado.
+view_alert_common_tab_conditions_text = Condi\u00E7\u00E3o
+view_alert_common_tab_conditions_type_availability = Mudan\u00E7a na Disponibilidade
+view_alert_common_tab_conditions_type_availability_down = Indispon\u00EDvel
+view_alert_common_tab_conditions_type_availability_up = Dispon\u00EDvel
+view_alert_common_tab_conditions_type_event = Detec\u00E7\u00E3o de Envento
+view_alert_common_tab_conditions_type_event_matching = combinando com o evento de origem
+view_alert_common_tab_conditions_type_metric_baseline = Valor da m\u00E9trica excede a linha de base (baseline)
+view_alert_common_tab_conditions_type_metric_baseline_verb = de
+view_alert_common_tab_conditions_type_metric_calltime_change = Mudan\u00E7a no tempo de chamada
+view_alert_common_tab_conditions_type_metric_calltime_change_verb = ao menos
+view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Aumento
+view_alert_common_tab_conditions_type_metric_calltime_delta_other = Mudan\u00E7a
+view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Redu\u00E7\u00E3o
+view_alert_common_tab_conditions_type_metric_calltime_destination = com o destino da chamada correspondente
+view_alert_common_tab_conditions_type_metric_calltime_threshold = Tempo de chamada excede o limiar (threshold)
+view_alert_common_tab_conditions_type_metric_change = Mudan\u00E7a no valor da m\u00E9trica
+view_alert_common_tab_conditions_type_metric_threshold = Valor da M\u00E9trica excede o limiar (threshold)
+view_alert_common_tab_conditions_type_metric_trait_change = Mudan\u00E7a de Carater\u00EDstica
+view_alert_common_tab_conditions_type_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
+view_alert_common_tab_conditions_type_operation_status = resultado com status
+view_alert_common_tab_conditions_type_resource_configuration = Mudan\u00E7a na Configura\u00E7\u00E3o do Recurso
+view_alert_common_tab_conditions_value = Valor
+view_alert_common_tab_dampening = Sensibilidade
+view_alert_common_tab_dampening_category_consecutive_count = Consecutivos
+view_alert_common_tab_dampening_category_consecutive_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias consecutivas em que o conjunto de condi\u00E7\u1E4Des for satisfeito.
+view_alert_common_tab_dampening_category_duration_count = Per\u00EDodo de Tempo
+view_alert_common_tab_dampening_category_duration_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias em que o conjunto de condi\u00E7\u00F5es \u00E9 satisfeito dentro de um dado per\u00EDodo de tempo.
+view_alert_common_tab_dampening_category_none = N\u00E3o definido
+view_alert_common_tab_dampening_category_none_tooltip = Sensibilidade desabilitada. Cada vez que o conjunto de condi\u00E7\u00F5es for satisfeito, um alerta ser\u00E1 disparado.
+view_alert_common_tab_dampening_category_partial_count = \u00DAltimas N verifica\u00E7\u00F5es
+view_alert_common_tab_dampening_category_partial_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias em que o conjunto de condi\u00E7\u00F5es \u00E9 satisfeito durante as \u00FAltimas N verifica\u00E7\u00F5es.
+view_alert_common_tab_dampening_consecutive_occurrences_label = Ocorr\u00EAcias
+view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = O n\u00FAmero de vezes que o conjunto de condi\u00E7\u00F5es deve ser satisfeito antes do alerta ser disparado.
+view_alert_common_tab_dampening_duration_occurrences_label = Ocorr\u00EAncias
+view_alert_common_tab_dampening_duration_occurrences_label_tooltip = O n\u00FAmero de vezes que o conjunto de condi\u00E7\u00F5es deve ser satisfeito durante o per\u00EDodo de tempo definido antes do alerta ser disparado.
+view_alert_common_tab_dampening_duration_period_label = Per\u00EDodo de Tempo
+view_alert_common_tab_dampening_duration_period_label_tooltip = Espa\u00E7o de tempo em que o conjunto de condi\u00E7\u00F5es ser\u00E1 testado para verificar se o n\u00FAmero de ocorr\u00EAncias definido \u00E9 satisfeito.
+view_alert_common_tab_dampening_partial_evalatuions_label = Verifica\u00E7\u00F5es
+view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = O total de vezes que o conjunto de condi\u00E7\u00F5es ser\u00E1 testado para certificar-se de que o n\u00FAmero de ocorr\u00EAncias definido foi satisfeito.
+view_alert_common_tab_dampening_partial_occurrences_label = Ocorr\u00EAncias
+view_alert_common_tab_dampening_partial_occurrences_label_tooltip = O n\u00FAmero de vezes que o conjunto de condi\u00E7\u00F5es deve ser satisfeito durante as \u00FAltimas N verifica\u00E7\u00F5es antes do alerta ser disparado.
+view_alert_common_tab_general = Propriedades Gerais
+view_alert_common_tab_invalid_condition_category = Categoria de condi\u00E7\u00E3o inv\u00E1lida - favor reportar como um bug: {0}
+view_alert_common_tab_invalid_dampening_category = Categora de sensibilidade inv\u00E1lida - favor reportar como um bug: {0}
+view_alert_common_tab_invalid_time_units = Unidade de tempo inv\u00E1lida - favor reportar como um bug: {0}
+view_alert_common_tab_notifications = Notifica\u00E7\u00F5es
+view_alert_common_tab_notifications_all_emails = Todos os Emails
+view_alert_common_tab_notifications_bad_emails = Emails recusados
+view_alert_common_tab_notifications_message = Mensagem
+view_alert_common_tab_notifications_sender = Remetente
+view_alert_common_tab_notifications_status = Status
+view_alert_common_tab_recovery = Recupera\u00E7\u00E3o~
+view_alert_definition_condition_editor_avilability_option_down = INDISPON\u00CDVEL
+view_alert_definition_condition_editor_avilability_option_up = DISPON\u00CDVEL
+view_alert_definition_condition_editor_avilability_tooltip = Especifica a mudan\u00E7a de estado na disponibilidade do recurso que ir\u00E1 disparar a condi\u00E7\u00E3o.
+view_alert_definition_condition_editor_avilability_value = Disponibilidade
+view_alert_definition_condition_editor_common_avg = M\u00E9dio
+view_alert_definition_condition_editor_common_max = M\u00E1ximo
+view_alert_definition_condition_editor_common_min = M\u00EDnimo
+view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+view_alert_definition_condition_editor_event_regex = Express\u00E3o Regular
+view_alert_definition_condition_editor_event_regex_tooltip = Se definida, a condi\u00E7\u00E3o somente ser\u00E1 disparada caso o evento satisfa\u00E7a a express\u00E3o.
+view_alert_definition_condition_editor_event_severity = Severidade do Evento
+view_alert_definition_condition_editor_event_severity_debug = Debug
+view_alert_definition_condition_editor_event_severity_error = Error
+view_alert_definition_condition_editor_event_severity_fatal = Fatal
+view_alert_definition_condition_editor_event_severity_info = Info
+view_alert_definition_condition_editor_event_severity_warn = Warn
+view_alert_definition_condition_editor_event_tooltip = Define a severeidade do evento para disparar a condi\u00E7\u00E3o. Caso seja definida uma express\u00E3o regular, a condi\u00E7\u00E3o somente ser\u00E1 disparada se o evento satisfazer a express\u00E3o.
+view_alert_definition_condition_editor_metric_baseline_percentage = Percentual da linha de base
+view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = Valor da m\u00E9trica coletada usada para disparo da condi\u00E7\u00E3o quando comparado ao valor da linha de base selecionada
+view_alert_definition_condition_editor_metric_baseline_tooltip = Especifica a linha de base que, quando violada, dispara a condi\u00E7\u00E3o. O valor especificado \u00E9 o percentual do valor da linha de base informado.
+view_alert_definition_condition_editor_metric_baseline_value = Linha de base (<i>baseline</i>)
+view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentual de Mudan\u00E7a
+view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = Valor do tempo de chamada coletado usado para disparar a condi\u00E7\u00E3o quando diferir do percentual do valor limite do tempo de chamada definido.
+view_alert_definition_condition_editor_metric_calltime_change_tooltip = Especifica o valor do tempo de chamada que, quanto alterado, dispara a condi\u00E7\u00E3o. \u00C9 necess\u00E1rio especificar o tempo limite para a chamada (m\u00EDnimo, m\u00E1ximo ou m\u00E9dio) e o percental de mudan\u00E7a que deve ocorrer.
+view_alert_definition_condition_editor_metric_calltime_common_comparator = Compara\u00E7\u00E3o
+view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Mudan\u00E7as
+view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Ganhos
+view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Redu\u00E7\u00F5es
+view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = Como o valor do tempo de chamada deve ser comparado ao valor limite
+view_alert_definition_condition_editor_metric_calltime_common_limit = Tempo limite da chamada
+view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = Tempo de chamada limite a ser comparado com o valor informado
+view_alert_definition_condition_editor_metric_calltime_common_name = M\u00E9trica do tempo de chamada
+view_alert_definition_condition_editor_metric_calltime_common_regex = Express\u00E3o Regular
+view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = Se especificada, essa \u00E9 a express\u00E3o regular a ser satisfeita pela chamada para disparar a condi\u00E7\u00E3o.
+view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Especifica um tempo limite para a chamada que, quando alcan\u00E7ado, dispara a condi\u00E7\u00E3o. O valor especificado deve ser absoluto e com uma unidade de medida opcional. \u00C9 necess\u00E1rio especificar o tempo limite da chamada para compar\u00E1-lo ao valor: m\u00EDnimo, m\u00E1ximo ou m\u00E9dio.
+view_alert_definition_condition_editor_metric_calltime_threshold_value = Valor do tempo de chamada
+view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = O valor do limiar (<i>threshold</i>) da m\u00E9trica usado para disparar a condi\u00E7\u00E3o quando comparado ao mecanismo de compara\u00E7\u00E3o escolhido.
+view_alert_definition_condition_editor_metric_change_tooltip = Especifica a m\u00E9trica cujo valor deve ser alterado para disparar a condi\u00E7\u00E3o.
+view_alert_definition_condition_editor_metric_common_definition_not_found = Deve existir uma defini\u00E7\u00E3o para a m\u00E9trica - algo est\u00E1 incorreto
+view_alert_definition_condition_editor_metric_threshold_comparator = Mecanismo de Compara\u00E7\u00E3o
+view_alert_definition_condition_editor_metric_threshold_comparator_equal = Igual \u00E0
+view_alert_definition_condition_editor_metric_threshold_comparator_greater = Maior que
+view_alert_definition_condition_editor_metric_threshold_comparator_less = Menor que
+view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = Como a m\u00E9trica coletada deve ser comparada ao threshold estabelecido
+view_alert_definition_condition_editor_metric_threshold_name = M\u00E9trica
+view_alert_definition_condition_editor_metric_threshold_tooltip = Especifica um threshold que, quando alcan\u00E7ado, dispara a condi\u00E7\u00E3o. O valor especificado deve ser absoluto e com uma unidade de medida opcional.
+view_alert_definition_condition_editor_metric_threshold_value = Valor da M\u00E9trica
+view_alert_definition_condition_editor_metric_threshold_value_tooltip = Limiar (threshold) da m\u00E9trica utilizado na compara\u00E7\u00E3o como condi\u00E7\u00E3o de disparo.
+view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_trait_change_value = Caracter\u00EDstica
+view_alert_definition_condition_editor_operation_status = Status da Opera\u00E7\u00E3o
+view_alert_definition_condition_editor_operation_status_canceled = Cancelada
+view_alert_definition_condition_editor_operation_status_failure = Falha
+view_alert_definition_condition_editor_operation_status_inprogress = Em andamento
+view_alert_definition_condition_editor_operation_status_success = Sucesso
+view_alert_definition_condition_editor_operation_tooltip = Define o resultado esperado quando a opera\u00E7\u00E3o selecionada for executada para dispararo da confi\u00E7\u00E3o.
+view_alert_definition_condition_editor_operation_value = Opera\u00E7\u00E3o
+view_alert_definition_condition_editor_option_availability = Mudan\u00E7a de Disponibilidade
+view_alert_definition_condition_editor_option_event = Detec\u00E7\u00E3o de Evento
+view_alert_definition_condition_editor_option_label = Tipo de Condi\u00E7\u00E3o
+view_alert_definition_condition_editor_option_metric_baseline = Threshold base da M\u00E9trica
+view_alert_definition_condition_editor_option_metric_calltime_change = Mudan\u00E7a no tempo de chamada
+view_alert_definition_condition_editor_option_metric_calltime_threshold = Tempo limite da chamada
+view_alert_definition_condition_editor_option_metric_change = Mudan\u00E7a no valor da M\u00E9trica
+view_alert_definition_condition_editor_option_metric_threshold = Threshold (valor absoluto) da M\u00E9trica
+view_alert_definition_condition_editor_option_metric_trait_change = Mudan\u00E7a de Carcter\u00EDstica
+view_alert_definition_condition_editor_option_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
+view_alert_definition_condition_editor_option_resource_configuration = Mudan\u00E7a na Configura\u00E7\u00E3o do Recurso
+view_alert_definition_condition_editor_resource_configuration_tooltip = Essa condi\u00E7\u00E3o \u00E9 disparada quando a configura\u00E7\u00E3o do recurso for alterada.
+view_alert_definition_for_group = Visualizar Defini\u00E7\u00E3o de Grupo
+view_alert_definition_for_type = Visualizar Template
+view_alert_definition_notification_cliScript_editor_anotherUser = Another User
+view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
+view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
+view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
+view_alert_definition_notification_cliScript_editor_repository = Repository
+view_alert_definition_notification_cliScript_editor_script = Script
+view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
+view_alert_definition_notification_cliScript_editor_selectRepoFirst = Select a repository first.
+view_alert_definition_notification_cliScript_editor_thisUser = Myself
+view_alert_definition_notification_cliScript_editor_uploadNewScript = Upload New Script
+view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
+view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
+view_alert_definition_notification_editor_delete_confirm = Tem certeza de que deseja excluir as notifica\u00E7\u00F5es selecionadas?
+view_alert_definition_notification_editor_field_configuration = Configura\u00E7\u00E3o
+view_alert_definition_notification_editor_field_configuration_loadFailed = Falha ao obter a configura\u00E7\u00E3o
+view_alert_definition_notification_editor_field_configuration_not_loaded = Desconhecido
+view_alert_definition_notification_editor_field_sender = Remetente
+view_alert_definition_notification_editor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel obter remetentes
+view_alert_definition_notification_editor_loadFailed_single = N\u00E3o \u00E9 poss\u00EDvel obter a configura\u00E7\u00E3o do remetente
+view_alert_definition_notification_editor_none_available = Remetentes n\u00E3o dispon\u00EDveis
+view_alert_definition_notification_editor_saveFailed = N\u00E3o foi poss\u00EDvel salvar a configura\u00E7\u00E3o
+view_alert_definition_notification_editor_sender = Remetente da Notifica\u00E7\u00E3o
+view_alert_definition_notification_editor_title_add = Adicionar Notifica\u00E7\u00E3o
+view_alert_definition_notification_editor_title_edit = Editar Notifica\u00E7\u00E3o
+view_alert_definition_notification_operation_editor_common_operation = Opera\u00E7\u00E3o
+view_alert_definition_notification_operation_editor_mode_relative = Recurso parente
+view_alert_definition_notification_operation_editor_mode_specific = Recurso Espec\u00EDfico
+view_alert_definition_notification_operation_editor_mode_this = Este Recurso
+view_alert_definition_notification_operation_editor_mode_title = Modo de Sele\u00E7\u00E3o do Recurso
+view_alert_definition_notification_operation_editor_mode_unknown = OP\u00C7\u00C3O INV\u00C1LIDA - BUG!
+view_alert_definition_notification_operation_editor_operations_loadFailed = Falha ao carregar a lista de opera\u00E7\u00F5es dispon\u00EDveis
+view_alert_definition_notification_operation_editor_operations_no_parameters = Esta opera\u00E7\u00E3o n\u00E3o recebe par\u00E2metros
+view_alert_definition_notification_operation_editor_relative_ancestor = Iniciar a busca a partir de
+view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel obter a ascend\u00EAncia do tipo
+view_alert_definition_notification_operation_editor_relative_ancestor_root = Tipo do Ancestral Raiz
+view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Selecione o topo da hierarquia para buscar a \u00E1rvore de descendentes para Filtro por Tipo
+view_alert_definition_notification_operation_editor_relative_descendant = Ent\u00E3o procure por
+view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = Um nome especifico para identificar unicamente um recurso quando existir mais de um do mesmo tipo. Isso \u00E9 opcional, se definido, sempre ser\u00E1 um recurso do tipo slecionda na hierarquia.
+view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = N\u00E3o \u00E9 poss\u00EDvel obter os tipos de descendentes
+view_alert_definition_notification_operation_editor_relative_descendant_tooltip = Tipo do recurso a ser procurado a baixo do tipo raiz definido na sele\u00E7\u00E3o 'Inicia a Pesquesa a partir de'.
+view_alert_definition_notification_operation_editor_specific_pick_button = Selecionar
+view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Favor selecionar um recurso
+view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Selecione um recurso que possua um ou mais opera\u00E7\u00F5es
+view_alert_definition_notification_operation_editor_specific_pick_text = Selecione um recurso...
+view_alert_definition_notification_operation_editor_specific_resource = Recurso
+view_alert_definition_notification_role_editor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel determinar os perfis atuais - iniciando vazio
+view_alert_definition_notification_role_editor_restoreFailed = N\u00E3o \u00E9 poss\u00EDvel usar os perfis atuais - iniciando vazio
+view_alert_definition_notification_role_editor_saveFailed = N\u00E3o foi poss\u00EDvel salvar os perfis selecionados
+view_alert_definition_notification_user_editor_loadFailed = N\u00E3o \u00E9 poss\u00EDvel determinar os usu\u00E1rios atuais - iniciando vazio
+view_alert_definition_notification_user_editor_restoreFailed = N\u00E3o foi poss\u00EDvel usar os usu\u00E1rios atuais - iniciando vazio
+view_alert_definition_notification_user_editor_saveFailed = N\u00E3o foi poss\u00EDvel salvar os usu\u00E1rios seleciondados
+view_alert_definition_recovery_editor_disable_when_fired = Desabilitar quando disparado
+view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indica se este alerta deve ser desabilitado ap\u00F3s ser disparado. Uma vez desabilitado, o alerta pode ser reativado manualmente ou um alerta de recupera\u00E7\u00E3o pode ser definido para reativ\u00E1-lo automaticamente. If this alert is a recovery alert itself, this setting cannot be turned on.
+view_alert_definition_recovery_editor_loadFailed = N\u00E3o foi poss\u00EDvel construir o menu de recupera\u00E7\u00E3o
+view_alert_definition_recovery_editor_none_available = Nenhum
+view_alert_definition_recovery_editor_recovery_alert = Alerta de Recupera\u00E7\u00E3o
+view_alert_definition_recovery_editor_recovery_alert_tooltip = O Alerta a ser recuperado (reativado) ap\u00F3s o disparo deste alerta. N\u00E3o selecione um alerta aqui caso n\u00E3o esteja definindo um alerta de recupera\u00E7\u00E3o.
+view_alert_definitions_create_failure = Falha na cria\u00E7\u00E3o da defini\u00E7\u00E3o do alerta
+view_alert_definitions_create_success = Defini\u00E7\u00E3o do alerta criada com sucesso
+view_alert_definitions_delete_confirm = Excluir defini\u00E7\u00F5es para o alerta selecionado?
+view_alert_definitions_delete_failure = Falha aos excluir as defini\u00E7\u00F5es do alerta selecionado
+view_alert_definitions_delete_success = Defini\u00E7\u00F5es do alerta {0} exclu\u00EDdas com sucesso
+view_alert_definitions_disable_confirm = Desabilitar as defini\u00E7\u00F5es para o alerta selecionado?
+view_alert_definitions_disable_failure = Falha ao desabilitar defini\u00E7\u00F5es para o alerta selecionado
+view_alert_definitions_disable_success = Defini\u00E7\u00F5es do alerta {0} desabilitadas com sucesso
+view_alert_definitions_enable_confirm = Habilitar a(s) defini\u00E7\u00E3o(\u00F5es) para o alerta selecionado?
+view_alert_definitions_enable_failure = Falha ao habilitar defini\u00E7\u00F5es para o alerta selecionado
+view_alert_definitions_enable_success = Defini\u00E7\u00F5es do alerta {0} habilitados com sucesso
+view_alert_definitions_loadFailed = Falha ao obter a defini\u00E7\u00E3o do alerta
+view_alert_definitions_loadFailed_single = Falha ao obter a defini\u00E7\u00E3o do alerta com ID {0}
+view_alert_definitions_table_title_group = Defini\u00E7\u00F5es de Alertas para Grupo
+view_alert_definitions_table_title_resource = Defini\u00E7\u00F5es de Alerta para Recurso
+view_alert_definitions_update_failure = Falha ao atualizar a defini\u00E7\u00E3o do alerta
+view_alert_definitions_update_success = Defini\u00E7\u00E3o do alerta atualizada com sucesso
+view_alert_details_breadcrumb = Detalhes
+view_alert_details_field_ack_at = Verificado em
+view_alert_details_field_ack_by = Verificado por
+view_alert_details_field_recovery_info = Informa\u00E7\u00E3o de Recupera\u00E7\u00E3o
+view_alert_details_loadFailed = Falha ao recuperar detalhes do alerta
+view_alerts_ack_confirm = Confirma o(s) alerta(s) selecionado(s)?
+view_alerts_ack_confirm_all = Confirma todos os alertas?
+view_alerts_ack_failure = Falha ao confirmar alertas com os seguintes IDs: {0}
+view_alerts_ack_failure_all = N\u00E3o foi poss\u00EDvel confirmar todos os alertas
+view_alerts_ack_success = Alertas {0} confirmados com sucesso
+view_alerts_delete_confirm = Excluir o(s) alerta(s) selecionado(s)?
+view_alerts_delete_confirm_all = Excluir todos os alertas?
+view_alerts_delete_failure = Falha ao excluir alertas com os seguintes IDs: {0}
+view_alerts_delete_failure_all = N\u00E3o foi poss\u00EDvel excluir os alertas
+view_alerts_delete_success = Alertas {0} exclu\u00EDdos com sucesso
+view_alerts_field_ack_status = Status
+view_alerts_field_ack_status_ack = Ack ({0})
+view_alerts_field_ack_status_ackHover = Acknowledged by {0} at {1}
+view_alerts_field_ack_status_empty = Ainda n\u00E3o verificado
+view_alerts_field_ack_status_filled = {0} verificado em {1}
+view_alerts_field_ack_status_noAck = No Ack
+view_alerts_field_ack_status_noAckHover = Not yet Acknowledged
+view_alerts_field_ack_subject = Assunto da Verifica\u00E7\u00E3o
+view_alerts_field_ack_time = Data de Verifica\u00E7\u00E3o
+view_alerts_field_condition_text = Condi\u00E7\u00E3o
+view_alerts_field_condition_text_many = M\u00FAltiplas condi\u00E7\u00F5es
+view_alerts_field_condition_text_none = Sem condi\u00E7\u00F5es
+view_alerts_field_condition_value = Valor da Condi\u00E7\u00E3o
+view_alerts_field_created_time = Data de Cria\u00E7\u00E3o
+view_alerts_field_enabled = Habilitado
+view_alerts_field_modified_time = Data de Altera\u00E7\u00E3o
+view_alerts_field_name = Nome
+view_alerts_field_parent = Pai
+view_alerts_field_priority = Prioridade
+view_alerts_field_protected = Protegido
+view_alerts_field_protected_tooltip = Se verdadeiro, esta defini\u00E7\u00E3o \u00E9 protegida de altera\u00E7\u00F5es feitas na defini\u00E7\u00E3o pai, ou seja, altera\u00E7\u00F5es realizadas no pai n\u00E3o sobrescrevem esta defini\u00E7\u00E3o.
+view_alerts_field_resource = Recurso
+view_alerts_loadFailed = Falha ao carregar dados dos alertas
+view_alerts_table_filter_priority = Filtro de Prioridade
+view_alerts_table_title_group = Hist\u00F3rico de Alertas do Grupo
+view_alerts_table_title_resource = Hist\u00F3rico de Alertas do Recurso
+view_autoDiscoveryQ_committed = Committed
+view_autoDiscoveryQ_confirmSelect = Also select the platform children?
+view_autoDiscoveryQ_deleted = Deleted
+view_autoDiscoveryQ_field_discoveryTime = Data e Hora da Descoberta
+view_autoDiscoveryQ_field_inventoryStatus = Status do Invet\u00E1rio
+view_autoDiscoveryQ_field_key = Chave do Recurso
+view_autoDiscoveryQ_field_name = Nome do Recurso
+view_autoDiscoveryQ_field_parentId = ID Pai
+view_autoDiscoveryQ_ignore = Ignorar
+view_autoDiscoveryQ_ignoreFailure = Falha ao ignorar recursos.
+view_autoDiscoveryQ_ignoreSuccessful = Os recursos selecionados foram ignorados com sucesso.
+view_autoDiscoveryQ_ignored = Ignorado
+view_autoDiscoveryQ_import = Importar
+view_autoDiscoveryQ_importFailure = Falha ao importar recursos
+view_autoDiscoveryQ_importSuccessful = Os recursos selecionados foram importados com sucesso.
+view_autoDiscoveryQ_loadFailure = Falha ao carregar a fila de descoberta do invent\u00E1rio
+view_autoDiscoveryQ_new = Novo
+view_autoDiscoveryQ_newAndIgnored = Novo e Ignorado
+view_autoDiscoveryQ_noItems = N\u00E3o h\u00E1 itens a serem mostrados
+view_autoDiscoveryQ_noperm = (Required manage inventory permissions missing. See Administrator to change)~
+view_autoDiscoveryQ_showStatus = Show
+view_autoDiscoveryQ_title = Fila de Autodescoberta
+view_autoDiscoveryQ_unignore = N\u00E3o ignorar
+view_autoDiscoveryQ_unignoreFailure = Falha ao reimportar os recursos
+view_autoDiscoveryQ_unignoreSuccessful = You have successfully unignored the selected resources.~
+view_autoDiscoveryQ_uninventoried = Uninventoried
+view_bundleVersion_loadFailure = Failed to load bundle version data~
+view_bundle_bundle = Bundle~
+view_bundle_bundleDeployment = Bundle Deployment~
+view_bundle_bundleDeployments = Bundle Deployments~
+view_bundle_bundleDestinations = Bundle Destinations~
+view_bundle_bundleFiles = Bundle Files~
+view_bundle_bundleType = Bundle Type~
+view_bundle_bundleVersion = Bundle Version~
+view_bundle_bundleVersions = Bundle Versions~
+view_bundle_bundles = Bundles~
+view_bundle_createWizard_bundleDistro = Bundle Distribution~
+view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database~
+view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]~
+view_bundle_createWizard_clickToUploadRecipe = Click to upload a recipe file~
+view_bundle_createWizard_createFailure = Failed to create the bundle~
+view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]~
+view_bundle_createWizard_enterRecipe = Please supply a valid recipe
+view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
+view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file~
+view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file~
+view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server~
+view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle~
+view_bundle_createWizard_noBundleTypesAvail = No bundle types are available~
+view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments~
+view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
+view_bundle_createWizard_recipeOption = Recipe~
+view_bundle_createWizard_title = Create Bundle~
+view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files~
+view_bundle_createWizard_uploadOption = Upload~
+view_bundle_createWizard_uploadStepName = Provide a Bundle Distribution~
+view_bundle_createWizard_urlOption = URL~
+view_bundle_createWizard_windowTitle = Bundle Creation Wizard~
+view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
+view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted.
+view_bundle_deploy = Deploy~
+view_bundle_deployDir = Deploy Directory~
+view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms~
+view_bundle_deployWizard_deploying = Deploying...~
+view_bundle_deployWizard_deploymentCreated = Created Deployment...~
+view_bundle_deployWizard_deploymentCreatedDetail = Created deployment [{0}] description [{1}]~
+view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
+view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!~
+view_bundle_deployWizard_deploymentScheduledDetail = Scheduled bundle deployment [{0}] destination group [{1}]~
+view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
+view_bundle_deployWizard_destinationCreatedDetail = Created destination [{0}] description [{1}]~
+view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
+view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel:
+view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)~
+view_bundle_deployWizard_error_11 = Failed to find defined deployments.~
+view_bundle_deployWizard_error_12 = Failed to find defined bundles.~
+view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel:
+view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!~
+view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}~
+view_bundle_deployWizard_error_5 = Failed to Create Deployment!~
+view_bundle_deployWizard_error_6 = Failed to create deployment: {0}~
+view_bundle_deployWizard_error_7 = Failed to get deployment name.~
+view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down~
+view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage:~
+view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.~
+view_bundle_deployWizard_getConfigStep = Set Deployment Configuration~
+view_bundle_deployWizard_getDestStep = New Destination~
+view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)~
+view_bundle_deployWizard_getDest_desc = Destination Description~
+view_bundle_deployWizard_getDest_name = Destination Name~
+view_bundle_deployWizard_getInfoStep = Provide Deployment Information~
+view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)~
+view_bundle_deployWizard_getInfo_deploymentDesc = Deployment Description~
+view_bundle_deployWizard_getInfo_deploymentName = Deployment Name~
+view_bundle_deployWizard_getOptionsStep = Deploy Options~
+view_bundle_deployWizard_getOptions_deployLater = Deploy Later~
+view_bundle_deployWizard_getOptions_deployNow = Deploy Now~
+view_bundle_deployWizard_getOptions_deployTime = Deployment Time~
+view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle~
+view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.~
+view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version~
+view_bundle_deployWizard_selectVersion_latest = Latest Version [{0}]~
+view_bundle_deployWizard_selectVersion_live = Live Version [{0}]~
+view_bundle_deployWizard_selectVersion_select = Select Version from List:~
+view_bundle_deployWizard_title = Bundle Deployment Wizard~
+view_bundle_deploy_action = Action~
+view_bundle_deploy_backButton = Back to Destination~
+view_bundle_deploy_clickForError = Click the icon for the error message
+view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
+view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
+view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
+view_bundle_deploy_deployedBy = Deployed By
+view_bundle_deploy_deploymentPlatforms = Deployment Platforms~
+view_bundle_deploy_installDetails = Install Details~
+view_bundle_deploy_loadBundleFailure = Failed to find bundle~
+view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments~
+view_bundle_deploy_loadFailure = Failed to load bundle deployment~
+view_bundle_deploy_name = Deployment Name~
+view_bundle_deploy_operatingSystem = Operating System~
+view_bundle_deploy_selectARow = Select a row to show installation details~
+view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags~
+view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags~
+view_bundle_deploy_time = Deployment Time~
+view_bundle_deployed = Deployed~
+view_bundle_deployments = Deployments~
+view_bundle_dest_backToBundle = Back to Bundle~
+view_bundle_dest_created = Created~
+view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
+view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
+view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
+view_bundle_dest_deployDir = Deploy Directory~
+view_bundle_dest_group = Group~
+view_bundle_dest_lastDeployedVersion = Last Deployed Version~
+view_bundle_dest_lastDeploymentDate = Last Deployment Date~
+view_bundle_dest_lastDeploymentStatus = Last Deployment Status~
+view_bundle_dest_loadFailure = Failed to load bundle destinations~
+view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information~
+view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
+view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
+view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
+view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
+view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags~
+view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags~
+view_bundle_destinations = Destinations~
+view_bundle_fileListView_fileSize = File Size~
+view_bundle_fileListView_loadFailure = Failed to load bundle file data~
+view_bundle_fileListView_md5 = MD5
+view_bundle_fileListView_sha256 = SHA256
+view_bundle_files = Files~
+view_bundle_latestVersion = Latest Version~
+view_bundle_list_backToAll = Back to All Bundles~
+view_bundle_list_deleteConfirm = Are you sure you want to delete this bundle?~
+view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]~
+view_bundle_list_deleteSuccessful = You successfully deleted the bundle named [{0}]~
+view_bundle_list_deletesFailure = Failed to delete the bundles
+view_bundle_list_deletesSuccessful = You successfully deleted the bundles
+view_bundle_list_destinationsCount = Destinations Count~
+view_bundle_list_error1 = Failed to load bundle to deploy [{0}]~
+view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]~
+view_bundle_list_error3 = Failed to load bundle~
+view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]~
+view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data~
+view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]~
+view_bundle_list_tagUpdateFailure = Failed to update bundle tags~
+view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags~
+view_bundle_list_versionsCount = Versions Count~
+view_bundle_purge = Purge
+view_bundle_recipe = Recipe~
+view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments~
+view_bundle_revert = Revert~
+view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...~
+view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert~
+view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment~
+view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation~
+view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]~
+view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
+view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]~
+view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
+view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment~
+view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)~
+view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name~
+view_bundle_revertWizard_getInfoStep_name = Provide Revert Information~
+view_bundle_revertWizard_getInfoStep_revertDeployDesc = Revert Deploy Description~
+view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\\n\\n[REVERT To]\\n{1}~
+view_bundle_revertWizard_getInfoStep_revertDeployName = Revert Deploy Name~
+view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms~
+view_bundle_revertWizard_revertStep_reverting = Reverting...~
+view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!~
+view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]~
+view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!~
+view_bundle_revertWizard_title = Bundle Revert~
+view_bundle_revertWizard_windowTitle = Bundle Revert Wizard~
+view_bundle_tree_loadFailure = Failed to load bundle data~
+view_bundle_version_backToBundle = Back to Bundle~
+view_bundle_version_bundleVersionTagUpdateFailure = Failed to update bundle version tags~
+view_bundle_version_bundleVersionTagUpdateSuccessful = You have successfully updated the bundle version tags~
+view_bundle_version_deleteConfirm = Are you sure you want to delete this bundle version?
+view_bundle_version_deleteFailure = Failed to delete the bundle version [{0}]
+view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
+view_bundle_version_loadFailure = Failed to load bundle version~
+view_bundle_versions = Versions~
+view_configCompare_comparingConfigs = Comparando Configura\u00E7\u00F5es
+view_configCompare_configCompare = Compara\u00E7\u00E3o de Configura\u00E7\u00F5es
+view_configEdit_addItem = Adicionar Item \u00E0 Lista
+view_configEdit_confirm_1 = Tem certeza de que deseja excluir as propriedades selecionadas?
+view_configEdit_confirm_2 = Tem certeza de que deseja excluir esta linha?
+view_configEdit_confirm_3 = Tem certeza de que deseja excluir [{0}] selecionado [{1}]?
+view_configEdit_editRow = Editar Linha de Configura\u00E7\u00E3o
+view_configEdit_enterPropName = Informe o nome da propriedade a ser adicionada.
+view_configEdit_error_1 = Este recurso n\u00E3o suporta Configura\u00E7\u00E3o.
+view_configEdit_error_2 = Este recurso n\u00E3o possui suporte \u00E0 propriedades de conex\u00E3o.
+view_configEdit_error_3 = N\u00E3o f\u00F3 poss\u00EDvel adicionar a propriedade com nome [{0}]. Nome de propriedade j\u00E1 utilizada neste conjunto.
+view_configEdit_files = Arquivos
+view_configEdit_hideAll = Ocultar todos
+view_configEdit_jumpToSection = Ir direto para a Sele\u00E7\u00E3o
+view_configEdit_msg_1 = Propriedade [{0}] adicionada ao conjunto.
+view_configEdit_msg_2 = Propriedades removidas do conjunto.
+view_configEdit_msg_3 = [{0} {1}] removido da lista.
+view_configEdit_msg_4 = Item adicionado \u00E0 lista.
+view_configEdit_properties = Propriedades
+view_configEdit_tooltip_1 = Remove os itens selecionados da lista.
+view_configEdit_tooltip_2 = Adiciona um item \u00E0 lista.
+view_configEdit_viewRow = View Row
+view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.~
+view_configurationDetails_configNotUpdatedDueToNoChange = Configuration was not updated, since the new configuration is equivalent to the current configuration.
+view_configurationDetails_error_updateFailure = Failed to update configuration.~
+view_configurationDetails_messageConcise = Configuration updated - current version is {0}.~
+view_configurationDetails_messageDetailed = Configuration updated to version {0} for Resource [{1}].
+view_configurationDetails_noPermission = You do not have permission to edit this Resource''s configuration.~
+view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.~
+view_configurationHistoryDetails_dialogTitle = Configuration Details~
+view_configurationHistoryDetails_error_loadFailure = Unable to load configuration history.~
+view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
+view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
+view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
+view_configurationHistoryList_itemNamePlural = configuration history items
+view_configurationHistoryList_rollback = Rollback
+view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
+view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
+view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
+view_configurationHistoryList_table_statusFailure = This configuration update failed
+view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
+view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
+view_configurationHistoryList_table_statusSuccess = This configuration update was successful
+view_configurationHistoryList_title = Configuration History~
+view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.~
+view_connectionSettingsDetails_error_updateFailure = Failed to update connection settings.~
+##view_connectionSettingsDetails_messageConcise_updateSuccess = Connection settings updated.~
+##view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settings updated for Resource [{0}].~
+view_connectionSettingsDetails_noPermission = You do not have permission to edit this Resource''s connection settings.~
+view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.~
+view_core_error_1 = Falha ao perquisar novos alertas~
+view_core_loggedInAs = Logado como {0}~
+view_core_loggedOut = Logged out~
+view_core_noRecentAlerts = There are no recent alerts to report
+view_core_recentAlerts = [{0}] alertas recentes~
+view_core_uncaught = Exce\u00E7\u00E3o n\u00E3o capturada~
+view_dashboardManager_deleteFail = Failed to delete dashboard.
+view_dashboardManager_deleted = Successfully deleted dashboard {0}~
+view_dashboardManager_error = Failed to save dashboard to server~
+view_dashboardManager_saved = Saved dashboard {0} to server~
+view_dashboardManager_success = Saved dashboard~
+view_dashboard_favorites_error1 = Failed to load favorite Resources.~
+view_dashboardsManager_error1 = Failed to add new dashboard~
+view_dashboardsManager_inventory_title = Inventory Summary~
+view_dashboardsManager_mashup_title = RHQ News~
+view_dashboardsManager_message_title = Welcome To RHQ~
+view_dashboardsManager_message_title_details = <h1>Welcome to RHQ</h1>\n<p>The RHQ project is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p>~
+view_dashboardsManager_tagcloud_title = Tag Cloud~
+view_dashboards_confirm1 = Are you sure you want to delete~
+view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh
+view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh
+view_dashboards_portlets_refresh_multiple_min = {0} minutes
+view_dashboards_portlets_refresh_none = No Refresh
+view_dashboards_portlets_refresh_one_min = 1 minute
+view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
+view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
+view_dashboards_title = Dashboard~
+view_dynagroup_children = DynaGroup Children~
+view_dynagroup_compatible = Compatible
+view_dynagroup_definitionAlreadyExists = A group definition already exists with this name~
+view_dynagroup_definitionCreated = You have successfully created a group definition named [{0}]~
+view_dynagroup_definitionLoadFailure = Failed to load group definitions~
+view_dynagroup_definitions = DynaGroup Definitions~
+view_dynagroup_deleteFailureSelection = Failed to delete the selected group definitions~
+view_dynagroup_deleteSuccessfulSelection = You have successfully deleted [{0}] group definitions~
+view_dynagroup_editing = Editing [{0}]~
+view_dynagroup_exprBuilder_addExpression = Add Expression
+view_dynagroup_exprBuilder_comparisonType = Comparison Type
+view_dynagroup_exprBuilder_comparisonType_contains = contains
+view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
+view_dynagroup_exprBuilder_comparisonType_equals = equals
+view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
+view_dynagroup_exprBuilder_comparisonType_tooltip = Comparison Type
+view_dynagroup_exprBuilder_definingPlugin = Defining Plugin
+view_dynagroup_exprBuilder_definingPlugin_tooltip = The plugin to search
+view_dynagroup_exprBuilder_expression = Expression
+view_dynagroup_exprBuilder_expressionType = Expression Type
+view_dynagroup_exprBuilder_expressionType_pluginConfig = Plugin Configuration
+view_dynagroup_exprBuilder_expressionType_resource = Resource
+view_dynagroup_exprBuilder_expressionType_resourceCategory = Resource Category
+view_dynagroup_exprBuilder_expressionType_resourceConfig = Resource Configuration
+view_dynagroup_exprBuilder_expressionType_resourceType = Resource Type
+view_dynagroup_exprBuilder_expressionType_tooltip = The type of property this expression switches on:<br/> <b>Resource</b>: A resource property such as its name or version<br/> <b>Resource Type</b>: Search for resources of a specific type<br/> <b>Resource Category</b>: Search for resources by category: platform, server, service<br/> <b>Trait</b>: Resources that have selected values for a monitored trait<br/> <b>Plugin Configuration</b>: Search by the plugin component configuration setting of the component<br/> <b>Resource Configuration</b>: Search by the configuration setting of the managed resource
+view_dynagroup_exprBuilder_expressionType_trait = Trait
+view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
+view_dynagroup_exprBuilder_groupBy = Group by
+view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
+view_dynagroup_exprBuilder_noPlugins = --No plugins--
+view_dynagroup_exprBuilder_noProperties = --No properties--
+view_dynagroup_exprBuilder_noResourceTypes = --No resource types--
+view_dynagroup_exprBuilder_pluginLoadFailure = Cannot get the list of plugins
+view_dynagroup_exprBuilder_propLoadFailure = Cannot get list of properties
+view_dynagroup_exprBuilder_propertyName = Property Name
+view_dynagroup_exprBuilder_propertyName_tooltip = The name of the property to query. This is defined by the expression type as well as the resource type.
+view_dynagroup_exprBuilder_resTypeLoadFailure = Cannot get list of resource types for plugin [{0}]
+view_dynagroup_exprBuilder_resource = Resource
+view_dynagroup_exprBuilder_resourceType = Resource Type
+view_dynagroup_exprBuilder_resourceType_tooltip = The type of resource
+view_dynagroup_exprBuilder_resource_child = Child
+view_dynagroup_exprBuilder_resource_grandparent = Grandparent
+view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
+view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
+view_dynagroup_exprBuilder_resource_parent = Parent
+view_dynagroup_exprBuilder_resource_resource = Resource
+view_dynagroup_exprBuilder_resource_tooltip = Choose the level of the resource you wish to select. For example, select "parent" will find resources whose parent resource matches the rest of the expression.
+view_dynagroup_exprBuilder_title = Expression Builder
+view_dynagroup_exprBuilder_unset = Unset
+view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the " = " operator because of how databases store and query data.
+view_dynagroup_exprBuilder_value_tooltip = The string value for the expression to query
+view_dynagroup_expression = Expression~
+view_dynagroup_expressionBuilderIconTooltip = Expression Builder...
+view_dynagroup_expressionSet = Expression Set~
+view_dynagroup_lastCalculationTime = Last Calculation Time~
+view_dynagroup_loadDefinitionFailure = Failed to load group definition [{0}]~
+view_dynagroup_loadDefinitionMissing = There is no group definition with the ID of [{0}]~
+view_dynagroup_mixed = Mixed
+view_dynagroup_newGroupDefinition = New Group Definition~
+view_dynagroup_nextCalculationTime = Next Calculation Time~
+view_dynagroup_permDenied = You do not have permission to view group definitions~
+view_dynagroup_permUnknown = Could not determine if you have the proper permissions - access is denied~
+view_dynagroup_recalcFailure = Failed to recalculated this group definition~
+view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions~
+view_dynagroup_recalcSuccessful = You have successfully recalculated this group definition~
+view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions~
+view_dynagroup_recalculate = Recalculate~
+view_dynagroup_recalculationInterval = Recalculation Interval~
+view_dynagroup_recursive = Recursive~
+view_dynagroup_saveAndRecalculate = Save & Recalculate~
+view_dynagroup_saveFailure = Failed to save the group definition named [{0}]~
+view_dynagroup_saveSuccessful = You have successfully saved the group definition named [{0}]~
+view_dynagroup_singleSaveFailure = An error occurred - there should have been one created, but instead there were [{0}] created~
+view_dynagroup_template_customExpression = Custom Expression...
+view_dynagroup_template_downedResources = All resources currently down
+view_dynagroup_template_jbossas4_clusters = JBossAS 4 - Clusters
+view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
+view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
+view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
+view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
+view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - Clusters
+view_dynagroup_template_platforms = Platform resources in inventory
+view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
+view_groupConfigEdit_member = Membro
+view_groupConfigEdit_noListProps = Lista de propriedades n\u00E3o suportada atualmente para configura\u00E7\u00F5es em grupo.
+view_groupConfigEdit_setAll = Atribuir todos os valores \u00E0:
+view_groupConfigEdit_tooltip_1 = Valores dos membros diferem - clique no \u00EDcone para edit\u00E1-los.
+view_groupConfigEdit_unset = Remover atribui\u00E7\u00E3o
+view_groupConfigEdit_valsDiff = valores dos membros diferem
+view_groupConfigEdit_valsDiffForProp = Valores dos membros para a Propriedade [{0}]
+view_groupCreateWizard_createFailure = Failed to create the resource group~
+view_groupCreateWizard_createStepName = Group Settings~
+view_groupCreateWizard_createStep_recursive = Recursive~
+view_groupCreateWizard_createSuccessful_concise = You have created a new resource group. [<a href = "{0}">View Group</a>]~
+view_groupCreateWizard_createSuccessful_full = You have created a new [{0}] resource group with the name [{1}] that contains [{2}] member resources~
+view_groupCreateWizard_membersStepName = Select Members~
+view_groupCreateWizard_title = Create Group~
+view_groupCreateWizard_windowTitle = Create Group~
+view_groupInventoryMembers_button_updateMembership = Update Membership...
+view_groupInventoryMembers_title_updateMembership = Update Membership
+view_group_detail_failLoad = Failed to load group for group with ID [{0}]
+view_group_detail_failLoadComp = Failed to load group composite for group with ID [{0}]
+view_group_detail_failRecursiveChange = Failed to update the recursive setting for group [{0}]
+view_group_detail_recursiveChange = You successfully changed the recursive setting for group [{0}]
+view_group_inventory_activity_no_recent_metrics = This group has no recent metrics
+view_group_meas_schedules_title = Group Metric Collection Schedules~
+view_group_membership_failFetch = Failed to fetch Resource Group
+view_group_membership_saveFailure = Failed to update membership of group [{0}]~
+view_group_membership_saveSuccessful = You have updated the membership of group [{0}]~
+view_group_operationScheduleDetails_failedToLoadMembers = Failed to load group member Resources.
+view_group_operationScheduleDetails_field_execute = Execute
+view_group_operationScheduleDetails_field_haltOnFailure = Halt on Failure?
+view_group_operationScheduleDetails_memberResource = Member Resource
+view_group_operationScheduleDetails_value_parallel = in parallel
+view_group_operationScheduleDetails_value_sequential = in the order specified below (drag and drop member Resources to change order)
+view_group_pluginConfig_edit_currentGroupProperties = Current Group Properties~
+view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]~
+view_group_pluginConfig_edit_noperm = You do not have permission to edit this group connection settings~
+view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]~
+view_group_pluginConfig_edit_saveInitiated_concise = The group connection setting updates have been initiated~
+view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]~
+view_group_pluginConfig_edit_saveTooltip = Update the connection settings of all group members~
+view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved~
+view_group_pluginConfig_members_fetchFailure = Failed to get plugin config update history for members of group [{0}]~
+view_group_pluginConfig_members_fetchFailureConn = Failed to retrieve member connection settings for [{0}]
+view_group_pluginConfig_members_fetchFailureConnInProgress = A group plugin configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
+view_group_pluginConfig_members_statusDetails = Status Details~
+view_group_pluginConfig_members_statusFailure = This configuration update failed for an unknown reason~
+view_group_pluginConfig_members_statusInprogress = This configuration update is still in progress~
+view_group_pluginConfig_members_statusNochange = No changes were made to this configuration~
+view_group_pluginConfig_members_statusSuccess = This configuration update was successful~
+view_group_pluginConfig_members_title = Group Connection Settings Member Histories~
+view_group_pluginConfig_table_clickStatusIcon = Click the status icon for full details~
+view_group_pluginConfig_table_deleteFailure = Failed to delete group plugin config history~
+view_group_pluginConfig_table_deleteSuccessful = You have deleted [{0}] history items~
+view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
+view_group_pluginConfig_table_msg1 = View Member History for status of each individual resource~
+view_group_pluginConfig_table_statusDetails = Status Details~
+view_group_pluginConfig_table_statusFailure = This group configuration update failed~
+view_group_pluginConfig_table_statusInprogress = This group configuration update is still in progress~
+view_group_pluginConfig_table_statusNochange = No changes were made to this group configuration~
+view_group_pluginConfig_table_statusSuccess = This group configuration update was successful~
+view_group_pluginConfig_table_title = Group Connection Settings History~
+view_group_pluginConfig_table_viewMemberHistory = View Member History~
+view_group_pluginConfig_table_viewSettings = View Settings~
+view_group_pluginConfig_view_groupProperties = Group Properties~
+view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings~
+view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]~
+view_group_resConfig_edit_loadFail = Failed to retrieve member Resource configurations for [{0}]
+view_group_resConfig_edit_noperm = You do not have permission to edit this group configuration~
+view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for [{0}] compatible group named [{1}]~
+view_group_resConfig_edit_saveInitiated_concise = The group configuration updates have been initiated~
+view_group_resConfig_edit_saveInitiated_full = The group configuration updates have been initiated for the [{0}] compatible group named [{1}]~
+view_group_resConfig_edit_saveTooltip = Update the configurations of all group members~
+view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved~
+view_group_resConfig_members_fetchFailure = Failed to get resource config update history for members of group [{0}]
+view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource configuration settings for [{0}]
+view_group_resConfig_members_fetchFailureConfigInProgress = A group resource configuration update is currently in progress. You must wait until the update is finished before you can view the group settings.
+view_group_resConfig_members_statusDetails = Status Details
+view_group_resConfig_members_statusFailure = This configuration update failed for an unknown reason
+view_group_resConfig_members_statusInprogress = This configuration update is still in progress
+view_group_resConfig_members_statusNochange = No changes were made to this configuration
+view_group_resConfig_members_statusSuccess = This configuration update was successful
+view_group_resConfig_members_title = Group Resource Configuration Member Histories
+view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
+view_group_resConfig_table_deleteFailure = Failed to delete group resource config history
+view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
+view_group_resConfig_table_failFetch = Failed to get group resource config history
+view_group_resConfig_table_msg1 = View Member History for status of each individual resource
+view_group_resConfig_table_statusDetails = Status Details
+view_group_resConfig_table_statusFailure = This group configuration update failed
+view_group_resConfig_table_statusInprogress = This group configuration update is still in progress
+view_group_resConfig_table_statusNochange = No changes were made to this group configuration
+view_group_resConfig_table_statusSuccess = This group configuration update was successful
+view_group_resConfig_table_title = Group Resource Configuration History
+view_group_resConfig_table_viewMemberHistory = View Member History
+view_group_resConfig_table_viewSettings = View Settings
+view_group_resConfig_view_groupProperties = Group Properties
+view_group_resConfig_view_noperm = You do not have permissions to see the resource configuration settings
+view_group_summary_compatible = Compatible
+view_group_summary_descUpdateFailure = Failed to change the description of the resource group with ID [{0}]~
+view_group_summary_descUpdateSuccessful = You have changed the description of this resource group~
+view_group_summary_dynamic = Dynamic~
+view_group_summary_dynamicNote = Dynamic group names and descriptions are managed, and therefore are not editable~
+view_group_summary_groupDefinition = Group Definition~
+view_group_summary_memberCount = Member Count~
+view_group_summary_memberType = Member Type~
+view_group_summary_mixed = Mixed~
+view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]~
+view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]~
+view_group_summary_recursive = Recursive~
+view_helpTop_description = This section provides access to documentation, tutorials, version, and other helpful information.
+view_help_section_product = Product
+view_help_section_product_about = About
+view_inventory_adq = Discovery Queue~
+view_inventory_allGroups = All Groups~
+view_inventory_allResources = All Resources~
+view_inventory_cannotGetGlobalPerms = Could not determine global permissions - assuming none.~
+view_inventory_collectionInterval = Collection Interval~
+view_inventory_downServers = Down Servers~
+view_inventory_dynagroupDefs = Dynagroup Definitions~
+view_inventory_eventDetails_loadFailed = An error occurred loading the event details~
+view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]~
+view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]~
+view_inventory_eventHistory_details = Details~
+view_inventory_eventHistory_detailsFilter = Details Filter~
+view_inventory_eventHistory_groupEventHistory = Group Event History~
+view_inventory_eventHistory_purgeFailed = Failed to purge events for [{0}]~
+view_inventory_eventHistory_purgeSuccessful = You have successfully purged [{0}] events for [{1}]~
+view_inventory_eventHistory_resourceEventHistory = Resource Event History~
+view_inventory_eventHistory_severity = Severity~
+view_inventory_eventHistory_severityFilter = Severity Filter~
+view_inventory_eventHistory_sourceFilter = Source Filter~
+view_inventory_eventHistory_sourceLocation = Source Location~
+view_inventory_eventHistory_timestamp = Timestamp~
+view_inventory_groups = Groups~
+view_inventory_groups_children = Children~
+view_inventory_groups_deleteFailed = Failed to delete the selected resource groups~
+view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups~
+view_inventory_groups_descendants = Descendants~
+view_inventory_groups_loadFailed = Failed to load group composite data~
+view_inventory_groups_resourceGroups = Resource Groups~
+view_inventory_mixed = mixed~
+view_inventory_platforms = Platforms~
+view_inventory_problemGroups = Problem Groups~
+view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible~
+view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?~
+view_inventory_resources_deleteFailed = Failed to delete the selected resources~
+view_inventory_resources_deleteSuccessful = You have successfully deleted the selected resources~
+view_inventory_resources_loadFailed = Failed to load resource composite data~
+view_inventory_resources_title = Member Resources~
+view_inventory_resources_title_children = Child Resources~
+view_inventory_resources_title_members = Member Resources~
+view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
+view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
+view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
+view_inventory_sectionHelp = From this section, newly discovered Resources, inventoried Resources, and Groups can be viewed and managed.~
+view_inventory_servers = Servers~
+view_inventory_services = Services~
+view_inventory_summary_agent_error1 = Failed to locate agent managing resource id~
+view_inventory_summary_agent_error2 = Failed to ping agent managing resource id~
+view_inventory_summary_agent_error3 = You do not have permission to view details for this Agent.
+view_inventory_summary_agent_fullEnpoint = Full Endpoint~
+view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!~
+view_inventory_summary_agent_last_title = Last Received Availability Report~
+view_inventory_summary_agent_status_title = Agent Communications Status~
+view_inventory_summary_agent_title = Agent Managing this Resource~
+view_inventory_unavailableServers = Unavailable Servers
+view_leftNav_unknownPage = P\u00E1gina desconhecida [{0}] para a se\u00E7\u00E3o [{1}] - URL inv\u00E1lida.
+view_login_invalidEmail = Endere\u00E7o de e-mail inv\u00E1lido
+view_login_login = Entrar
+view_login_logout = Sair
+view_login_noBackend = Fonte de Dados indispon\u00EDvel.
+view_login_noLdap = Note: Optional retrieval of ldap details unsuccessful. Manual entry is required.~
+view_login_noUser = Usu\u00E1rio ou senha inv\u00E1lidos.
+view_login_prompt = Favor efetuar Login
+view_login_registerLater = (Sair - Concluir registro mais tarde.)
+view_login_registerLdapSuccess = Novo usu\u00E1rios do LDAP registrado com sucesso.
+view_login_registerUser = Registrar Usu\u00E1rio
+view_login_welcome = Bem Vindo
+view_login_welcomeMsg = Seja Bem Vindo ao JBoss ON! <br/><br/> Informe ou altere os seguintes campos para completar o processo de registro.<br/> Clique em "OK" para acessar o sistema.<br/><br/>
+view_measureRange_day = 1 Dia
+view_measureRange_days = {0} Dias
+view_measureRange_hour = 1 Hora
+view_measureRange_hours = {0} Horas
+view_measureRange_last = \u00DAltimo
+view_measureRange_minutes = {0} Minutos
+view_measureRange_range = Faixa
+view_measureRange_simple = Simples...
+view_measureRange_start = Time Range - Start
+view_measureTable_chartMetricValues = Chart Selected Metrics
+view_measureTable_getLive = Get Live Value
+view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
+view_measureTable_live_title = Live Data
+view_measure_nan = --dados indispon\u00EDveis--
+view_measurementOob_title = M\u00E9tricas Suspeitas~
+view_menuBar_help = Ajuda~
+view_menuBar_logout = Sair
+view_messageCenter_button_messages = Mensagens~
+view_messageCenter_clearAllMessages = Clear All Messages
+view_messageCenter_lastNMessages = Last {0} Messages
+view_messageCenter_maxMessages = Max Messages
+view_messageCenter_messageBarShowDetails = Show Details
+view_messageCenter_messageDetail = Detalhe~
+view_messageCenter_messageSeverity = Severidade~
+view_messageCenter_messageTime = Tempo~
+view_messageCenter_messageTitle = Centro de Mensagens~
+view_messageCenter_noRecentMessages = N\u00E3o existem Mensagens Recentes~
+view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
+view_metric_traits = Traits~
+view_metric_viewTraitHistory = Value History for Trait [{0}]~
+view_operationCreateWizard_button_execute = Execute~
+view_operationCreateWizard_button_executeImmediately = Execute Immediately~
+view_operationCreateWizard_error_scheduleOperationFailure = Failed to schedule operation execution.~
+view_operationCreateWizard_header = Execute {0} on {1}~
+view_operationCreateWizard_message_scheduleOperationSuccess = Schedule operation [{0}] on Resource [{1}] with cron string [{2}].~
+view_operationCreateWizard_parametersStep_name = Operation Parameters~
+view_operationCreateWizard_parametersStep_noParameters = This operation does not take any parameters.~
+view_operationCreateWizard_schedulingStep_label_daily = Daily~
+view_operationCreateWizard_schedulingStep_label_dailyAt = Daily At~
+view_operationCreateWizard_schedulingStep_label_date = Date~
+view_operationCreateWizard_schedulingStep_label_dayOfMonth = Day of Month~
+view_operationCreateWizard_schedulingStep_label_dayOfWeek = Day of Week~
+view_operationCreateWizard_schedulingStep_label_endDate = End Date~
+view_operationCreateWizard_schedulingStep_label_everyNMinutes = Every n Minutes~
+view_operationCreateWizard_schedulingStep_label_hourly = Hourly~
+view_operationCreateWizard_schedulingStep_label_hourlyAt = Hourly At~
+view_operationCreateWizard_schedulingStep_label_minuteInterval = Minute Interval~
+view_operationCreateWizard_schedulingStep_label_minuteOfHour = Minute of Hour~
+view_operationCreateWizard_schedulingStep_label_monthly = Monthly~
+view_operationCreateWizard_schedulingStep_label_monthlyOn = Monthly On~
+view_operationCreateWizard_schedulingStep_label_nMinutes = n Minutes~
+view_operationCreateWizard_schedulingStep_label_onceAt = Once At~
+view_operationCreateWizard_schedulingStep_label_recurrence = Recurrence~
+view_operationCreateWizard_schedulingStep_label_recurrenceEnd = Recurrence End~
+view_operationCreateWizard_schedulingStep_label_runAt = Run At~
+view_operationCreateWizard_schedulingStep_label_schedule = Schedule~
+view_operationCreateWizard_schedulingStep_label_start = Start~
+view_operationCreateWizard_schedulingStep_label_startDate = Start Date~
+view_operationCreateWizard_schedulingStep_label_time = Time~
+view_operationCreateWizard_schedulingStep_label_timeOfDay = Time of Day~
+view_operationCreateWizard_schedulingStep_label_timePeriod = Time Period~
+view_operationCreateWizard_schedulingStep_label_weekly = Weekly~
+view_operationCreateWizard_schedulingStep_label_weeklyOn = Weekly On~
+view_operationCreateWizard_schedulingStep_label_willExecuteImmediately = Will execute immediately~
+view_operationCreateWizard_schedulingStep_name = Schedule~
+view_operationCreateWizard_title = Operation Wizard~
+view_operationHistoryDetails_dateCompleted = Date Completed
+view_operationHistoryDetails_dateSubmitted = Date Submitted
+view_operationHistoryDetails_error_fetchFailure = Failure loading operation history.~
+view_operationHistoryDetails_noResults = This operation does not return any results.
+view_operationHistoryDetails_operation = Operation
+view_operationHistoryDetails_parameters = Parameters
+view_operationHistoryDetails_requestor = Requestor
+view_operationHistoryDetails_results = Results
+view_operationHistoryDetails_status = Status
+view_operationHistoryList_button_forceDelete = Force Delete
+view_operationHistoryList_button_runOperation = Run Operation~
+view_operationHistoryList_notYetStarted = not yet started
+view_operationHistoryList_title = Operation History~
+view_operationScheduleDetails_enterParametersBelow = Enter parameters below...
+view_operationScheduleDetails_fieldDefault_description = Select an operation to see its description.
+view_operationScheduleDetails_fieldDefault_parameters = Select an operation to see its parameters.
+view_operationScheduleDetails_fieldHelp_description = an optional description of this scheduled operation (e.g. nightly maintenance app server restart)
+view_operationScheduleDetails_fieldHelp_timeout = a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated
+view_operationScheduleDetails_field_description = Description
+view_operationScheduleDetails_field_parameters = Parameters
+view_operationScheduleDetails_field_timeout = Timeout
+view_operationScheduleDetails_noParameters = This operation does not take any parameters.
+view_operationScheduleDetails_operationSchedule = Operation Schedule
+view_portlet_autodiscovery_config_platform_selection = Number of platforms to display~
+view_portlet_autodiscovery_help_msg = This portlet offers the ability to import newly discovered resources into the inventory for monitoring and management or to ignore them from further action.~
+view_portlet_autodiscovery_setting_platforms = discovered platforms
+view_portlet_autodiscovery_title = Discovery Queue~
+view_portlet_configure_definitionDesc = The configuration settings for the portlet.
+view_portlet_configure_definitionTitle = Portlet Configuration
+view_portlet_configure_needed = Click the Settings button to configure this portlet.
+view_portlet_configure_notNeeded = Configuration is not necessary for this portlet.
+view_portlet_defaultName_autodiscovery = Discovery Queue
+view_portlet_defaultName_favoriteResources = Favorite Resources
+view_portlet_defaultName_groupMetric = Resource Group Metric Graph
+view_portlet_defaultName_group_alerts = Group: Alerts
+view_portlet_defaultName_group_bundles = Group: Bundle Deployments
+view_portlet_defaultName_group_config_updates = Group: Configuration Updates
+view_portlet_defaultName_group_events = Group: Event Counts
+view_portlet_defaultName_group_metrics = Group: Metrics
+view_portlet_defaultName_group_oobs = Group: OOB Conditions
+view_portlet_defaultName_group_operations = Group: Operations
+view_portlet_defaultName_group_pkg_hisory = Group: Package History
+view_portlet_defaultName_inventorySummary = Inventory Summary
+view_portlet_defaultName_mashup = Mashup
+view_portlet_defaultName_message = Message
+view_portlet_defaultName_operations = Recent Operations
+view_portlet_defaultName_platformSummary = Platform Utilization
+view_portlet_defaultName_problemResources = Alerted or Unavailable Resources
+view_portlet_defaultName_recentAlerts = Recent Alerts
+view_portlet_defaultName_recentlyAddedResources = Recently Added Resources
+view_portlet_defaultName_resourceMetric = Resource Metric Graph
+view_portlet_defaultName_resource_alerts = Resource: Alerts
+view_portlet_defaultName_resource_bundles = Resource: Bundle Deployments
+view_portlet_defaultName_resource_config_updates = Resource: Configuration Updates
+view_portlet_defaultName_resource_events = Resource: Event Counts
+view_portlet_defaultName_resource_metrics = Resource: Measurements
+view_portlet_defaultName_resource_oobs = Resource: OOB Metrics
+view_portlet_defaultName_resource_operations = Resource: Operations
+view_portlet_defaultName_resource_pkg_hisory = Resource: Package History
+view_portlet_defaultName_tagCloud = Tag Count
+view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
+view_portlet_favoriteResources_msg = This portlet displays your favorite resources~
+view_portlet_favoriteResources_title = Favorite Resources~
+view_portlet_generic_help = No help available for this portlet~
+view_portlet_generic_unconfigured = No settings available for this portlet~
+view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph~
+view_portlet_graph_configure_resource_graph = The resource to graph~
+view_portlet_graph_configure_title = Graph Config~
+view_portlet_graph_configure_title_desc = Configuration of the graph portlet~
+view_portlet_graph_help_msg = This Portlet supports the graphing of a resource metric.~
+view_portlet_graph_help_title = Graph Portlet~
+view_portlet_graph_help_unconfigured = This graph is unconfigured, click the settings button to configure.~
+view_portlet_graph_title = Resource Graph~
+view_portlet_help_autodiscovery = This portlet allows import or ignore of newly discovered resources. Imported resources are added to inventory for monitoring and management. Ignored resources are not imported and are hidden from view unless explicitly unignored.
+view_portlet_help_bundle_deps = This portlet shows relevant bundle deployments based on display criteria configured.
+view_portlet_help_config_updates = This portlet displays recent configuration changes consistent with configuration settings.
+view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
+view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
+view_portlet_help_graph = This portlet displays the resource metric graph.
+view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
+view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
+view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
+view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
+view_portlet_help_none = There is no help available for this portlet.
+view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
+view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
+view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
+view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
+view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
+view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
+view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
+view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
+view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
+view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
+view_portlet_inventory_error1 = Failed to retrieve inventory summary~
+view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
+view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
+view_portlet_mashup_config_title = MashupPorlet Configuration~
+view_portlet_mashup_config_title_desc = The configuration settings for the mashup portlet.~
+view_portlet_mashup_help = This portlet can include a web page via an HTTP request into an iframe on the dashboard.~
+view_portlet_mashup_unconfigured = Page address not yet configured, click the settings button to setup this portlet.~
+view_portlet_message_config_title = MessagePortlet Configuration~
+view_portlet_message_config_title_desc = The configuration settings for the message portlet.~
+view_portlet_message_help = This portlet can display an HTML message on the dashboard.~
+view_portlet_message_title = Message~
+view_portlet_message_unconfigured = Message not yet configured, click the settings button to setup this portlet.~
+view_portlet_operations_config_completed = completed operations~
+view_portlet_operations_config_completed_enable = Whether to enable completed operations results grouping for dashboard.~
+view_portlet_operations_config_completed_maximum = Maximum number of Completed operations to display.~
+view_portlet_operations_config_scheduled_enable = Whether to enable scheduled operations results grouping for dashboard.~
+view_portlet_operations_config_scheduled_maximum = Maximum number of Scheduled operations to display.~
+view_portlet_operations_config_show_last = show Last~
+view_portlet_operations_config_show_next = show Next~
+view_portlet_operations_config_title = OperationsPortlet Configuration~
+view_portlet_operations_config_title_desc = The configuration settings for the Operations portlet.~
+view_portlet_operations_disabled = (Results currently disabled. Change settings to enable results.~
+view_portlet_operations_help_msg = This portlet displays both operations that have occurred and are scheduled to occur.~
+view_portlet_platform_help_msg = This portlet displays information about platforms in inventory.~
+view_portlet_platform_platform_error_1 = Failed to load platform metrics~
+view_portlet_platform_title = Platforms Summary~
+view_portlet_platform_type_error_1 = Could not load type data~
+view_portlet_problemResources_config_display_maximum = Maximum number of Problem resources to display.
+view_portlet_problemResources_config_display_range = Show problem resources going back this many hours.
+view_portlet_problemResources_config_display_range2 = From {0} to {1}
+view_portlet_problemResources_maxDisplaySetting = maximum resources.
+view_portlet_problem_resources_config_display_maximum = Maximum number of Problem resources to display.~
+view_portlet_problem_resources_config_display_range = Show problem resources going back this many hours.~
+view_portlet_problem_resources_config_display_range2 = From {0} to {1}~
+view_portlet_problem_resources_config_problem_label = problem resources on dashboard.~
+view_portlet_problem_resources_config_title = ProblemResourcesPortlet Configuration~
+view_portlet_problem_resources_config_title_desc = The configuration settings for the Problem resources portlet.~
+view_portlet_problem_resources_help = This portlet displays resources that have reported alerts or Down availability.~
+view_portlet_problem_resources_title = Has Alerts or Currently Unavailable~
+view_portlet_recentAlerts_config_members = Select Members~
+view_portlet_recentAlerts_config_priority_label = priority Alerts,~
+view_portlet_recentAlerts_config_when = within the past~
+view_portlet_recentAlerts_fail_msg = Failed to load resources assigned for alert filtering.
+view_portlet_recentAlerts_help_msg = Displays recent alerts fired on resources visible to the current user login.~
+view_portlet_recentAlerts_title = Recent Alerts~
+view_portlet_recentlyAdded_approved_platforms = recently approved platforms on dashboard.~
+view_portlet_recentlyAdded_error1 = Failed to load recently added resources~
+view_portlet_recentlyAdded_help_msg = This portlet displays resources that have recently been imported into the inventory.~
+view_portlet_recentlyAdded_setting_addedPlatforms = recently added platforms
+view_portlet_recentlyAdded_title = Recently Added Portlet~
+view_portlet_results_empty = No results found using specified criteria.
+view_portlet_tagCloud_help = portlet displays the relative tag counts in the system visible to the current user.~
+view_portlet_tagCloud_title = TagCloud~
+view_remoteAgentInstall_agentStatus = Status do Agente
+view_remoteAgentInstall_agentStatusDefault = -Pressione o Bot\u00E3o Atualizar Status-
+view_remoteAgentInstall_buttonFindAgent = Procurar Agente
+view_remoteAgentInstall_connInfo = Informa\u00E7\u00E3o de Conex\u00E3o
+view_remoteAgentInstall_error_1 = Ocorreu um erro ao tentar localizar o caminho de instala\u00E7\u00E3o do agente
+view_remoteAgentInstall_error_2 = N\u00E3o foi poss\u00EDvel encontrar uma instala\u00E7\u00E3o do agente nos locais comuns
+view_remoteAgentInstall_error_3 = N\u00E3o foi poss\u00EDvel encontar a instala\u00E7\u00E3o do agente em [{0}]
+view_remoteAgentInstall_error_4 = Falha ao instalar o agente
+view_remoteAgentInstall_error_5 = Falha a iniciar o agente
+view_remoteAgentInstall_error_6 = Falha ao parar o agente
+view_remoteAgentInstall_installAgent = Instalar Agente
+view_remoteAgentInstall_installInfo = Informa\u00E7\u00E3o sobre a instala\u00E7\u00E3o do Agente
+view_remoteAgentInstall_installPath = Caminho de Instala\u00E7\u00E3o do Agente
+view_remoteAgentInstall_owner = Propriet\u00E1rio
+view_remoteAgentInstall_promptHost = O host onde o agente est\u00E1 ou ser\u00E1 instalado
+view_remoteAgentInstall_promptInstallPath = Onde o agente est\u00E1 ou ser\u00E1 instalado. Caso n\u00E3o tenha certeza onde o agente est\u00E1 instalado, informe um diret\u00F3rio pai e clique em ''Procurar Agente'' para encontrar o agente. Caso informe um diret\u00F3rio vazio, a busca pelo agente ser\u00E1 realizada em locais de instala\u00E7\u00E3o comuns.
+view_remoteAgentInstall_promptPassword = Credenciais usadas para autentica\u00E7\u00E3o do usu\u00E1rio no host via SSH
+view_remoteAgentInstall_promptPort = Porta onde o servidor SSH escuta. Se n\u00E3o especificada, o padr\u00E3o \u00E9 22
+view_remoteAgentInstall_promptUser = Nome do usu\u00E1rio informado nas credenciais passadas ao host via SSH
+view_remoteAgentInstall_result = Resultado
+view_remoteAgentInstall_resultCode = ResultCode
+view_remoteAgentInstall_startAgent = Iniciar Agente
+view_remoteAgentInstall_startAgentResults = resultado da inicializa\u00E7\u00E3o do Agente: [{0}]
+view_remoteAgentInstall_step = Step
+view_remoteAgentInstall_stopAgent = Parar Agente
+view_remoteAgentInstall_stopAgentResults = resultado do encerramento do Agente: [{0}]
+view_remoteAgentInstall_success = Instala\u00E7\u00E3o do Agente finalizada
+view_remoteAgentInstall_updateStatus = Status da Atualiza\u00E7\u00E3o
+view_reportsTop_description = This section provides access to global reports.~
+view_reportsTop_title = Relat\u00F3rios
+view_reports_alertDefinitions = Defini\u00E7\u00E3o de Alertas~
+view_reports_alertDefinitions_parentHover = Click to go to the parent alert definition
+view_reports_alertDefinitions_resTypeLoadError = Cannot get the template resource type - unable to view the alert template.
+view_reports_inventorySummary_failFetch = Failed to get inventory summary
+view_reports_platforms = Utiliza\u00E7\u00E3o de Mem\u00F3ria e CPU~
+view_reports_subsystems = Subsistemas~
+view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.~
+view_resourceResourceGroupList_error_updateFailure = Failed to update assigned Resource groups.~
+view_resourceResourceGroupList_message_updateSuccess = Group membership updated for [{0}].
+view_resource_inventory_activity_changed_by = Changed by
+view_resource_inventory_activity_criteria_no_recent_events = No event counts based off display criteria.
+view_resource_inventory_activity_no_recent_alerts = No recent alerts
+view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
+view_resource_inventory_activity_no_recent_config_history = No configuration change history
+view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
+view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
+view_resource_inventory_activity_no_recent_oob = No OOB conditions found
+view_resource_inventory_activity_no_recent_operations = No recent operation history
+view_resource_inventory_activity_no_recent_pkg_history = No recent package history
+view_resource_inventory_childhistory_createdChild = Created Child
+view_resource_inventory_childhistory_deletedChild = Deleted Child
+view_resource_inventory_childhistory_filterTitle = Past N Days
+view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
+view_resource_inventory_childhistory_status_invalidConfig = Invalid Configuration
+view_resource_monitor_availability_loadFailed = Failed to load availability history~
+view_resource_monitor_calltime_average = Average~
+view_resource_monitor_calltime_count = Count~
+view_resource_monitor_calltime_destination = Call Destination~
+view_resource_monitor_calltime_editFailed = Call time data can not be edited~
+view_resource_monitor_calltime_loadFailed = Could not load call time data~
+view_resource_monitor_calltime_lookupFailed = Could not load resource for call time~
+view_resource_monitor_calltime_maximum = Maximum~
+view_resource_monitor_calltime_minimum = Minimum~
+view_resource_monitor_calltime_title = Call Time Data~
+view_resource_monitor_calltime_total = Total~
+view_resource_monitor_detailed_graph_label = Detailed Graph~
+view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart~
+view_resource_monitor_graph_live_tooltip = Click for a live graph of current values~
+view_resource_monitor_graphs_loadFailed = Failed to load graph data~
+view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph~
+view_resource_monitor_graphs_noneAvailable = No graphs available~
+view_resource_monitor_schedules_title = Resource Metric Collection Schedules~
+view_resource_monitor_table_alerts = Alerts
+view_resource_monitor_table_avg = Average
+view_resource_monitor_table_last = Last
+view_resource_monitor_table_max = Maximum
+view_resource_monitor_table_min = Minimum
+view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details~
+view_resource_title_tagUpdateFailed = Failed to update resource tags~
+view_searchBar_defaultPattern = definir nome para o padr\u00E3o
+view_searchBar_error_selectSavedSearch = ''Erro ao selecionar a pesquisa''
+view_searchBar_query = Pesquisa
+view_searchBar_resourceGroups = Grupos de Recursos
+view_searchBar_resources = Recursos
+view_searchBar_welcomeMessage = procurar por {0}s
+view_searchGUI_loginStatus = Imposs\u00EDvel determinar o status do login, verifique o status do servidor~
+view_selector_assigned = Associado {0}
+view_selector_available = Dispon\u00EDvel {0}
+view_subTab_error_disabled = N\u00E3o \u00E9 poss\u00EDvel selecionar uma subTab desabilidada [{0}].
+view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
+view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].~
+view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].~
+view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].~
+view_summaryOverviewForm_error_traitsLoadFailure = Failed to load traits for {0}.~
+view_summaryOverviewForm_field_description = Description~
+view_summaryOverviewForm_field_location = Location~
+view_summaryOverviewForm_field_name = Name~
+view_summaryOverviewForm_field_parent = Parent~
+view_summaryOverviewForm_field_type = Type~
+view_summaryOverviewForm_field_version = Version~
+view_summaryOverviewForm_header_summary = Summary~
+view_summaryOverviewForm_label_plugin = Plugin:
+view_summaryOverviewForm_label_type = Type:
+view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].~
+view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].~
+view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].~
+view_summaryOverview_header_detectedErrors = Detected Errors~
+view_summaryOverview_title_errorDetailsWindow = Error Details~
+view_summaryOverview_tooltip_detectedErrors = Click on the rows to see the error details.~
+view_tableSection_backButton = Voltar \u00E0 Lista
+view_tableSection_error_badId = Can not show detail for [{0}]. Illegal 'id': [{1}]. Please report this bug~
+view_tableSection_error_noId = Table [{0}] record is missing 'id' attribute - please report this bug.~
+view_table_drawFail = Failed to draw Table [{0}].
+view_table_matchingRows = Matching Rows: {0} (selected: {1})
+view_table_totalRows = Total de Linhas: {0} (selecionada: {1})
+view_tabs_common_activity = Activity
+view_tabs_common_agent = Agent
+view_tabs_common_alerts = Alerts~
+view_tabs_common_availability = Availability~
+view_tabs_common_calltime = Calltime~
+view_tabs_common_child_history = Child History~
+view_tabs_common_child_resources = Child Resources~
+view_tabs_common_configuration = Configuration~
+view_tabs_common_connectionSettings = Connection Settings~
+view_tabs_common_connectionSettingsHistory = Connection Settings History~
+view_tabs_common_content = Content~
+view_tabs_common_current = Current~
+view_tabs_common_dashboard = Dashboard~
+view_tabs_common_definitions = Definitions~
+view_tabs_common_deployed = Deployed~
+view_tabs_common_events = Events~
+view_tabs_common_graphs = Graphs~
+view_tabs_common_group_members = Group Members
+view_tabs_common_group_membership = Group Membership~
+view_tabs_common_groups = Groups~
+view_tabs_common_history = History~
+view_tabs_common_inventory = Inventory~
+view_tabs_common_members = Members~
+view_tabs_common_monitoring = Monitoring~
+view_tabs_common_new = New~
+view_tabs_common_operations = Operations~
+view_tabs_common_overview = Overview~
+view_tabs_common_schedule = Schedule
+view_tabs_common_scheduled = Scheduled~
+view_tabs_common_schedules = Schedules~
+view_tabs_common_subscriptions = Subscriptions~
+view_tabs_common_summary = Summary~
+view_tabs_common_tables = Tables~
+view_tabs_common_timeline = Timeline~
+view_tabs_common_traits = Traits~
+view_tabs_invalidSubTab = Invalid subtab: {0}
+view_tabs_invalidTab = Invalid tab: {0}
+view_tagCloud_deleteTag = Delete Tag
+view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
+view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
+view_tagCloud_error_fetchFailure = Falha ao carregar etiquetas (tags).~
+view_tagCloud_error_tagUsedCount = Etiqueta (tag) usada {0} vezes.~
+view_tagCloud_title = Nuvem de Tags~
+view_taggedResources_title = Recursos Etiquetados~
+view_tags_error_1 = Failed to load Tags~
+view_tags_tags = Tags~
+view_tags_title = Tags:~
+view_tags_tooltip_1 = Click to remove this Tag~
+view_tags_tooltip_2 = Click to edit Tags~
+view_tags_tooltip_3 = Enter a Tag in the format: (namespace:)(semantic = )tagname (e.g. it:env = QA, or owner = John)
+view_testTop_description = Esta se\u00E7\u00E3o cont\u00E9m p\u00E1ginas para realiza\u00E7\u00E3o de testes em v\u00E1rios componentes UI.~
+view_testTop_title = Teste~
+view_titleBar_common_addedFav = You have added [{0}] as a favorite~
+view_titleBar_common_addedFavFailure = Failed to add [{0}] as a favorite~
+view_titleBar_common_clickToAddFav = Click to add this as a favorite~
+view_titleBar_common_clickToRemoveFav = Click to remove this as a favorite~
+view_titleBar_common_loadTagsFailure = Failed to load the tags for [{0}]~
+view_titleBar_common_removedFav = You have removed [{0}] as one of your favorites~
+view_titleBar_common_removedFavFailure = Failed to remove [{0}] as one of your favorites~
+view_titleBar_common_updateTagsFailure = Failed to update the tags for [{0}]~
+view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have been updated~
+view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
+view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
+view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
+view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]~
+view_tree_common_contextMenu_chart = Chart~
+view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration~
+view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource Configuration~
+view_tree_common_contextMenu_groupGraph = Group Metric Graph
+view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
+view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboards
+view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
+view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
+view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children~
+view_tree_common_contextMenu_measurements = Measurements~
+view_tree_common_contextMenu_operations = Operations~
+view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations~
+view_tree_common_contextMenu_pluginConfiguration = Plugin Configuration~
+view_tree_common_contextMenu_resourceConfiguration = Resource Configuration~
+view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
+view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard~
+view_tree_common_contextMenu_saveChartToDashboardSuccessful = You have saved dashboard [{0}]~
+view_tree_common_contextMenu_type_name_label = Type: {0}
+view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
+view_tree_common_loadFailed_children = Failed to load children for node~
+view_tree_common_loadFailed_create = Failed to create view for this node~
+view_tree_common_loadFailed_descendants = Failed to load descendants for tree~
+view_tree_common_loadFailed_generic = Failed to load data for tree~
+view_tree_common_loadFailed_group = Failed to load group with id [{0}]
+view_tree_common_loadFailed_groupTree = Failed to load group tree
+view_tree_common_loadFailed_node = Failed to load data for this node~
+view_tree_common_loadFailed_root = Failed to load root for tree~
+view_tree_common_loadFailed_selection = Failed to select this node~
+view_tree_common_loadFailed_update = Failed to update view for this node~
+view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
+view_type_parentId = Parent ID~
+view_type_resourceTypes = Resource Types~
+view_type_typeTreeLoadFailure = Failed to load resource type tree data~
+view_upload_alreadyUploaded = File has already been uploaded~
+view_upload_bundleDistFile = Distribution File~
+view_upload_error_bundleDistFile = Error uploading Bundle Distribution File~
+view_upload_error_file = Error uploading file~
+view_upload_error_fileName = Error uploading file [{0}]~
+view_upload_error_fileName_2 = Error uploading file [{0}], check for invalid file path.~
+view_upload_error_packageVersionFile = Error uploading Package Version File~
+view_upload_error_results = Error uploading file, unexpected results: [{0}]~
+view_upload_inProgress = Can not submit, upload is currently in progress~
+view_upload_prompt_1 = [{0}] File to Upload~
+view_upload_prompt_2 = File to Upload~
+view_upload_success = File successfully uploaded~
+view_upload_tooltip_1 = Select a file to upload, then click Upload or Next~
+view_upload_tooltip_1a = Select a file to upload, then click Upload or Next
+view_upload_tooltip_1b = Select a file to upload, then click Next
+view_upload_tooltip_2 = File upload had previously failed~
+view_upload_upload = Upload~
+view_upload_uploadFile = UploadFile~
+widget_colorPicker_tooltip = Clique para selecionar uma nova cor
+widget_durationItem_inputUnitLessThanTargetUnit = A unidade de entrada \u00E9 menor que a unidade final.
+widget_durationItem_unitTypeNotSupported = Tipo de unidade [{0}] n\u00E3o suportada por este Item de Dura\u00E7\u00E3o.
+widget_jobTriggerEditor_fieldHelp_repeatDuration = permanecer executando esta opera\u00E7\u00E3o por tantas vezes ou at\u00E9 o t\u00E9rmino deste tempo
+widget_jobTriggerEditor_fieldHelp_repeatInterval = qual a frequ\u00EAncia de execu\u00E7\u00E3o da opera\u00E7\u00E3o
+widget_jobTriggerEditor_fieldHelp_startDelay = iniciar a execu\u00E7\u00E3o da opera\u00E7\u00E3o ap\u00F3s passar esta quantidade de tempo
+widget_jobTriggerEditor_field_cronExpression = Express\u00E3o da Cron
+widget_jobTriggerEditor_field_mode = Agendar usando
+widget_jobTriggerEditor_field_repeatInterval_later = Sempre repetir
+widget_jobTriggerEditor_field_repeatInterval_now = Executar agora e sempre
+widget_jobTriggerEditor_field_startType = Executar
+widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = O t\u00E9rmino deve ser ap\u00F3s o in\u00EDcio.
+widget_jobTriggerEditor_message_endTimeMustBeInFuture = O t\u00E9rmino deve ser no futuro.
+widget_jobTriggerEditor_message_startTimeMustBeInFuture = O in\u00EDcio deve ser no futuro.
+widget_jobTriggerEditor_tab_examples = Exemplos
+widget_jobTriggerEditor_tab_format = Formato
+widget_jobTriggerEditor_value_calendar = Calend\u00E1rio
+widget_jobTriggerEditor_value_cronExpression = Express\u00E3o da Cron
+widget_jobTriggerEditor_value_for = Para
+widget_jobTriggerEditor_value_in = em
+widget_jobTriggerEditor_value_indefinitely = Indefinidamente
+widget_jobTriggerEditor_value_later = Mais tarde
+widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
+widget_jobTriggerEditor_value_now = Agora
+widget_jobTriggerEditor_value_nowAndRepeat = Agora & Repetir
+widget_jobTriggerEditor_value_on = em
+widget_jobTriggerEditor_value_until = At\u00E9
+widget_recordEditor_error_invalidViewPath = Caminho inv\u00E1lido: [{0}]
+widget_recordEditor_error_multipleRecords = Foram encontrados v\u00E1rios registros - era esperado apenas um.
+widget_recordEditor_error_noRecords = Nenhum registro encontrado - era esperado exatamente um.
+widget_recordEditor_error_operation = Falha na Opera\u00E7\u00E3o. Ocorreu um Erro
+widget_recordEditor_error_operationInvalidValues = Falha na Opera\u00E7\u00E3o - um ou mais campos possuem valores inv\u00E1lidos
+widget_recordEditor_error_permissionCreate = Voc\u00EA n\u00E3o possui permiss\u00E3o necess\u00E1ria para criar um novo [{0}]
+widget_recordEditor_error_unsupportedOperationType = Tipo de opera\u00E7\u00E3o n\u00E3o suportada: [{0}]
+widget_recordEditor_info_recordCreatedConcise = {0} criado.
+widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] criado.
+widget_recordEditor_info_recordUpdatedConcise = {0} atualizado.
+widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] atualizado.
+widget_recordEditor_info_recordsDeletedConcise = {0} {1} exclu\u00EDdo.
+widget_recordEditor_info_recordsDeletedDetailed = {0} {1} exclu\u00EDdo: {2}.
+widget_recordEditor_label_loading = Carregar...
+widget_recordEditor_title_edit = Editar {0} [{1}]
+widget_recordEditor_title_new = Criar Novo {0}
+widget_recordEditor_title_view = Visualizar {0} [{1}]
+widget_recordEditor_warn_validation = Um ou mais campos possuem valores inv\u00E1lidos. Este [{0}] n\u00E3o pode ser salvo at\u00E9 que os valores sejam corrigidos.
+widget_resourceFactoryWizard_archPrompt = Arquitetura do Pacote
+widget_resourceFactoryWizard_configTemplatePrompt = Modelo de Configura\u00E7\u00E3o de Recurso
+widget_resourceFactoryWizard_contentTemplatePrompt = Modelos de Configura\u00E7\u00E3o do Tempo de Deploy
+widget_resourceFactoryWizard_createSubmit = A requisi\u00E7\u00E3o para cria\u00E7\u00E3o de um recurso com nome [{0}] foi submetida com sucesso.
+widget_resourceFactoryWizard_createSubmitType = A requisi\u00E7\u00E3o para cria\u00E7\u00E3o de um recurso do tipo [{0}] foi submetida com sucesso.
+widget_resourceFactoryWizard_createWizardTitle = Criar novo recurso do tipo [{0}]
+widget_resourceFactoryWizard_createWizardWindowTitle = Assistente para Cria\u00E7\u00E3o de Recurso
+##widget_resourceFactoryWizard_editConfigStepName = Deployment Options
+widget_resourceFactoryWizard_execute1 = Falha ao criar novo recurso - vers\u00E3o do pacote inexistente
+widget_resourceFactoryWizard_execute2 = Falha ao criar novo recurso
+widget_resourceFactoryWizard_failedToDeleteVersion = Falha ao excluir a vers\u00E3o do pacote durante o cancelamento da cria\u00E7\u00E3o do recurso
+widget_resourceFactoryWizard_failedToGetType = Falha ao recuperar o tipo de pacote para o novo recurso
+widget_resourceFactoryWizard_importFailure = Falha ao importar recursos manualmente
+widget_resourceFactoryWizard_importSubmitted = Uma requisi\u00E7\u00E3o para importar um novo recurso do tipo [{0}] foi submetida
+widget_resourceFactoryWizard_importWizardTitle = Importar Recursos do Tipo [{0}]
+widget_resourceFactoryWizard_importWizardWindowTitle = Assistente para Importa\u00E7\u00E3o de Recurso
+widget_resourceFactoryWizard_infoStepName = Informa\u00E7\u00E3o do Recurso
+widget_resourceFactoryWizard_infoStep_loadFail = Falha ao recuperar Arquiteturas dispon\u00EDveis.
+widget_resourceFactoryWizard_namePrompt = Novo Nome do Recurso
+widget_resourceFactoryWizard_templatePrompt = Modelo de Propriedades para Conex\u00E3o
+##widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
+widget_resourceFactoryWizard_uploadFailure = Falha ao realizar o upload do arquivo
+widget_resourceFactoryWizard_uploadFileStepName = Upload do Arquivo do Recurso
+widget_resourceFactoryWizard_uploadInProgress = Upload em andamento... Esse processo pode demorar alguns minutos para ser finalizado em caso de arquivos muito grandes.
+widget_resourceFactoryWizard_versionPrompt = Vers\u00E3o do Pacote
+widget_resourceSelector_groupCategory = Categoria do Grupo
+widget_resourceSelector_pleaseSelectMultipleResource = Favor selecionar um ou mais recursos
+widget_resourceSelector_pleaseSelectResource = Favor selecionar um recurso
+widget_resourceSelector_selectMultipleResources = Selecionar Recursos
+widget_resourceSelector_selectResource = Selecionar um Recurso
+widget_typeCache_loadFail = Falha ao carregar o metadado do tipo de recurso
+widget_typeTree_badTemplateType = URL inv\u00E1lida. Tipo de template desconhecido [{0}]
+widget_typeTree_badTypeId = URL inv\u00E1lida. Tipo de recurso inv\u00E1lido: ID [{0}]
+widget_typeTree_loadFail = Falha ao carregar tipos de recurso
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 9f5b96a..f2993ce 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -1,1804 +1,1794 @@
-#
-# RHQ GUI i18n Messages - Localization: ZH
-#
-# Developers: See the following wiki page for how to work with this file:
-#
-# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
-#
-###################################
-
-common_alert_high = High
-common_alert_low = Low
-common_alert_medium = Medium
-common_buildInfo_gwtVersion = ${gwt.version}
-common_button_ack = \u786E\u8BA4
-common_button_ack_all = \u786E\u8BA4\u6240\u6709
-common_button_add = \u6DFB\u52A0
-common_button_advanced = \u9AD8\u7EA7...
-common_button_apply = \u63A5\u53D7
-common_button_cancel = \u53D6\u6D88
-common_button_close = \u5173\u95ED
-common_button_compare = \u5BF9\u6BD4
-common_button_create_child = Create Child
-common_button_delete = \u5220\u9664
-common_button_delete_all = \u5220\u9664\u6240\u6709
-common_button_disable = \u7981\u7528
-common_button_edit = \u7F16\u8F91
-common_button_enable = \u542F\u7528
-common_button_finish = \u5B8C\u6210
-common_button_import = \u5BFC\u5165
-common_button_new = \u65B0\u5EFA
-common_button_next = \u4E0B\u4E00\u6B65
-common_button_ok = OK
-common_button_previous = \u4E0A\u4E00\u6B65
-common_button_purgeAll = \u6E05\u9664\u6240\u6709
-common_button_refresh = \u5237\u65B0
-common_button_reset = \u91CD\u7F6E
-common_button_save = \u4FDD\u5B58
-common_button_schedule = \u8BA1\u5212
-common_button_search = \u68C0\u7D22
-common_button_set = Set
-common_button_showDetails = \u67E5\u770B\u8BE6\u60C5...
-common_button_uninventory = Uninventory
-common_calendar_april_short = \u56DB\u6708
-common_calendar_august_short = \u516B\u6708
-common_calendar_december_short = \u5341\u4E8C\u6708
-common_calendar_february_short = \u4E8C\u6708
-common_calendar_january_short = \u4E00\u6708
-common_calendar_july_short = \u4E03\u6708
-common_calendar_june_short = \u516D\u6708
-common_calendar_march_short = \u4E09\u6708
-common_calendar_may_short = \u4E94\u6708
-common_calendar_november_short = \u5341\u4E00\u6708
-common_calendar_october_short = \u5341\u6708
-common_calendar_september_short = \u4E5D\u6708
-common_label_ago = ago
-common_label_all = \u6240\u6709
-common_label_all_resources = \u6240\u6709\u8D44\u6E90
-common_label_day = \u5929
-common_label_days = \u5929
-common_label_hour = \u5C0F\u65F6
-common_label_hours = \u5C0F\u65F6
-common_label_item = \u9879
-common_label_items = \u9879
-common_label_milliseconds = \u6BEB\u79D2
-common_label_minutes = \u5206\u949F
-common_label_month = \u6708
-common_label_none = \u65E0
-common_label_role = \u89D2\u8272
-common_label_roles = \u89D2\u8272
-common_label_scheduled_operations = \u8BA1\u5212\u64CD\u4F5C
-common_label_seconds = \u79D2
-common_label_selected_resources = \u5DF2\u9009\u8D44\u6E90
-common_label_unlimited = \u65E0\u9650\u5236
-common_label_user = \u7528\u6237
-common_label_users = \u7528\u6237
-common_label_week = \u5468
-common_label_weeks = \u5468
-common_label_yesterday = \u6628\u5929
-common_msg_areYouSure = \u4F60\u786E\u5B9A?
-common_msg_asyncTimeout = {0}. \u56E0\u4E3A\u670D\u52A1\u5668\u54CD\u5E94\u65F6\u95F4\u592A\u957F. \u8BF7\u6CE8\u610F\u670D\u52A1\u5668\u53EF\u80FD\u4ECD\u5728\u5904\u7406\u60A8\u7684\u8BF7\u6C42\uFF0C\u5E76\u53EF\u80FD\u5728\u77ED\u671F\u5185\u5B8C\u6210. \u4F60\u53EF\u4EE5\u68C0\u67E5\u670D\u52A1\u5668\u65E5\u5FD7\uFF0C\u67E5\u770B\u662F\u5426\u51FA\u73B0\u4EFB\u4F55\u4E0D\u6B63\u5E38\u7684\u9519\u8BEF.
-common_msg_changeAutoDetected = Change auto-detected
-common_msg_deleteConfirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664# selected {0}?
-common_msg_emphasizedNotePrefix = \u6CE8\u610F:
-common_msg_loading = \u52A0\u8F7D\u4E2D...
-common_msg_noItemsToShow = \u6CA1\u6709\u6761\u76EE\u663E\u793A
-common_msg_notYetImplemented = \u5C1A\u672A\u5B9E\u73B0
-common_msg_see_more = \u67E5\u770B\u66F4\u591A...
-common_msg_step_x_of_y = Step {0} of {1}
-common_severity_debug = Debug
-common_severity_error = Error
-common_severity_fatal = Fatal
-common_severity_info = Info
-common_severity_warn = Warn
-common_status_canceled = Canceled
-common_status_deferred = Deferred
-common_status_failed = Failed
-common_status_inprogress = In Progress
-common_status_nochange = No Change
-common_status_partial = Partial
-common_status_success = Success
-common_status_timedOut = Timed Out
-common_status_unknown = Unknown
-common_title_add_column = \u6DFB\u52A0\u5217
-common_title_add_graph_to_view = \u6DFB\u52A0\u56FE\u5230\u76D1\u89C6\u89C6\u56FE
-common_title_add_portlet = \u6DFB\u52A0Portlet
-common_title_address = \u5730\u5740
-common_title_alert_range = \u544A\u8B66\u8303\u56F4
-common_title_ancestry = \u7956\u5148
-common_title_availability = \u53EF\u7528\u6027
-common_title_available_resources = \u53EF\u7528\u7684\u8D44\u6E90
-common_title_average_metrics = \u5E73\u5747\u6BCF\u5206\u949F\u6307\u6807
-common_title_background = \u80CC\u666F\u8272
-common_title_bundle = Bundle
-common_title_bundles = Bundles
-common_title_category = \u7C7B\u522B
-common_title_change_refresh_time = \u5237\u65B0\u95F4\u9694
-common_title_columns = \u5217
-common_title_compare_metrics = \u6307\u6807\u5BF9\u6BD4
-common_title_compatibleGroups = \u517C\u5BB9\u7EC4
-common_title_compatibleGroups_total = \u6240\u6709\u517C\u5BB9\u7EC4
-common_title_component_errors = \u7EC4\u4EF6\u9519\u8BEF
-common_title_config_update_status = \u66F4\u65B0\u72B6\u6001
-common_title_configuration = \u914D\u7F6E
-common_title_count = \u6570
-common_title_custom = \u81EA\u5B9A\u4E49
-common_title_dashboard_name = \u7EDF\u8BA1\u8868\u76D8\u540D
-common_title_dateCreated = \u521B\u5EFA\u65E5\u671F
-common_title_dateRange = \u65E5\u671F\u8303\u56F4
-common_title_default = \u9ED8\u8BA4
-common_title_description = \u63CF\u8FF0
-common_title_details = \u8BE6\u7EC6
-common_title_display = \u663E\u793A
-common_title_display_name = \u663E\u793A\u540D
-common_title_duration = \u95F4\u9694
-common_title_edit_mode = \u7F16\u8F91\u6A21\u5F0F
-common_title_enabled = \u542F\u7528?
-common_title_end = End
-common_title_error = Error
-common_title_generalProp = \u57FA\u672C\u5C5E\u6027
-common_title_group = \u7EC4
-common_title_group_def_total = \u5B9A\u4E49\u7EC4\u603B\u6570
-common_title_group_member_health = Group Member Health
-common_title_groups = \u7EC4
-common_title_help = \u5E2E\u52A9
-common_title_host = \u4E3B\u673A
-common_title_icon =
-common_title_id = ID
-common_title_id_parent = \u7236ID
-common_title_info = Info
-common_title_inventory = \u6E05\u5355
-common_title_inventorySummary = \u6E05\u5355\u6C47\u603B
-common_title_lastUpdated = \u6700\u8FD1\u66F4\u65B0
-common_title_lastUpdatedBy = \u6700\u8FD1\u66F4\u65B0\u8005
-common_title_ldapGroups = LDAP\u7EC4
-common_title_mashup = Mashup
-common_title_members_reporting = \u7EC4\u62A5\u8868
-common_title_message = \u6D88\u606F
-common_title_metric = Metric
-common_title_metric_chart = Metric\u56FE\u8868
-common_title_mixedGroups = \u6DF7\u5408\u7EC4
-common_title_mixedGroups_total = \u6240\u6709\u6DF7\u5408\u7EC4
-common_title_name = \u540D\u79F0
-common_title_new_dashboard = \u65B0\u5EFA\u7EDF\u8BA1\u8868\u76D8
-common_title_numeric_metrics = \u6570\u5B57\u578B\u6307\u6807
-common_title_numeric_type = \u6570\u5B57\u7C7B\u578B
-common_title_operation_status = \u64CD\u4F5C\u72B6\u6001
-common_title_operations = \u64CD\u4F5C
-common_title_operations_range = \u64CD\u4F5C\u8303\u56F4
-common_title_over = Over
-common_title_password = \u5BC6\u7801
-common_title_path = Path
-common_title_permissions = \u6743\u9650
-common_title_platform = \u5E73\u53F0
-common_title_platform_total = \u6240\u6709\u5E73\u53F0
-common_title_plugin = \u63D2\u4EF6
-common_title_port = \u7AEF\u53E3
-common_title_providers = \u63D0\u4F9B\u8005
-common_title_recent_alerts = \u6700\u8FD1\u544A\u8B66
-common_title_recent_bundle_deployments = \u6700\u8FD1\u53D1\u5E03Bundles
-common_title_recent_configuration_updates = \u6700\u8FD1\u914D\u7F6E\u66F4\u65B0
-common_title_recent_event_counts = \u6700\u8FD1\u4E8B\u4EF6\u6570
-common_title_recent_measurements = Recent Measurements
-common_title_recent_oob_metrics = Recent Out of Bound metrics
-common_title_recent_operations = \u6700\u8FD1\u64CD\u4F5C
-common_title_recent_pkg_history = \u6700\u8FD1\u5386\u53F2\u5305
-common_title_recently_added = \u6700\u8FD1\u6DFB\u52A0
-common_title_remove_column = \u79FB\u9664\u5217
-common_title_repositories = \u5E93
-common_title_resource = \u8D44\u6E90
-common_title_resourceGroups = \u8D44\u6E90\u7EC4
-common_title_resource_group = \u8D44\u6E90\u7EC4
-common_title_resource_id = \u8D44\u6E90ID
-common_title_resource_inventory = \u8D44\u6E90\u6E05\u5355
-common_title_resource_key = \u8D44\u6E90Key
-common_title_resource_name = \u8D44\u6E90\u540D
-common_title_resource_type = \u8D44\u6E90\u7C7B\u578B
-common_title_resources = \u8D44\u6E90
-common_title_results_count = \u7ED3\u679C\u6570\u91CF
-common_title_results_count_tooltip = \u663E\u793A\u7ED3\u679C\u6570\u91CF
-common_title_role = \u89D2\u8272
-common_title_roles = \u89D2\u8272
-common_title_scheduled_operations = \u8BA1\u5212\u64CD\u4F5C
-common_title_search = \u641C\u7D22
-common_title_selected_resources = \u9009\u62E9\u7684\u8D44\u6E90
-common_title_server = \u670D\u52A1\u5668
-common_title_server_total = \u670D\u52A1\u5668\u603B\u6570
-common_title_service = \u670D\u52A1
-common_title_service_total = \u670D\u52A1\u603B\u6570
-common_title_settings = \u8BBE\u7F6E
-common_title_show = \u663E\u793A
-common_title_show_more = \u663E\u793A\u6240\u6709...
-common_title_sort_order = \u6392\u5E8F
-common_title_sort_order_tooltip = \u8BBE\u7F6E\u6392\u5E8F\u65B9\u5F0F.
-common_title_start = \u5F00\u59CB
-common_title_status = \u72B6\u6001
-common_title_stop = \u505C\u6B62
-common_title_summary = \u7EDF\u8BA1
-common_title_tag_cloud = \u6807\u7B7E\u4E91
-common_title_the = The
-common_title_timestamp = \u65E5\u671F/\u65F6\u95F4
-common_title_total = \u603B\u6570
-common_title_type = \u7C7B\u578B
-common_title_units = \u5355\u4F4D
-common_title_user = \u7528\u6237
-common_title_users = \u7528\u6237
-common_title_value = \u503C
-common_title_version = \u7248\u672C
-common_title_view_mode = \u67E5\u770B\u6A21\u5F0F
-common_title_web_address = Web\u5730\u5740
-common_title_welcome = \u6B22\u8FCE
-common_unit_days = \u5929
-common_unit_hours = \u5C0F\u65F6
-common_unit_milliseconds = \u6BEB\u79D2
-common_unit_minutes = \u5206\u949F
-common_unit_months = \u6708
-common_unit_seconds = \u79D2
-common_unit_times = \u6B21
-common_unit_weeks = \u5468
-common_unit_years = \u5E74
-common_val_for = for
-common_val_n1st = {0}st
-common_val_n2nd = {0}nd
-common_val_n3rd = {0}rd
-common_val_na = N/A
-common_val_never = Never
-common_val_no = No
-common_val_no_lower = no
-common_val_none = None
-common_val_nth = {0}th
-common_val_yes = Yes
-common_val_yes_lower = yes
-
-dataSource_ContentRepoTree_error_load = \u52A0\u8F7D\u5E93\u9519\u8BEF
-dataSource_ContentRepoTree_field_parentId = \u7236ID
-dataSource_bundle_loadFailed = \u52A0\u8F7Dbundle\u6570\u636E\u5931\u8D25
-dataSource_configurationHistory_clickToSeeError = \u53CC\u51FB\u67E5\u770B\u9519\u8BEF...
-dataSource_configurationHistory_currentConfig = \u8FD9\u662F\u5F53\u524D\u914D\u7F6E
-dataSource_configurationHistory_dateCompleted = \u5B8C\u6210\u65E5\u671F
-dataSource_configurationHistory_dateSubmitted = \u63D0\u4EA4\u65E5\u671F
-dataSource_configurationHistory_error_fetchFailure = \u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2\u914D\u7F6E.
-dataSource_configurationHistory_updateType = \u66F4\u65B0\u7C7B\u578B
-dataSource_configurationHistory_updateType_group = \u7EC4
-dataSource_configurationHistory_updateType_individual = Individual
-dataSource_definitions_loadFailed = \u65E0\u6CD5\u52A0\u8F7D\u6307\u6807\u5B9A\u4E49
-dataSource_measurementOob_error_fetchFailure = \u52A0\u8F7Dmeasurement OOB information\u5931\u8D25
-dataSource_measurementOob_field_factor = Out of Range Factor (%)
-dataSource_measurementOob_field_formattedBaseband = Band
-dataSource_measurementOob_field_formattedOutlier = Outlier
-dataSource_measurementOob_field_parentName = \u7236
-dataSource_measurementOob_field_resourceName = \u8D44\u6E90
-dataSource_measurementOob_field_scheduleName = \u6307\u6807
-dataSource_operationHistory_error_fetchFailure = \u52A0\u8F7D\u5386\u53F2\u64CD\u4F5C\u5931\u8D25.
-dataSource_operationHistory_field_createdTime = \u521B\u5EFA\u65F6\u95F4
-dataSource_operationHistory_field_operationName = \u64CD\u4F5C\u540D
-dataSource_operationHistory_field_startedTime = \u5F00\u59CB\u65F6\u95F4
-dataSource_operationHistory_field_subject = Requester
-dataSource_operationSchedule_field_description = \u6CE8\u610F
-dataSource_operationSchedule_field_id = \u8BA1\u5212\u4EFB\u52A1ID
-dataSource_operationSchedule_field_nextFireTime = \u4E0B\u6B21\u89E6\u53D1\u65F6\u95F4
-dataSource_operationSchedule_field_operationDisplayName = \u64CD\u4F5C
-dataSource_operationSchedule_field_operationName = \u64CD\u4F5C
-dataSource_operationSchedule_field_subject = \u6240\u6709\u8005
-dataSource_operationSchedule_field_timeout = \u8D85\u65F6(\u79D2)
-dataSource_platforms_field_cpu = CPU
-dataSource_platforms_field_memory = \u5185\u5B58
-dataSource_platforms_field_swap = \u4EA4\u6362\u533A
-dataSource_problemResources_error_fetchFailure = \u52A0\u8F7D\u544A\u8B66/\u4E0D\u53EF\u7528\u8D44\u6E90\u5931\u8D25.
-dataSource_problemResources_field_alerts = \u544A\u8B66
-dataSource_problemResources_field_available = \u5F53\u524D\u53EF\u7528\u6027
-dataSource_recentOperations_error_fetchFailure = \u52A0\u8F7D\u6700\u8FD1\u64CD\u4F5C\u5931\u8D25.
-dataSource_recentOperations_field_location = \u4F4D\u7F6E
-dataSource_recentOperations_field_operation = \u64CD\u4F5C
-dataSource_recentOperations_field_resource = \u8D44\u6E90
-dataSource_recentOperations_field_status = \u72B6\u6001
-dataSource_recentOperations_field_time = \u65E5\u671F/\u65F6\u95F4
-dataSource_resourceErrors_clickStatusIcon = \u70B9\u51FB\u56FE\u6807\u67E5\u770B\u8BE6\u60C5
-dataSource_resourceErrors_deleteFailure = \u5220\u9664\u8D44\u6E90\u9519\u8BEF\u5931\u8D25
-dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
-dataSource_resourceErrors_error_fetchFailure = Failed to find Resource errors for Resource with id [{0}].
-dataSource_resourceErrors_field_errorType = \u9519\u8BEF\u7C7B\u578B
-dataSource_resourceErrors_field_summary = \u7EDF\u8BA1
-dataSource_resourceErrors_field_timeOccured = \u65F6\u95F4
-dataSource_resourceGroups_loadFailed = \u52A0\u8F7D\u8D44\u6E90\u7EC4\u5931\u8D25
-dataSource_resources_field_discoveryTime = \u53D1\u73B0\u65F6\u95F4
-dataSource_resources_field_importTime = \u5BFC\u5165\u65F6\u95F4
-dataSource_resources_field_key = Key
-dataSource_resources_field_lastModifiedTime = \u6700\u8FD1\u66F4\u6539\u65F6\u95F4
-dataSource_resources_field_lastModifier = \u6700\u8FD1\u4FEE\u6539\u8005
-dataSource_resources_field_location = \u4F4D\u7F6E
-dataSource_rpc_error_transformRequestFailure = Failure in datasource while processing {0} request.
-dataSource_rpc_error_unsupportedArrayFilterType = No support for passing array filters of type {0}.
-dataSource_rpc_error_unsupportedEnumType = Please add an appropriate code block for enum {0} to RPCDataSource.getEnumArray(Class)
-dataSource_rpc_no = no
-dataSource_rpc_yes = yes
-dataSource_scheduledOperations_error_fetchFailure = \u65E0\u6CD5\u8F7D\u5165\u8BA1\u5212\u64CD\u4F5C.
-dataSource_scheduledOperations_field_location = \u4F4D\u7F6E
-dataSource_scheduledOperations_field_operation = \u64CD\u4F5C
-dataSource_scheduledOperations_field_resource = \u8D44\u6E90
-dataSource_scheduledOperations_field_time = \u65E5\u671F/\u65F6\u95F4
-dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
-dataSource_schedules_disableSuccessful_full_group = You have disabled the collection of [{0}] measurements for the resource group with ID [{1}]. The disabled measurements are: [{2}]
-dataSource_schedules_disableSuccessful_full_resource = You have disabled the collection of [{0}] measurements for the resource with ID [{1}]. The disabled measurements are: [{2}]
-dataSource_schedules_enableFailure_group = Failed to enable the collection of [{0}] metrics for group with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_enableFailure_resource = Failed to enable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
-dataSource_schedules_enableSuccessful_concise = You have enabled the collection of [{0}] measurements
-dataSource_schedules_enableSuccessful_full_group = You have enabled the collection of [{0}] measurements for the resource group with ID [{1}]. The enabled measurements are: [{2}]
-dataSource_schedules_enableSuccessful_full_resource = You have enabled the collection of [{0}] measurements for the resource with ID [{1}]. The enabled measurements are: [{2}]
-dataSource_schedules_field_resourceGroupId = \u7EC4ID
-dataSource_schedules_loadFailed = \u52A0\u8F7D\u6307\u6807\u8BA1\u5212\u4EFB\u52A1\u5931\u8D25
-dataSource_schedules_loadFailedContext = Failed to load metric schedules for context [{0}]
-dataSource_schedules_loadFailedCriteria = Failed to load metric schedules for criteria [{0}]
-dataSource_schedules_updateFailure_group = Failed to set the collection interval of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
-dataSource_schedules_updateFailure_resource = Failed to set the collection interval of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
-dataSource_schedules_updateSuccessful_concise = A new collection interval of [{0}] seconds has been set on [{1}] measurements
-dataSource_schedules_updateSuccessful_full_group = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource group with ID [{2}]. The updated measurements are: [{3}]
-dataSource_schedules_updateSuccessful_full_resource = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource with ID [{2}]. The updated measurements are: [{3}]
-dataSource_traits_failFetch = Failed to fetch traits for criteria [{0}].
-dataSource_traits_field_definitionID = Definition ID
-dataSource_traits_field_lastChanged = \u6700\u8FD1\u66F4\u6539
-dataSource_traits_field_primaryKey = \u4E3B\u952E
-dataSource_traits_field_trait = Trait
-dataSource_traits_group_field_groupId = \u7EC4ID
-dataSource_users_delete = \u5220\u9664\u7528\u6237[{0}]
-dataSource_users_deleteFailed = \u5220\u9664\u7528\u6237[{0}]\u5931\u8D25
-dataSource_users_field_department = \u90E8\u95E8
-dataSource_users_field_emailAddress = Email\u5730\u5740
-dataSource_users_field_factive = \u5141\u8BB8\u767B\u5F55?
-dataSource_users_field_firstName = \u540D
-dataSource_users_field_id = ID
-dataSource_users_field_lastName = \u59D3
-dataSource_users_field_ldap = LDAP\u767B\u5F55?
-dataSource_users_field_name = \u7528\u6237\u540D
-dataSource_users_field_password = \u5BC6\u7801
-dataSource_users_field_passwordVerify = \u786E\u8BA4\u5BC6\u7801
-dataSource_users_field_phoneNumber = \u7535\u8BDD\u53F7\u7801
-dataSource_users_invalidEmailAddress = \u90AE\u7BB1\u5730\u5740\u65E0\u6548.
-dataSource_users_passwordsDoNotMatch = \u5BC6\u7801\u4E0D\u5339\u914D.
-
-datasource_roles_field_ldapGroups = LDAP\u7EC4
-datasource_roles_field_permissions = \u6743\u9650
-datasource_roles_field_resourceGroups = \u8D44\u6E90\u7EC4
-datasource_roles_field_subjects = Subjects
-datasource_templateSchedules_disabled = \u7981\u7528\u9009\u62E9\u7684\u6307\u6807[{0}]\u91C7\u96C6.
-datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_disabled_failed = Failed to disable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled = Enabled collection of selected metric [{0}].
-datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_enabled_failed = Failed to enable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
-datasource_templateSchedules_updated = Updated collection intervals of selected metric [{0}].
-datasource_templateSchedules_updated_detail = Collection interval for metric [{0}] [{1}] by default for ResourceType with id [{2}] set to [{3}] seconds.
-datasource_templateSchedules_updated_failed = Failed to set collection interval to [{0}] seconds for metric [{1}] [{2}] by default for ResourceType with id [{3}].
-
-favorites = \u6536\u85CF\u5939
-
-favorites_groups = \u7EC4\u6536\u85CF\u5939
-favorites_recentlyViewed = \u6700\u8FD1\u67E5\u770B
-favorites_resources = \u8D44\u6E90\u6536\u85CF\u5939
-
-group_tree_partialClusterTooltip = \u9664\u53BB {1},{0}\u7684\u7EC4\u6210\u5458\u62E5\u6709 \u4E00\u4E2A''{2}''\u8D44\u6E90
-
-util_ancestry_parentAncestry = Parent Ancestry for:
-util_errorHandler_nullException = exception was null
-util_monitoringRequestCallback_error_checkServerStatusFailure = \u65E0\u6CD5\u786E\u5B9A\u767B\u5F55\u72B6\u6001- \u68C0\u67E5\u670D\u52A1\u5668\u72B6\u6001.
-util_rpcManager_activeRequests = {0}\u6FC0\u6D3B\u7684\u8BF7\u6C42
-util_userPerm_loadFailGlobal = \u65E0\u6CD5\u8F7D\u5165\u5168\u5C40\u6743\u9650- \u672A\u6388\u6743.
-util_userPerm_loadFailGroup = \u65E0\u6CD5\u8BBF\u95EE\u8D44\u6E90\u7EC4[{0}] - \u672A\u6388\u6743.
-util_userPerm_loadFailResource = \u65E0\u6CD5\u8BBF\u95EE\u8D44\u6E90[{0}] - \u672A\u6388\u6743.
-util_userSession_loadFailSubject = UserSessionManager: \u52A0\u8F7D\u7528\u6237\u4E3B\u9898\u5931\u8D25
-util_userSession_logoutFail = \u6CE8\u9500\u5931\u8D25.
-util_widgetsField_unlimited = \u65E0\u9650\u5236
-
-view_aboutBox_allRightsReserved = All Rights Reserved.
-view_aboutBox_buildNumber = \u4EA7\u54C1\u7F16\u8BD1\u53F7:
-view_aboutBox_failedToLoad = \u52A0\u8F7D\u4EA7\u54C1\u4FE1\u606F\u5931\u8D25.
-view_aboutBox_homepage = \u4E3B\u9875
-view_aboutBox_jbossByRedHat = JBoss by Red Hat
-view_aboutBox_title = \u5173\u4E8E {0}
-view_aboutBox_version = \u7248\u672C:
-view_adminConfig_downloads = \u4E0B\u8F7D
-view_adminConfig_plugins = \u63D2\u4EF6
-view_adminConfig_systemSettings = \u7CFB\u7EDF\u8BBE\u7F6E
-view_adminConfig_templates = \u6A21\u677F
-view_adminContent_contentSources = Content\u6E90
-view_adminContent_repositories = \u5E93
-view_adminRoles_assignedGroups = \u5206\u914D\u7684\u8D44\u6E90\u7EC4
-view_adminRoles_assignedSubjects = \u5206\u914D\u7684\u4E3B\u9898
-view_adminRoles_failLdap = \u65E0\u6CD5\u786E\u5B9ALDAP - \u5047\u5B9A\u6CA1\u6709LDAP.
-view_adminRoles_failLdapGroups = \u67E5\u8BE2\u6709\u6548LDAP\u7EC4\u5931\u8D25 - \u5047\u5B9A\u65E0DAP\u7EC4.
-view_adminRoles_failLdapGroupsRole = \u52A0\u8F7DLDAP\u7EC4\u89D2\u8272\u5931\u8D25.
-view_adminRoles_failRoles = \u53D6\u5F97\u89D2\u8272\u5931\u8D25.
-view_adminRoles_globalPerms = \u5168\u5C40\u6388\u6743
-view_adminRoles_ldapGroups = LDAP\u7EC4
-view_adminRoles_ldapGroupsReadOnly = LDAP\u7EC4\u6570\u636E\u4E3A\u53EA\u8BFB
-view_adminRoles_noItems = \u6CA1\u6709\u6761\u76EE\u663E\u793A
-view_adminRoles_noLdap = \u6CA1\u6709\u96C6\u6210LDAP\u5B89\u5168, \u5230<a {0}>{1}</a>.
-view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
-view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
-view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
-view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
-view_adminRoles_permissions_globalPermissions = \u5168\u5C40\u6388\u6743
-view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
-view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
-view_adminRoles_permissions_isAuthorized = \u6388\u6743?
-view_adminRoles_permissions_isRead = \u8BFB?
-view_adminRoles_permissions_isWrite = \u5199?
-view_adminRoles_permissions_permDesc_manageBundles = \u80FD\u521B\u5EFA,\u66F4\u65B0\u6216\u8005\u5220\u9664\u63D0\u4F9B\u7684bundles(\u4EFB\u4F55\u4EBA\u90FD\u80FD\u67E5\u770B)
-view_adminRoles_permissions_permDesc_manageInventory = \u62E5\u6709\u6240\u6709\u8D44\u6E90\u6743\u9650, \u5982\u4E0B\u6240\u8FF0, \u5BF9\u6240\u6709\u8D44\u6E90; \u5177\u6709\u521B\u5EFA, \u66F4\u65B0, \u5220\u9664\u7EC4; \u80FD\u5BFC\u5165\u81EA\u52A8\u53D1\u73B0\u6216\u624B\u52A8\u53D1\u73B0\u7684\u8D44\u6E90
-view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
-view_adminRoles_permissions_permDesc_manageSecurity = \u80FD\u521B\u5EFA,\u66F4\u65B0,\u6216\u5220\u9664\u7528\u6237\u548C\u89D2\u8272 (\u4EFB\u4F55\u4EBA\u90FD\u6709\u67E5\u770B\u6743\u9650)
-view_adminRoles_permissions_permDesc_manageSettings = \u80FD\u4FEE\u6539RHQ\u670D\u52A1\u5668\u914D\u7F6E\u800C\u4E14\u80FD\u64CD\u4F5C\u4EFB\u4F55\u76F8\u5173\u7684\u670D\u52A1\u5668\u529F\u80FD
-view_adminRoles_permissions_permReadDesc_configure = \u67E5\u770B\u8D44\u6E90\u914D\u7F6E\u548C\u8D44\u6E90\u914D\u7F6E\u4FEE\u8BA2\u5386\u53F2
-view_adminRoles_permissions_permReadDesc_control = (IMPLIED) \u67E5\u770B\u53EF\u7528\u64CD\u4F5C\u548C\u64CD\u4F5C\u6267\u884C\u5386\u53F2
-view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) \u67E5\u770B\u5B50\u8D44\u6E90\u521B\u5EFA\u5386\u53F2
-view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) \u67E5\u770B\u5B50\u8D44\u6E90\u5220\u9664\u5386\u53F2
-view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
-view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) \u67E5\u770B\u544A\u8B66\u5B9A\u4E49\u548C\u544A\u8B66\u5386\u53F2
-view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) \u67E5\u770B\u5B89\u88C5\u7684\u548C\u53EF\u7528\u7684\u5305; \u67E5\u770B\u5305\u5B89\u88C5\u5386\u53F2
-view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED)\u67E5\u770B\u4E8B\u4EF6
-view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
-view_adminRoles_permissions_permWriteDesc_configure = \u66F4\u65B0\u8D44\u6E90\u914D\u7F6E; delete Resource configuration revision history items
-view_adminRoles_permissions_permWriteDesc_control = \u6267\u884C\u64CD\u4F5C; \u5220\u9664\u64CD\u4F5C\u6267\u884C\u5386\u53F2
-view_adminRoles_permissions_permWriteDesc_createChildResources = \u521B\u5EFA\u65B0\u7684\u5B50\u8D44\u6E90 (for child Resources of types that are creatable)
-view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
-view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
-view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
-view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
-view_adminRoles_permissions_permWriteDesc_manageEvents = \u5220\u9664\u4E8B\u4EF6
-view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
-view_adminRoles_permissions_perm_configure = \u914D\u7F6E
-view_adminRoles_permissions_perm_control = \u63A7\u5236
-view_adminRoles_permissions_perm_createChildResources = \u521B\u5EFA\u5B50\u8D44\u6E90
-view_adminRoles_permissions_perm_deleteChildResources = \u5220\u9664\u5B50\u8D44\u6E90
-view_adminRoles_permissions_perm_inventory = \u6E05\u5355
-view_adminRoles_permissions_perm_manageAlerts = \u7BA1\u7406\u544A\u8B66
-view_adminRoles_permissions_perm_manageBundles = \u7BA1\u7406Bundles
-view_adminRoles_permissions_perm_manageContent = \u7BA1\u7406Content
-view_adminRoles_permissions_perm_manageEvents = \u7BA1\u7406\u4E8B\u4EF6
-view_adminRoles_permissions_perm_manageInventory = \u7BA1\u7406\u6E05\u5355
-view_adminRoles_permissions_perm_manageMeasurements = \u7BA1\u7406\u6307\u6807
-view_adminRoles_permissions_perm_manageRepositories = \u7BA1\u7406\u5E93
-view_adminRoles_permissions_perm_manageSecurity = \u7BA1\u7406\u6743\u9650
-view_adminRoles_permissions_perm_manageSettings = \u7BA1\u7406\u914D\u7F6E
-view_adminRoles_permissions_read = \u8BFB:
-view_adminRoles_permissions_readAccessImplied = \u9ED8\u8BA4\u6709\u8BBF\u95EE{0}\u7684\u6743\u9650\u800C\u4E14\u65E0\u6CD5\u7981\u7528.
-view_adminRoles_permissions_resourcePermissions = \u8D44\u6E90\u6388\u6743
-view_adminRoles_permissions_write = \u5199:
-view_adminRoles_perms = \u6743\u9650
-view_adminRoles_resourcePerms = \u8D44\u6E90\u6388\u6743
-view_adminRoles_roleAdded = \u89D2\u8272[{0}]\u6DFB\u52A0.
-view_adminRoles_roleDeleteFailed = \u5220\u9664\u89D2\u8272[{0}]\u5931\u8D25.
-view_adminRoles_roleDeleted = \u89D2\u8272[{0}]\u5220\u9664.
-view_adminRoles_roleUpdateFailed = \u4FEE\u6539\u89D2\u8272[{0}]\u5931\u8D25.
-view_adminRoles_roleUpdated = \u89D2\u8272[{0}]\u66F4\u65B0\u4E86.
-view_adminSecurity_roles = \u89D2\u8272
-view_adminSecurity_users = \u7528\u6237
-view_adminTemplates_disabledAlertTemplates = \u7981\u7528\u544A\u8B66\u6A21\u677F
-view_adminTemplates_disabledMetricTemplates = \u7981\u7528\u6307\u6807\u6A21\u677F
-view_adminTemplates_editAlertTemplate = \u7F16\u8F91\u544A\u8B66\u6A21\u677F
-view_adminTemplates_editMetricTemplate = \u7F16\u8F91\u6307\u6807\u6A21\u677F
-view_adminTemplates_enabledAlertTemplates = \u542F\u7528\u544A\u8B66\u6A21\u677F
-view_adminTemplates_enabledMetricTemplates = \u542F\u7528\u6307\u6807\u6A21\u677F
-view_adminTemplates_platformServices = \u5E73\u53F0\u670D\u52A1
-view_adminTemplates_platforms = \u5E73\u53F0
-view_adminTemplates_prompt_disabledAlertTemplates = \u8FD9\u79CD\u8D44\u6E90\u7C7B\u578B\u521B\u5EFA\u800C\u7981\u7528\u7684\u544A\u8B66\u6A21\u677F\u6570
-view_adminTemplates_prompt_disabledMetricTemplates = Number of metric schedules that are disabled by default on this resource type
-view_adminTemplates_prompt_enabledAlertTemplates = \u8FD9\u79CD\u8D44\u6E90\u7C7B\u578B\u542F\u7528\u7684\u544A\u8B66\u6A21\u677F\u6570
-view_adminTemplates_prompt_enabledMetricTemplates = Number of metric schedules that are enabled by default on this resource type
-view_adminTemplates_servers = \u670D\u52A1\u5668
-view_adminTopology_affinityGroups = \u76F8\u5173\u7EC4
-view_adminTopology_agents = \u4EE3\u7406
-view_adminTopology_partitionEvents = Partition\u4E8B\u4EF6
-view_adminTopology_remoteAgentInstall = \u8FDC\u7A0B\u4EE3\u7406\u5B89\u88C5
-view_adminTopology_servers = \u670D\u52A1\u5668
-view_adminUsersDetails_dataTypeName = user
-view_adminUsersList_dataTypeName = user
-view_adminUsersList_dataTypeNamePlural = users
-view_admin_administration = \u7BA1\u7406
-view_admin_configuration = \u914D\u7F6E
-view_admin_content = Content
-view_admin_downloads_agentDownload = \u4EE3\u7406\u4E0B\u8F7D
-view_admin_downloads_agent_buildNumber = \u4EE3\u7406Build
-view_admin_downloads_agent_help = <p> \u8FD9\u662FRHQ Agent\u66F4\u65B0\u7684\u4E8C\u8FDB\u5236jar\u6587\u4EF6. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>\u4EE3\u7406\u5B89\u88C5</h3> <p> <b>java -jar <agent-download.jar> --install[=<new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>\u4EE3\u7406\u66F4\u65B0</h3> <p> <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
-view_admin_downloads_agent_link_label = Link
-view_admin_downloads_agent_link_value = \u4E0B\u8F7D\u4EE3\u7406 {0} ({1})
-view_admin_downloads_agent_loadError = \u65E0\u6CD5\u83B7\u5F97\u4EE3\u7406\u7248\u672C\u4FE1\u606F
-view_admin_downloads_agent_md5 = \u4EE3\u7406MD5
-view_admin_downloads_agent_version = \u4EE3\u7406\u7248\u672C
-view_admin_downloads_bundleDownload = Bundle\u90E8\u7F72\u5668\u4E0B\u8F7D
-view_admin_downloads_bundle_help = <p> This is the Bundle Deployer tool. It is for use by developers and packagers of RHQ bundles. This standalone tool allows you to test your bundles and their recipes from a console. </p>
-view_admin_downloads_bundle_link_label = Link
-view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
-view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
-view_admin_downloads_cliDownload = \u547D\u4EE4\u884C\u5BA2\u6237\u7AEF\u4E0B\u8F7D
-view_admin_downloads_cli_buildNumber = CLI Build
-view_admin_downloads_cli_help = <p> This is the Command Line Client tool, otherwise known as the CLI. It is a standalone tool that runs from within a console and provides a command line interface to the RHQ Server. You can invoke commands via the CLI as well as run scripts to perform automated tasks. See the documentation for more information on how to install and use the CLI. </p>
-view_admin_downloads_cli_link_label = Link
-view_admin_downloads_cli_link_value = \u4E0B\u8F7DCLI {0} ({1})
-view_admin_downloads_cli_loadError = \u65E0\u6CD5\u83B7\u5F97CLI\u7248\u672C\u4FE1\u606F
-view_admin_downloads_cli_md5 = CLI MD5
-view_admin_downloads_cli_version = CLI\u7248\u672C
-view_admin_downloads_connectorsDownload = \u8FDE\u63A5\u5668\u4E0B\u8F7D
-view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
-view_admin_downloads_connectors_loadError = Cannot get connectors info
-view_admin_downloads_connectors_none = No connectors are available for download
-view_admin_landing = \u8FD9\u91CC\u4F60\u53EF\u4EE5\u7BA1\u7406RHQ\u5168\u5C40\u914D\u7F6E.\u5305\u62EC\u914D\u7F6E\u5B89\u5168,\u5B89\u88C5\u63D2\u4EF6,\u7BA1\u7406RHQ\u670D\u52A1\u5668\u548C\u4EE3\u7406.
-view_admin_measTemplates_title = Template Metric Collection Schedules
-view_admin_measTemplates_updateExisting_title = \u66F4\u65B0\u5B58\u5728\u7684\u8BA1\u5212\u4EFB\u52A1
-view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
-view_admin_security = \u5B89\u5168
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
-view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
-view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
-view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
-view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
-view_admin_systemSettings_BaseURL_name = GUI Console URL
-view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
-view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
-view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
-view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
-view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
-view_admin_systemSettings_DataMaintenance_name = \u6570\u636E\u5E93\u7EF4\u62A4\u671F\u95F4
-view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
-view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
-view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
-view_admin_systemSettings_EnableAgentAutoUpdate_name = \u542F\u7528\u4EE3\u7406\u81EA\u52A8\u5347\u7EA7
-view_admin_systemSettings_EnableDebugMode_desc = \u5982\u679C\u542F\u7528,\u670D\u52A1\u5668\u5C06\u8FDB\u5165debug\u6A21\u5F0F.
-view_admin_systemSettings_EnableDebugMode_name = \u542F\u7528Debug\u6A21\u5F0F
-view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
-view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
-view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_EventPurge_name = Delete Events Older Than
-view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
-view_admin_systemSettings_JAASProvider_name = \u542F\u7528LDAP
-view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou=People,dc=redhat,dc=com
-view_admin_systemSettings_LDAPBaseDN_name = Search Base
-view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn=Manager,dc=redhat,dc=com
-view_admin_systemSettings_LDAPBindDN_name = \u7528\u6237\u540D
-view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
-view_admin_systemSettings_LDAPBindPW_name = \u5BC6\u7801
-view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser=true
-view_admin_systemSettings_LDAPFilter_name = Search Filter
-view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
-view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
-view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
-view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
-view_admin_systemSettings_LDAPLoginProperty_name = Login Property
-view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
-view_admin_systemSettings_LDAPProtocol_name = SSL
-view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
-view_admin_systemSettings_LDAPUrl_name = LDAP URL
-view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
-view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
-view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
-view_admin_systemSettings_cannotLoadServerDetails = \u65E0\u6CD5\u52A0\u8F7D\u670D\u52A1\u5668\u8BE6\u60C5
-view_admin_systemSettings_cannotLoadSettings = \u65E0\u6CD5\u83B7\u5F97\u5F53\u524D\u7CFB\u7EDF\u914D\u7F6E
-view_admin_systemSettings_fixBeforeSaving = \u4FDD\u5B58\u524D\u8BF7\u4FEE\u590D\u9519\u8BEF
-view_admin_systemSettings_group_baseline = \u81EA\u52A8Baseline\u914D\u7F6E\u5C5E\u6027
-view_admin_systemSettings_group_dataMgr = \u6570\u636E\u7BA1\u7406\u5668\u57FA\u672C\u5C5E\u6027
-view_admin_systemSettings_group_general = \u57FA\u672C\u914D\u7F6E\u5C5E\u6027
-view_admin_systemSettings_group_ldap = LDAP\u914D\u7F6E\u5C5E\u6027
-view_admin_systemSettings_saveFailure = \u4FDD\u5B58\u7CFB\u7EDF\u5C5E\u6027\u5931\u8D25
-view_admin_systemSettings_savedSettings = \u4FDD\u5B58\u7CFB\u7EDF\u5C5E\u6027\u6210\u529F
-view_admin_systemSettings_serverDetails = \u670D\u52A1\u5668\u8BE6\u60C5
-view_admin_systemSettings_serverDetails_buildNumber = Build Number
-view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
-view_admin_systemSettings_serverDetails_dbDriverName = \u6570\u636E\u5E93\u9A71\u52A8\u540D
-view_admin_systemSettings_serverDetails_dbDriverVersion = \u6570\u636E\u5E93\u9A71\u52A8\u7248\u672C
-view_admin_systemSettings_serverDetails_dbName = \u6570\u636E\u5E93\u4EA7\u54C1\u540D
-view_admin_systemSettings_serverDetails_dbUrl = \u6570\u636E\u5E93\u8FDE\u63A5URL
-view_admin_systemSettings_serverDetails_dbVersion = \u6570\u636E\u5E93\u7248\u672C\u4FE1\u606F
-view_admin_systemSettings_serverDetails_installDir = \u670D\u52A1\u5668\u5B89\u88C5\u76EE\u5F55
-view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
-view_admin_systemSettings_serverDetails_time = \u670D\u52A1\u5668\u672C\u5730\u65F6\u95F4
-view_admin_systemSettings_serverDetails_tz = \u670D\u52A1\u5668\u65F6\u533A
-view_admin_topology = \u62D3\u6251
-view_alert_common_tab_conditions = Conditions
-view_alert_common_tab_conditions_expression = \u89E6\u53D1\u4E8B\u4EF6\u5F53
-view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
-view_alert_common_tab_conditions_modal_title = \u6DFB\u52A0\u6761\u4EF6
-view_alert_common_tab_conditions_recovery_disabled = This alert caused its alert definition to be disabled
-view_alert_common_tab_conditions_recovery_enabled = Triggered ''{0}'' to be re-enabled
-view_alert_common_tab_conditions_text = \u6761\u4EF6
-view_alert_common_tab_conditions_type_availability = \u53EF\u7528\u6027\u6539\u53D8
-view_alert_common_tab_conditions_type_availability_down = Went down
-view_alert_common_tab_conditions_type_availability_up = Came up
-view_alert_common_tab_conditions_type_event = \u4E8B\u4EF6\u68C0\u6D4B
-view_alert_common_tab_conditions_type_event_matching = with event source matching
-view_alert_common_tab_conditions_type_metric_baseline = \u6307\u6807\u57FA\u51C6
-view_alert_common_tab_conditions_type_metric_baseline_verb = of
-view_alert_common_tab_conditions_type_metric_calltime_change = Call Time Value Changes
-view_alert_common_tab_conditions_type_metric_calltime_change_verb = by at least
-view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Grows
-view_alert_common_tab_conditions_type_metric_calltime_delta_other = Changes
-view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
-view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
-view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
-view_alert_common_tab_conditions_type_metric_change = Metric Value Change
-view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
-view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
-view_alert_common_tab_conditions_type_operation = \u64CD\u4F5C\u6267\u884C
-view_alert_common_tab_conditions_type_operation_status = with result status
-view_alert_common_tab_conditions_type_resource_configuration = \u8D44\u6E90\u914D\u7F6E Change
-view_alert_common_tab_conditions_value = Value
-view_alert_common_tab_dampening = Dampening
-view_alert_common_tab_dampening_category_consecutive_count = Consecutive
-view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
-view_alert_common_tab_dampening_category_duration_count = Time Period
-view_alert_common_tab_dampening_category_duration_count_tooltip = An alert is triggered once every X occurrences the condition set is true within a given time period.
-view_alert_common_tab_dampening_category_none = None
-view_alert_common_tab_dampening_category_none_tooltip = Dampening is disabled. Every time the condition set is true, an alert will be triggered.
-view_alert_common_tab_dampening_category_partial_count = Last N Evaluations
-view_alert_common_tab_dampening_category_partial_count_tooltip = An alert is triggered once every X occurrences the condition set is true during the last N evaluations of the condition set.
-view_alert_common_tab_dampening_consecutive_occurrences_label = Occurrences
-view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = The number of times the condition set must be consecutively true before the alert is triggered
-view_alert_common_tab_dampening_duration_occurrences_label = Occurrences
-view_alert_common_tab_dampening_duration_occurrences_label_tooltip = The number of times the condition set must be true during the given time period before the alert is triggered.
-view_alert_common_tab_dampening_duration_period_label = \u65F6\u95F4\u6BB5
-view_alert_common_tab_dampening_duration_period_label_tooltip = The time span in which the condition set will be tested to see if the given number of occurrences are true.
-view_alert_common_tab_dampening_partial_evalatuions_label = \u8BC4\u4F30
-view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = The total number of times the condition set will be tested to see if the given number of occurrences are true.
-view_alert_common_tab_dampening_partial_occurrences_label = Occurrences
-view_alert_common_tab_dampening_partial_occurrences_label_tooltip = The number of times the condition set must be true during the last N evaluations before the alert is triggered.
-view_alert_common_tab_general = \u57FA\u672C\u5C5E\u6027
-view_alert_common_tab_invalid_condition_category = Invalid condition category - please report this as a bug: {0}
-view_alert_common_tab_invalid_dampening_category = Invalid dampening category - please report this as a bug: {0}
-view_alert_common_tab_invalid_time_units = \u65E0\u6548\u65F6\u95F4\u5355\u4F4D - \u8BF7\u62A5\u544Abug: {0}
-view_alert_common_tab_notifications = \u901A\u77E5
-view_alert_common_tab_notifications_message = \u6D88\u606F
-view_alert_common_tab_notifications_sender = Sender
-view_alert_common_tab_notifications_status = \u72B6\u6001
-view_alert_common_tab_recovery = \u8FD8\u539F
-view_alert_definition_condition_editor_avilability_option_down = Goes down
-view_alert_definition_condition_editor_avilability_option_up = Comes up
-view_alert_definition_condition_editor_avilability_tooltip = Specify the availability state change that will trigger the condition.
-view_alert_definition_condition_editor_avilability_value = \u53EF\u7528\u6027
-view_alert_definition_condition_editor_common_avg = Average
-view_alert_definition_condition_editor_common_max = Maximum
-view_alert_definition_condition_editor_common_min = Minimum
-view_alert_definition_condition_editor_delete_confirm = \u5220\u9664\u9009\u5B9A\u7684\u8B66\u62A5\u6761\u4EF6?
-view_alert_definition_condition_editor_event_regex = \u6B63\u5219\u8868\u8FBE\u5F0F
-view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
-view_alert_definition_condition_editor_event_severity = Event Severity
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
-view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
-view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
-view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
-view_alert_definition_condition_editor_metric_baseline_tooltip = Specify the baseline value that must be violated to trigger the condition. The value you specify is a percentage of the given baseline value.
-view_alert_definition_condition_editor_metric_baseline_value = Baseline
-view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentage Change
-view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = A collected calltime value will trigger this condition when it differs by at least this percentage of the selected calltime limit value
-view_alert_definition_condition_editor_metric_calltime_change_tooltip = Specify the calltime value that, when changed at least a specified amount, triggers the condition. You must specify which calltime limit to check (minimum, maximum or average calltime value) and the percentage of change that must occur.
-view_alert_definition_condition_editor_metric_calltime_common_comparator = Comparator
-view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Changes
-view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Grows
-view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Shrinks
-view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = How a collected calltime value should be compared to the given calltime limit
-view_alert_definition_condition_editor_metric_calltime_common_limit = Call Time Limit
-view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = The calltime limit value that is to be compared with the given value
-view_alert_definition_condition_editor_metric_calltime_common_name = Call Time Metric
-view_alert_definition_condition_editor_metric_calltime_common_regex = \u6B63\u5219\u8868\u8FBE\u5F0F
-view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = If specified, this is a regular expression that must match a call destination in order to trigger the condition.
-view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Specify the calltime threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier. You also must specify which calltime limit to compare the value with (minimum, maximum or average calltime value).
-view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Time Value
-view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
-view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
-view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
-view_alert_definition_condition_editor_metric_threshold_comparator_equal = \u7B49\u4E8E
-view_alert_definition_condition_editor_metric_threshold_comparator_greater = \u5927\u4E8E
-view_alert_definition_condition_editor_metric_threshold_comparator_less = \u5C0F\u4E8E
-view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = How a collected metric value should be compared to the given threshold value
-view_alert_definition_condition_editor_metric_threshold_name = \u6307\u6807
-view_alert_definition_condition_editor_metric_threshold_tooltip = Specify the threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier.
-view_alert_definition_condition_editor_metric_threshold_value = \u6307\u6807\u503C
-view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
-view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
-view_alert_definition_condition_editor_metric_trait_change_value = Trait
-view_alert_definition_condition_editor_operation_status = \u64CD\u4F5C\u72B6\u6001
-view_alert_definition_condition_editor_operation_status_canceled = Canceled
-view_alert_definition_condition_editor_operation_status_failure = Failure
-view_alert_definition_condition_editor_operation_status_inprogress = \u8FDB\u884C\u4E2D
-view_alert_definition_condition_editor_operation_status_success = Success
-view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
-view_alert_definition_condition_editor_operation_value = \u64CD\u4F5C
-view_alert_definition_condition_editor_option_availability = Availability Change
-view_alert_definition_condition_editor_option_event = \u4E8B\u4EF6\u68C0\u6D4B
-view_alert_definition_condition_editor_option_label = Condition Type
-view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
-view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
-view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
-view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
-view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
-view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
-view_alert_definition_condition_editor_option_operation = Operation Execution
-view_alert_definition_condition_editor_option_resource_configuration = \u8D44\u6E90\u914D\u7F6E\u6539\u53D8
-view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
-view_alert_definition_for_group = \u67E5\u770B\u7EC4\u5B9A\u4E49
-view_alert_definition_for_type = \u67E5\u770B\u6A21\u677F
-view_alert_definition_notification_cliScript_editor_anotherUser = \u5176\u4ED6\u7528\u6237
-view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
-view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
-view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
-view_alert_definition_notification_cliScript_editor_repository = Repository
-view_alert_definition_notification_cliScript_editor_script = Script
-view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
-view_alert_definition_notification_cliScript_editor_selectRepoFirst = \u9996\u5148\u9009\u62E9\u5E93.
-view_alert_definition_notification_cliScript_editor_thisUser = Myself
-view_alert_definition_notification_cliScript_editor_uploadNewScript = \u4E0A\u4F20\u65B0\u811A\u672C
-view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
-view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
-view_alert_definition_notification_editor_delete_confirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u9009\u5B9A\u7684\u544A\u8B66\u901A\u77E5?
-view_alert_definition_notification_editor_field_configuration = \u914D\u7F6E
-view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
-view_alert_definition_notification_editor_field_configuration_not_loaded = Unknown
-view_alert_definition_notification_editor_field_sender = Sender
-view_alert_definition_notification_editor_loadFailed = Cannot get alert senders
-view_alert_definition_notification_editor_loadFailed_single = Cannot get alert sender configuration definition
-view_alert_definition_notification_editor_none_available = No alert senders available
-view_alert_definition_notification_editor_saveFailed = Cannot save the notification configuration
-view_alert_definition_notification_editor_sender = \u901A\u77E5\u53D1\u9001\u8005
-view_alert_definition_notification_editor_title_add = \u6DFB\u52A0\u901A\u77E5
-view_alert_definition_notification_editor_title_edit = \u7F16\u8F91\u901A\u77E5
-view_alert_definition_notification_operation_editor_common_operation = \u64CD\u4F5C
-view_alert_definition_notification_operation_editor_mode_relative = \u76F8\u5173\u8D44\u6E90
-view_alert_definition_notification_operation_editor_mode_specific = \u6307\u5B9A\u8D44\u6E90
-view_alert_definition_notification_operation_editor_mode_this = \u8FD9\u4E2A\u8D44\u6E90
-view_alert_definition_notification_operation_editor_mode_title = \u8D44\u6E90\u9009\u62E9\u6A21\u5F0F
-view_alert_definition_notification_operation_editor_mode_unknown = UNKNOWN OPTION - THIS IS A BUG
-view_alert_definition_notification_operation_editor_operations_loadFailed = Failed to load the list of available operations
-view_alert_definition_notification_operation_editor_operations_no_parameters = This operation does not take any parameters
-view_alert_definition_notification_operation_editor_relative_ancestor = Start Search From
-view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = Cannot get type ancestry
-view_alert_definition_notification_operation_editor_relative_ancestor_root = Root Ancestor Type
-view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Select the top of the type hierarchy from which to search its descendant tree for the Filter By type
-view_alert_definition_notification_operation_editor_relative_descendant = Then Filter By
-view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = A specific name to uniquely identify a resource when more than one resource of the selected type might exist. This is optional if there will only ever be one resource of the resource type in the selected type hierarchy.
-view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = Cannot get type descendants
-view_alert_definition_notification_operation_editor_relative_descendant_tooltip = The resource type to search for under the root type defined in the Start Search From selection.
-view_alert_definition_notification_operation_editor_specific_pick_button = Pick
-view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Please pick a resource
-view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Please pick a resource that has one or more operations
-view_alert_definition_notification_operation_editor_specific_pick_text = Pick a resource...
-view_alert_definition_notification_operation_editor_specific_resource = \u8D44\u6E90
-view_alert_definition_notification_role_editor_loadFailed = Cannot determine current roles - starting empty
-view_alert_definition_notification_role_editor_restoreFailed = Cannot use current roles - starting empty
-view_alert_definition_notification_role_editor_saveFailed = Cannot save the selected roles
-view_alert_definition_notification_user_editor_loadFailed = Cannot determine current users - starting empty
-view_alert_definition_notification_user_editor_restoreFailed = Cannot use current users - starting empty
-view_alert_definition_notification_user_editor_saveFailed = Cannot save the selected users
-view_alert_definition_recovery_editor_disable_when_fired = Disable When Fired
-view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indicates if this alert will be disabled after it fires. Once disabled, the alert can be manually re-enabled or a recovery alert can be set up to automatically re-enable it. If this alert is a recovery alert itself, this setting cannot be turned on.
-view_alert_definition_recovery_editor_loadFailed = Cannot build recovery menu
-view_alert_definition_recovery_editor_none_available = None
-view_alert_definition_recovery_editor_recovery_alert = Recover Alert
-view_alert_definition_recovery_editor_recovery_alert_tooltip = The target alert that will be recovered (i.e. re-enabled) after this alert triggers. Do not select an alert here if you are not defining a recovery alert.
-view_alert_definitions_create_failure = Alert definition creation failed
-view_alert_definitions_create_success = Alert definition successfully created
-view_alert_definitions_delete_confirm = Delete the selected alert definition(s)?
-view_alert_definitions_delete_failure = Failed to deleted the selected alert definitions
-view_alert_definitions_delete_success = Successfully deleted {0} alert definitions
-view_alert_definitions_disable_confirm = Disable the selected alert definition(s)?
-view_alert_definitions_disable_failure = Failed to disable the selected alert definitions
-view_alert_definitions_disable_success = Successfully disabled {0} alert definitions
-view_alert_definitions_enable_confirm = Enable the selected alert definition(s)?
-view_alert_definitions_enable_failure = Failed to enable the selected alert definitions
-view_alert_definitions_enable_success = Successfully enabled {0} alert definitions
-view_alert_definitions_loadFailed = Failed to fetch alert definition data
-view_alert_definitions_loadFailed_single = Failed to fetch data for alert definition with id {0}
-view_alert_definitions_table_title_group = \u7EC4\u544A\u8B66\u5B9A\u4E49
-view_alert_definitions_table_title_resource = \u7EC4\u544A\u8B66\u5B9A\u4E49
-view_alert_definitions_update_failure = \u544A\u8B66\u5B9A\u4E49\u66F4\u65B0\u5931\u8D25
-view_alert_definitions_update_success = \u544A\u8B66\u5B9A\u4E49\u66F4\u65B0\u6210\u529F
-view_alert_details_field_ack_at = \u786E\u8BA4\u4E8E
-view_alert_details_field_ack_by = \u786E\u8BA4\u8005
-view_alert_details_field_recovery_info = \u8FD8\u539F\u4FE1\u606F
-view_alert_details_loadFailed = \u53D6\u5F97\u544A\u8B66\u8BE6\u60C5\u5931\u8D25
-view_alerts_ack_confirm = Acknowledge the selected alert(s)?
-view_alerts_ack_confirm_all = Acknowledge all alerts from this source?
-view_alerts_ack_failure = Failed to acknowledge alerts with id''s: {0}
-view_alerts_ack_failure_all = Failed to acknowledge all alerts from this source
-view_alerts_ack_success = Successfully acknowledged {0} alerts
-view_alerts_delete_confirm = Delete the selected alert(s)?
-view_alerts_delete_confirm_all = Delete all alerts from this source?
-view_alerts_delete_failure = Failed to delete alerts with id''s: {0}
-view_alerts_delete_failure_all = Failed to delete all alerts from this source
-view_alerts_delete_success = Successfully deleted {0} alerts
-view_alerts_field_ack_status = \u72B6\u6001
-view_alerts_field_ack_status_ack = Ack ({0})
-view_alerts_field_ack_status_ackHover = \u786E\u8BA4\u8005{0}\u4E8E{1}
-view_alerts_field_ack_status_noAck = No Ack
-view_alerts_field_ack_status_noAckHover = \u8FD8\u6CA1\u786E\u8BA4\u7684
-view_alerts_field_ack_subject = Acknowledge Subject
-view_alerts_field_ack_time = \u786E\u8BA4\u65F6\u95F4
-view_alerts_field_condition_text = Condition Text
-view_alerts_field_condition_text_many = Multiple Conditions
-view_alerts_field_condition_text_none = No Conditions
-view_alerts_field_condition_value = Condition Value
-view_alerts_field_created_time = \u4EA7\u751F\u65F6\u95F4
-view_alerts_field_enabled = \u542F\u7528
-view_alerts_field_modified_time = \u4FEE\u6539\u65F6\u95F4
-view_alerts_field_name = Name
-view_alerts_field_parent = \u7236
-view_alerts_field_priority = \u4F18\u5148\u7EA7
-view_alerts_field_protected = Protected
-view_alerts_field_protected_tooltip = If true, this definition is protected from being changed by the parent definition. In other words, the parent definition settings will not override this definition.
-view_alerts_loadFailed = Failed to fetch alerts data
-view_alerts_table_filter_priority = \u4F18\u5148\u7EA7\u8FC7\u6EE4
-view_alerts_table_title_group = \u7EC4\u544A\u8B66\u5386\u53F2
-view_alerts_table_title_resource = \u8D44\u6E90\u544A\u8B66\u5386\u53F2
-view_autoDiscoveryQ_committed = Committed
-view_autoDiscoveryQ_confirmSelect = \u662F\u5426\u9009\u4E2D\u5B50\u8282\u70B9\uFF1F
-view_autoDiscoveryQ_deleted = Deleted
-view_autoDiscoveryQ_field_discoveryTime = \u53D1\u73B0\u65F6\u95F4
-view_autoDiscoveryQ_field_inventoryStatus = \u6E05\u5355\u72B6\u6001
-view_autoDiscoveryQ_field_key = \u8D44\u6E90Key
-view_autoDiscoveryQ_field_name = \u8D44\u6E90\u540D\u79F0
-view_autoDiscoveryQ_field_parentId = \u7236ID
-view_autoDiscoveryQ_ignore = \u5FFD\u7565
-view_autoDiscoveryQ_ignoreFailure = Failed to ignore resources
-view_autoDiscoveryQ_ignoreSuccessful = \u6210\u529F\u5FFD\u7565\u9009\u5B9A\u8D44\u6E90.
-view_autoDiscoveryQ_ignored = Ignored
-view_autoDiscoveryQ_import = \u5BFC\u5165
-view_autoDiscoveryQ_importFailure = \u5BFC\u5165\u8D44\u6E90\u5931\u8D25
-view_autoDiscoveryQ_importSuccessful = \u6210\u529F\u5BFC\u5165\u88AB\u9009\u8D44\u6E90.
-view_autoDiscoveryQ_loadFailure = \u52A0\u8F7D\u8D44\u6E90\u6E05\u5355\u53D1\u73B0\u961F\u5217\u5931\u8D25
-view_autoDiscoveryQ_new = New
-view_autoDiscoveryQ_newAndIgnored = New and Ignored
-view_autoDiscoveryQ_noItems = \u65E0\u6761\u76EE\u663E\u793A
-view_autoDiscoveryQ_noperm = (\u60A8\u6CA1\u6709\u6743\u9650\u67E5\u770B\u81EA\u52A8\u53D1\u73B0\u961F\u5217)
-view_autoDiscoveryQ_showStatus = \u663E\u793A\u72B6\u6001
-view_autoDiscoveryQ_title = \u81EA\u52A8\u53D1\u73B0\u961F\u5217
-view_autoDiscoveryQ_unignore = Unignore
-view_autoDiscoveryQ_unignoreFailure = Failed to unignore resources
-view_autoDiscoveryQ_unignoreSuccessful = \u6210\u529F\u4F7F\u9009\u4E2D\u7684\u8D44\u6E90\u751F\u6548.
-view_autoDiscoveryQ_uninventoried = Uninventoried
-view_bundleVersion_loadFailure = Failed to load bundle version data
-view_bundle_bundle = Bundle
-view_bundle_bundleDeployment = Bundle\u53D1\u5E03
-view_bundle_bundleDeployments = Bundle\u53D1\u5E03
-view_bundle_bundleDestinations = Bundle\u76EE\u7684\u5730
-view_bundle_bundleFiles = Bundle\u6587\u4EF6
-view_bundle_bundleType = Bundle\u7C7B\u578B
-view_bundle_bundleVersion = Bundle\u7248\u672C
-view_bundle_bundleVersions = Bundle\u7248\u672C
-view_bundle_bundles = Bundles
-view_bundle_createWizard_bundleDistro = Bundle Distribution
-view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database
-view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
-view_bundle_createWizard_clickToUploadRecipe = Click to load a recipe file
-view_bundle_createWizard_createFailure = \u521B\u5EFAbundle\u5931\u8D25
-view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]
-view_bundle_createWizard_enterRecipe = Please supply a valid recipe
-view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
-view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file
-view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file
-view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server
-view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle
-view_bundle_createWizard_noBundleTypesAvail = No bundle types are available
-view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments
-view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
-view_bundle_createWizard_recipeOption = Recipe
-view_bundle_createWizard_title = \u521B\u5EFABundle
-view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files
-view_bundle_createWizard_uploadOption = \u4E0A\u4F20
-view_bundle_createWizard_uploadStepName = Upload Bundle Files
-view_bundle_createWizard_urlOption = URL
-view_bundle_createWizard_windowTitle = Bundle\u521B\u5EFA\u5411\u5BFC
-view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
-view_bundle_deleteConfirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2Abundle? \u8FD9\u4E2Abundle\u6240\u6709\u7684\u7248\u672C, \u76EE\u7684\u5730\u548C\u90E8\u7F72\u5C06\u88AB\u5220\u9664.
-view_bundle_deploy = \u53D1\u5E03
-view_bundle_deployDir = \u53D1\u5E03\u76EE\u5F55
-view_bundle_deployWizard_deployStep = \u53D1\u5E03Bundle\u5230\u76EE\u7684\u5E73\u53F0
-view_bundle_deployWizard_deploying = \u53D1\u5E03\u4E2D...
-view_bundle_deployWizard_deploymentCreated = \u521B\u5EFA\u90E8\u7F72...
-view_bundle_deployWizard_deploymentCreatedDetail = You have created the deployment [{0}] with the description [{1}]
-view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
-view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!
-view_bundle_deployWizard_deploymentScheduledDetail = You have scheduled the bundle deployment [{0}] to the destination group [{1}]
-view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
-view_bundle_deployWizard_destinationCreatedDetail = You have created the destination [{0}] with the description [{1}]
-view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
-view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel
-view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)
-view_bundle_deployWizard_error_11 = Failed to find defined deployments.
-view_bundle_deployWizard_error_12 = Failed to find defined bundles.
-view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel
-view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!
-view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}
-view_bundle_deployWizard_error_5 = \u521B\u5EFA\u53D1\u5E03\u5931\u8D25!
-view_bundle_deployWizard_error_6 = \u521B\u5EFA\u53D1\u5E03\u5931\u8D25: {0}
-view_bundle_deployWizard_error_7 = Failed to get deployment name.
-view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
-view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
-view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
-view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
-view_bundle_deployWizard_getDestStep = \u65B0\u5EFA\u76EE\u7684\u5730
-view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
-view_bundle_deployWizard_getDest_desc = \u76EE\u7684\u5730\u63CF\u8FF0
-view_bundle_deployWizard_getDest_name = \u76EE\u7684\u5730\u540D
-view_bundle_deployWizard_getInfoStep = \u63D0\u4F9B\u53D1\u5E03\u4FE1\u606F
-view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
-view_bundle_deployWizard_getInfo_deploymentDesc = \u53D1\u5E03\u63CF\u8FF0
-view_bundle_deployWizard_getInfo_deploymentName = \u53D1\u5E03\u540D\u79F0
-view_bundle_deployWizard_getOptionsStep = \u53D1\u5E03\u9009\u9879
-view_bundle_deployWizard_getOptions_deployLater = \u7A0D\u5019\u53D1\u5E03
-view_bundle_deployWizard_getOptions_deployNow = \u9A6C\u4E0A\u53D1\u5E03
-view_bundle_deployWizard_getOptions_deployTime = \u53D1\u5E03\u65F6\u95F4
-view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle
-view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.
-view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version
-view_bundle_deployWizard_selectVersion_latest = \u6700\u65B0\u7248\u672C [{0}]
-view_bundle_deployWizard_selectVersion_live = Live Version [{0}]
-view_bundle_deployWizard_selectVersion_select = Select Version from List:
-view_bundle_deployWizard_title = Bundle\u53D1\u5E03\u5411\u5BFC
-view_bundle_deploy_action = \u64CD\u4F5C
-view_bundle_deploy_backButton = \u8FD4\u56DE
-view_bundle_deploy_clickForError = Click the icon for the error message
-view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
-view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
-view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
-view_bundle_deploy_deployedBy = \u53D1\u5E03\u8005
-view_bundle_deploy_deploymentPlatforms = \u53D1\u5E03\u5E73\u53F0
-view_bundle_deploy_installDetails = \u5B89\u88C5\u7EC6\u8282
-view_bundle_deploy_loadBundleFailure = \u67E5\u627Ebundle\u5931\u8D25
-view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
-view_bundle_deploy_loadFailure = Failed to load bundle deployment
-view_bundle_deploy_name = \u53D1\u5E03\u540D
-view_bundle_deploy_operatingSystem = \u64CD\u4F5C\u7CFB\u7EDF
-view_bundle_deploy_selectARow = \u9009\u4E2D\u884C\u663E\u793A\u5B89\u88C5\u7EC6\u8282
-view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
-view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
-view_bundle_deploy_time = \u53D1\u5E03\u65F6\u95F4
-view_bundle_deployed = \u5DF2\u53D1\u5E03
-view_bundle_deployments = \u53D1\u5E03
-view_bundle_dest_backToBundle = \u8FD4\u56DEBundle
-view_bundle_dest_created = \u5DF2\u521B\u5EFA
-view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
-view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
-view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
-view_bundle_dest_deployDir = \u53D1\u5E03\u76EE\u5F55
-view_bundle_dest_group = \u7EC4
-view_bundle_dest_lastDeployedVersion = \u4E0A\u6B21\u53D1\u5E03\u7248\u672C
-view_bundle_dest_lastDeploymentDate = \u4E0A\u6B21\u53D1\u5E03\u65E5\u671F
-view_bundle_dest_lastDeploymentStatus = \u4E0A\u6B21\u53D1\u5E03\u72B6\u6001
-view_bundle_dest_loadFailure = \u52A0\u8F7Dbundle\u76EE\u7684\u5730\u5931\u8D25
-view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information
-view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
-view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
-view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
-view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
-view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
-view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
-view_bundle_destinations = \u76EE\u7684\u5730
-view_bundle_fileListView_fileSize = \u6587\u4EF6\u5927\u5C0F
-view_bundle_fileListView_loadFailure = \u52A0\u8F7Dbundle\u6587\u4EF6\u5931\u8D25
-view_bundle_fileListView_md5 = MD5
-view_bundle_fileListView_sha256 = SHA256
-view_bundle_files = \u6587\u4EF6
-view_bundle_latestVersion = \u6700\u65B0\u7248\u672C
-view_bundle_list_backToAll = \u8FD4\u56DE\u6240\u6709Bundles
-view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
-view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
-view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
-view_bundle_list_deletesFailure = Failed to delete the bundles
-view_bundle_list_deletesSuccessful = You successfully deleted the bundles
-view_bundle_list_destinationsCount = Destinations Count
-view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
-view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
-view_bundle_list_error3 = \u52A0\u8F7Dbundle\u5931\u8D25
-view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]
-view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data
-view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]
-view_bundle_list_tagUpdateFailure = \u66F4\u65B0bundle\u6807\u8BB0\u5931\u8D25
-view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
-view_bundle_list_versionsCount = \u7248\u672C\u6570\u91CF
-view_bundle_purge = \u6E05\u9664
-view_bundle_recipe = Recipe
-view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
-view_bundle_revert = \u8FD8\u539F
-view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...
-view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
-view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
-view_bundle_revertWizard_confirmStep_name = \u53D1\u5E03\u8FD8\u539F\u786E\u8BA4
-view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
-view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
-view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
-view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
-view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment
-view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
-view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
-view_bundle_revertWizard_getInfoStep_name = \u63D0\u4F9B\u8FD8\u539F\u4FE1\u606F
-view_bundle_revertWizard_getInfoStep_revertDeployDesc = \u90E8\u7F72\u8FD8\u539F\u63CF\u8FF0
-view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\\n\\n[REVERT To]\\n{1}
-view_bundle_revertWizard_getInfoStep_revertDeployName = \u90E8\u7F72\u8FD8\u539F\u540D\u79F0
-view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms
-view_bundle_revertWizard_revertStep_reverting = \u8FD8\u539F\u4E2D...
-view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!
-view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]
-view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!
-view_bundle_revertWizard_title = Bundle\u8FD8\u539F
-view_bundle_revertWizard_windowTitle = Bundle\u8FD8\u539F\u5411\u5BFC
-view_bundle_tree_loadFailure = \u52A0\u8F7Dbundle\u6570\u636E\u5931\u8D25
-view_bundle_version_backToBundle = \u8FD4\u56DEBundle
-view_bundle_version_bundleVersionTagUpdateFailure = \u66F4\u65B0bundle\u7248\u672C\u6807\u8BB0\u5931\u8D25
-view_bundle_version_bundleVersionTagUpdateSuccessful = \u66F4\u65B0bundle\u7248\u672C\u6807\u8BB0\u6210\u529F
-view_bundle_version_deleteConfirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664bundle\u7248\u672C?
-view_bundle_version_deleteFailure = \u5220\u9664bundle\u7248\u672C[{0}]\u5931\u8D25
-view_bundle_version_deleteSuccessful = \u5220\u9664bundle\u7248\u672C[{0}]\u6210\u529F
-view_bundle_version_loadFailure = \u52A0\u8F7Dbundle\u7248\u672C\u5931\u8D25
-view_bundle_versions = \u7248\u672C
-view_configCompare_comparingConfigs = \u6BD4\u8F83\u8BBE\u7F6E
-view_configCompare_configCompare = \u914D\u7F6E\u6BD4\u8F83\u7ED3\u679C\u96C6
-view_configEdit_addItem = \u6DFB\u52A0\u6761\u76EE\u81F3\u5217\u8868.
-view_configEdit_confirm_1 = \u786E\u5B9A\u8981\u4ECE\u96C6\u5408\u4E2D\u5220\u9664\u6307\u5B9A\u7684\u5C5E\u6027?
-view_configEdit_confirm_2 = \u786E\u5B9A\u8981\u5220\u9664\u8BE5\u884C?
-view_configEdit_confirm_3 = \u786E\u5B9A\u8981\u5220\u9664 [{0}]\u9879\u9009\u4E2D\u7684 [{1}]?
-view_configEdit_editRow = \u7F16\u8F91\u884C
-view_configEdit_enterPropName = \u8F93\u5165\u8981\u6DFB\u52A0\u7684\u5C5E\u6027\u540D\u79F0.
-view_configEdit_error_1 = \u6B64\u8D44\u6E90\u65E0\u6CD5\u914D\u7F6E.
-view_configEdit_error_2 = \u6B64\u8D44\u6E90\u65E0\u6CD5\u8FDB\u884C\u8FDE\u63A5\u8BBE\u7F6E.
-view_configEdit_error_3 = \u65E0\u6CD5\u6DFB\u52A0\u540D\u4E3A[{0}]\u7684\u5C5E\u6027. \u5C5E\u6027\u540D\u5728\u96C6\u5408\u4E2D\u5DF2\u7ECF\u88AB\u4F7F\u7528.
-view_configEdit_files = \u6587\u4EF6
-view_configEdit_hideAll = \u9690\u85CF\u6240\u6709
-view_configEdit_jumpToSection = \u8DF3\u81F3\u6A21\u5757
-view_configEdit_msg_1 = \u589E\u52A0\u5C5E\u6027 [{0}]\u5230\u96C6\u5408.
-view_configEdit_msg_2 = \u79FB\u9664\u96C6\u5408\u5185\u6240\u6709\u7684\u5C5E\u6027.
-view_configEdit_msg_3 = \u4ECE\u5217\u8868\u4E2D\u5220\u9664[{0} {1}]\u6210\u529F.
-view_configEdit_msg_4 = \u6DFB\u52A0\u6761\u76EE\u81F3\u5217\u8868.
-view_configEdit_properties = \u5C5E\u6027
-view_configEdit_tooltip_1 = \u4ECE\u5217\u8868\u4E2D\u5220\u9664\u9009\u4E2D\u7684\u6761\u76EE.
-view_configEdit_tooltip_2 = \u6DFB\u52A0\u4E00\u9879\u6761\u76EE\u5230\u5217\u8868.
-view_configEdit_viewRow = \u67E5\u770B\u884C
-view_configurationDetails_allPropertiesValid = \u6240\u6709\u7684\u914D\u7F6E\u4FE1\u606F\u5DF2\u7ECF\u586B\u5199\u4E86\u6709\u6548\u7684\u503C, \u73B0\u5728\u4FDD\u5B58\u914D\u7F6E.
-view_configurationDetails_configNotUpdatedDueToNoChange = \u7531\u4E8E\u65B0\u65E7\u914D\u7F6E\u4E00\u81F4\uFF0C\u6240\u4EE5\u914D\u7F6E\u6CA1\u6709\u66F4\u65B0.
-view_configurationDetails_error_updateFailure = \u66F4\u65B0\u914D\u7F6E\u5931\u8D25.
-view_configurationDetails_messageConcise = \u914D\u7F6E\u66F4\u65B0\u6210\u529F - \u76EE\u524D\u7248\u672C\u662F {0}.
-view_configurationDetails_messageDetailed = \u8D44\u6E90 [{1}]\u7684\u914D\u7F6E\u7248\u672C\u66F4\u65B0\u5230 {0} .
-view_configurationDetails_noPermission = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u6B64\u8D44\u6E90\u7684\u914D\u7F6E\u4FE1\u606F.
-view_configurationDetails_somePropertiesInvalid = \u4E0B\u9762\u7684\u914D\u7F6E\u4FE1\u606F\u586B\u5199\u4E86\u975E\u6CD5\u7684\u503C: {0}. \u5FC5\u987B\u4FEE\u6539\u6B64\u4FE1\u606F\u4EE5\u4FBF\u4FDD\u5B58\u6B64\u914D\u7F6E.
-view_configurationHistoryDetails_error_loadFailure = \u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2\u914D\u7F6E.
-view_configurationHistoryList_cannotDeleteCurrent = \u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E\u4E2D\u7684\u4E00\u9879\u662F\u73B0\u6709\u751F\u6548\u7684\u914D\u7F6E - \u4F60\u4E0D\u80FD\u5220\u9664\u5B83.
-view_configurationHistoryList_cannotDeleteGroupItems = \u4E00\u4E2A\u6216\u591A\u4E2A\u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E\u9879\u662F\u67D0\u4E2A\u7EC4\u914D\u7F6E\u7684\u4E00\u90E8\u5206\u3002 \u5728\u5220\u9664\u5355\u4E2A\u7684\u5386\u53F2\u914D\u7F6E\u4FE1\u606F\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u5220\u9664 \u4E0A\u4E00\u7EA7\u7684\u5386\u53F2\u7EC4\u914D\u7F6E.
-view_configurationHistoryList_delete_failure = \u5220\u9664\u5386\u53F2\u914D\u7F6E\u9879\u5931\u8D25
-view_configurationHistoryList_delete_success = \u60A8\u6210\u529F\u7684\u5220\u9664\u4E86\u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E\u9879.
-view_configurationHistoryList_rollback = \u56DE\u6EDA
-view_configurationHistoryList_rollback_failure = \u56DE\u6EDA\u914D\u7F6E\u5931\u8D25. \u539F\u6765\u7684\u914D\u7F6E\u4F9D\u7136\u751F\u6548.
-view_configurationHistoryList_rollback_success = \u60A8\u6210\u529F\u7684\u5C06\u8BE5\u914D\u7F6E\u56DE\u6EDA\u5230\u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E.
-view_configurationHistoryList_table_clickStatusIcon = \u70B9\u51FB\u72B6\u6001\u6309\u94AE\u83B7\u53D6\u8BE6\u7EC6\u7684\u4FE1\u606F
-view_configurationHistoryList_table_statusFailure = \u6B64\u914D\u7F6E\u66F4\u65B0\u5931\u8D25
-view_configurationHistoryList_table_statusInprogress = \u66F4\u65B0\u6B64\u914D\u7F6E\u7684\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\u4E2D
-view_configurationHistoryList_table_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
-view_configurationHistoryList_table_statusSuccess = \u6B64\u914D\u7F6E\u6210\u529F\u66F4\u65B0
-view_configurationHistoryList_title = \u5386\u53F2\u914D\u7F6E
-view_connectionSettingsDetails_allPropertiesValid = \u6240\u6709\u8FDE\u63A5\u8BBE\u7F6E\u7684\u914D\u7F6E\u5DF2\u7ECF\u586B\u5199\u4E86\u6709\u6548\u7684\u503C,\u73B0\u5728\u53EF\u4EE5\u4FDD\u5B58\u8BBE\u7F6E.
-view_connectionSettingsDetails_error_updateFailure = \u66F4\u65B0\u8FDE\u63A5\u8BBE\u7F6E\u5931\u8D25.
-##view_connectionSettingsDetails_messageConcise_updateSuccess = \u8FDE\u63A5\u8BBE\u7F6E\u5DF2\u66F4\u65B0.
-##view_connectionSettingsDetails_messageDetailed_updateSuccess = \u8D44\u6E90 [{0}]\u7684\u8FDE\u63A5\u8BBE\u7F6E\u5DF2\u7ECF\u66F4\u65B0.
-view_connectionSettingsDetails_noPermission = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u6B64\u8D44\u6E90\u7684\u8FDE\u63A5\u8BBE\u7F6E.
-view_connectionSettingsDetails_somePropertiesInvalid = \u4E0B\u9762\u7684\u8FDE\u63A5\u8BBE\u7F6E\u4FE1\u606F\u586B\u5199\u4E86\u975E\u6CD5\u7684\u503C: {0}. \u5FC5\u987B\u4FEE\u6539\u6B64\u4FE1\u606F\u4EE5\u4FBF\u4FDD\u5B58\u6B64\u8BBE\u7F6E.
-view_core_error_1 = \u67E5\u627E\u65B0\u544A\u8B66\u4FE1\u606F\u5931\u8D25
-view_core_loggedOut = \u9000\u51FA\u767B\u5F55
-view_core_noRecentAlerts = \u6CA1\u6709\u65B0\u4EA7\u751F\u7684\u544A\u8B66\u4FE1\u606F
-view_core_recentAlerts = \u65B0\u4EA7\u751F [{0}] \u6761\u544A\u8B66 - \u70B9\u51FB\u8DF3\u8F6C\u5230\u65B0\u544A\u8B66\u62A5\u8868\u754C\u9762
-view_core_uncaught = \u5168\u5C40\u672A\u6355\u6349\u7684\u5F02\u5E38
-view_dashboardManager_deleteFail = \u5220\u9664\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25.
-view_dashboardManager_deleted = \u6210\u529F\u5220\u9664\u7EDF\u8BA1\u8868\u76D8{0}
-view_dashboardManager_error = \u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
-view_dashboardManager_saved = \u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8{0}
-view_dashboardManager_success = \u6210\u529F\u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8
-view_dashboard_favorites_error1 = \u52A0\u8F7D\u5E38\u7528\u8D44\u6E90\u5931\u8D25.
-view_dashboardsManager_error1 = \u6DFB\u52A0\u65B0\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
-view_dashboardsManager_message_title_details = <h1>\u6B22\u8FCE\u4F7F\u7528RHQ</h1>\n<p>RHQ\u9879\u76EE\u662F\u4E00\u4E2A\u62BD\u8C61\u7684\u3001\u57FA\u4E8E\u63D2\u4EF6\u7684\u7CFB\u7EDF\u7BA1\u7406\u5957\u4EF6\u3002\u901A\u8FC7\u4E00\u7CFB\u5217\u6838\u5FC3\u529F\u80FD\u63D0\u4F9B\u591A\u4EA7\u54C1\u548C\u5E73\u53F0\u7684\u53EF\u6269\u5C55\u7684\u96C6\u6210\u7BA1\u7406. \u672C\u9879\u76EE\u5206\u5C42\u6A21\u5757\u5177\u6709\u7075\u6D3B\u53D1\u5E03\u67B6\u6784. \u5B83\u63D0\u4F9B\u4E86\u4E00\u4E2A\u6838\u5FC3\u7528\u6237\u754C\u9762\u4F9B\u8DE8\u6574\u4E2A\u4F01\u4E1A\u7684\u5BA1\u8BA1\u548C\u5386\u53F2\u7BA1\u7406. \u670D\u52A1\u5668/\u4EE3\u7406\u67B6\u6784\u63D0\u4F9B\u8FDC\u7A0B\u7BA1\u7406,\u63D2\u4EF6\u63D0\u4F9B\u7279\u5B9A\u4EA7\u54C1\u7684\u7BA1\u7406\u652F\u6301.</p>\n <p>\u901A\u8FC7\u5355\u51FB(\u7F16\u8F91\u6A21\u5F0F)\u6309\u94AE\u53EF\u4EE5\u7F16\u8F91\u9ED8\u8BA4\u7EDF\u8BA1\u8868\u76D8.</p>
-view_dashboards_confirm1 = \u60A8\u786E\u5B9A\u8981\u5220\u9664\uFF1F
-view_dashboards_portlets_refresh_fail1 = \u4FEE\u6539portlets\u81EA\u52A8\u5237\u65B0\u7684\u95F4\u9694\u65F6\u95F4\u5931\u8D25
-view_dashboards_portlets_refresh_fail2 = \u505C\u7528portlets\u81EA\u52A8\u5237\u65B0\u7684\u91CD\u8F7D\u5931\u8D25
-view_dashboards_portlets_refresh_multiple_min = {0} \u5206\u949F
-view_dashboards_portlets_refresh_none = \u65E0\u5237\u65B0
-view_dashboards_portlets_refresh_one_min = 1 \u5206\u652F
-view_dashboards_portlets_refresh_success1 = \u6210\u529F\u4FEE\u6539portlets\u81EA\u52A8\u5237\u65B0\u7684\u95F4\u9694\u65F6\u95F4
-view_dashboards_portlets_refresh_success2 = \u6210\u529F\u505C\u7528portlets\u81EA\u52A8\u5237\u65B0\u7684\u91CD\u8F7D
-view_dashboards_title = \u7EDF\u8BA1\u8868\u76D8
-view_dynagroup_children = \u5B50\u52A8\u6001\u7EC4
-view_dynagroup_compatible = \u517C\u5BB9\u6027
-view_dynagroup_definitionAlreadyExists = \u5DF2\u7ECF\u5B58\u5728\u4EE5\u8BE5\u540D\u79F0\u547D\u540D\u7684\u7EC4\u5B9A\u4E49
-view_dynagroup_definitionCreated = \u60A8\u6210\u529F\u7684\u521B\u5EFA\u540D\u79F0\u4E3A[{0}]\u7684\u7EC4\u5B9A\u4E49
-view_dynagroup_definitionLoadFailure = \u52A0\u8F7D\u6240\u6709\u7684\u7EC4\u5B9A\u4E49\u5931\u8D25
-view_dynagroup_definitions = \u52A8\u6001\u7EC4\u5B9A\u4E49
-view_dynagroup_deleteFailureSelection = \u5220\u9664\u9009\u4E2D\u7684\u7EC4\u5B9A\u4E49\u5931\u8D25
-view_dynagroup_deleteSuccessfulSelection = \u6210\u529F\u7684\u5220\u9664 [{0}]\u7EC4\u5B9A\u4E49
-view_dynagroup_editing = \u7F16\u8F91 [{0}]
-view_dynagroup_exprBuilder_addExpression = \u6DFB\u52A0\u8868\u8FBE\u5F0F
-view_dynagroup_exprBuilder_comparisonType = \u5BF9\u6BD4\u7C7B\u578B
-view_dynagroup_exprBuilder_comparisonType_contains = \u5305\u542B
-view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
-view_dynagroup_exprBuilder_comparisonType_equals = \u76F8\u7B49
-view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
-view_dynagroup_exprBuilder_comparisonType_tooltip = \u5BF9\u6BD4\u7C7B\u578B
-view_dynagroup_exprBuilder_definingPlugin = \u5B9A\u4E49\u63D2\u4EF6
-view_dynagroup_exprBuilder_definingPlugin_tooltip = \u67E5\u627E\u63D2\u4EF6
-view_dynagroup_exprBuilder_expression = \u8868\u8FBE\u5F0F
-view_dynagroup_exprBuilder_expressionType = \u8868\u8FBE\u5F0F\u7C7B\u578B
-view_dynagroup_exprBuilder_expressionType_pluginConfig = \u63D2\u4EF6\u914D\u7F6E
-view_dynagroup_exprBuilder_expressionType_resource = \u8D44\u6E90
-view_dynagroup_exprBuilder_expressionType_resourceCategory = \u8D44\u6E90\u79CD\u7C7B
-view_dynagroup_exprBuilder_expressionType_resourceConfig = \u8D44\u6E90\u914D\u7F6E
-view_dynagroup_exprBuilder_expressionType_resourceType = \u8D44\u6E90\u7C7B\u578B
-view_dynagroup_exprBuilder_expressionType_tooltip = \u6B64\u8868\u8FBE\u5F0F\u6307\u5B9A\u8868\u8FBE\u5F0F\u7684\u5C5E\u6027\u7C7B\u578B:<br/> <b>\u8D44\u6E90</b>: \u8D44\u6E90\u5C5E\u6027\uFF1A\u6BD4\u5982\u540D\u79F0\u548C\u7248\u672C<br/> <b>\u8D44\u6E90\u7C7B\u578B</b>: \u641C\u5BFB\u6307\u5B9A\u7C7B\u578B\u7684\u8D44\u6E90<br/> <b>\u8D44\u6E90\u7C7B\u522B</b>: \u6309\u7167\u7C7B\u522B\u67E5\u627E\u8D44\u6E90: \u5E73\u53F0, \u670D\u52A1\u5668, \u670D\u52A1<br/> <b>\u7279\u5F81</b>: \u5B58\u5728\u76D1\u63A7\u70B9\u7684\u8D44\u6E90<br/> <b>\u63D2\u4EF6\u914D\u7F6E</b>: \u6309\u7167\u63D2\u4EF6\u7EC4\u4EF6\u548C\u7EC4\u4EF6\u7684\u914D\u7F6E\u8BBE\u7F6E\u67E5\u8BE2<br/> <b>\u8D44\u6E90\u914D\u7F6E</b>: \u6309\u7167\u88AB\u7BA1\u8D44\u6E90\u7684\u914D\u7F6E\u8BBE\u7F6E\u67E5\u8BE2
-view_dynagroup_exprBuilder_expressionType_trait = \u7279\u5F81
-view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
-view_dynagroup_exprBuilder_groupBy = \u5206\u7EC4
-view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
-view_dynagroup_exprBuilder_noPlugins = --\u65E0\u63D2\u4EF6--
-view_dynagroup_exprBuilder_noProperties = -\u65E0\u5C5E\u6027--
-view_dynagroup_exprBuilder_noResourceTypes = --\u65E0\u8D44\u6E90\u7C7B\u578B--
-view_dynagroup_exprBuilder_pluginLoadFailure = \u65E0\u6CD5\u83B7\u53D6\u63D2\u4EF6\u5217\u8868
-view_dynagroup_exprBuilder_propLoadFailure = \u65E0\u6CD5\u83B7\u53D6\u5C5E\u6027\u5217\u8868
-view_dynagroup_exprBuilder_propertyName = \u5C5E\u6027\u540D\u79F0
-view_dynagroup_exprBuilder_propertyName_tooltip = \u7528\u4E8E\u67E5\u8BE2\u7684\u5C5E\u6027\u540D\u79F0. \u8FD9\u662F\u7531\u8868\u8FBE\u5F0F\u7C7B\u578B\u548C\u8D44\u6E90\u7C7B\u578B\u51B3\u5B9A\u7684.
-view_dynagroup_exprBuilder_resTypeLoadFailure = \u65E0\u6CD5\u83B7\u53D6\u63D2\u4EF6[{0}]\u7684\u8D44\u6E90\u7C7B\u578B\u5217\u8868
-view_dynagroup_exprBuilder_resource = \u8D44\u6E90
-view_dynagroup_exprBuilder_resourceType = \u8D44\u6E90\u7C7B\u578B
-view_dynagroup_exprBuilder_resourceType_tooltip = \u8D44\u6E90\u7C7B\u578B
-view_dynagroup_exprBuilder_resource_child = Child
-view_dynagroup_exprBuilder_resource_grandparent = Grandparent
-view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
-view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
-view_dynagroup_exprBuilder_resource_parent = Parent
-view_dynagroup_exprBuilder_resource_resource = Resource
-view_dynagroup_exprBuilder_resource_tooltip = \u9009\u62E9\u8981\u67E5\u8BE2\u8D44\u6E90\u6240\u5728\u7684\u5C42\u7EA7. \u4F8B\u5982, \u9009\u4E2D "parent"\u4F1A\u67E5\u8BE2\u51FA\u7236\u8D44\u6E90\u7684\u6EE1\u8DB3\u5269\u4F59\u8868\u8FBE\u5F0F\u7684\u8D44\u6E90.
-view_dynagroup_exprBuilder_title = \u8868\u8FBE\u5F0F\u7F16\u8BD1
-view_dynagroup_exprBuilder_unset = \u6062\u590D\u8BBE\u7F6E
-view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
-view_dynagroup_exprBuilder_value_tooltip = \u67E5\u8BE2\u8868\u8FBE\u5F0F\u5B57\u7B26\u4E32\u7684\u503C
-view_dynagroup_expression = \u8868\u8FBE\u5F0F
-view_dynagroup_expressionBuilderIconTooltip = \u8868\u8FBE\u5F0F\u7F16\u8BD1\u4E2D...
-view_dynagroup_expressionSet = \u8868\u8FBE\u5F0F\u7EC4
-view_dynagroup_lastCalculationTime = \u4E0A\u6B21\u8BA1\u7B97\u6301\u7EED\u65F6\u95F4
-view_dynagroup_loadDefinitionFailure = \u52A0\u8F7D\u7EC4\u5B9A\u4E49 [{0}]\u5931\u8D25
-view_dynagroup_loadDefinitionMissing = \u6CA1\u6709ID\u662F[{0}]\u7684\u7EC4\u5B9A\u4E49
-view_dynagroup_mixed = Mixed
-view_dynagroup_newGroupDefinition = \u65B0\u5EFA\u7EC4\u5B9A\u4E49
-view_dynagroup_nextCalculationTime = \u4E0B\u6B21\u8BA1\u7B97\u6301\u7EED\u65F6\u95F4
-view_dynagroup_permDenied = \u60A8\u6CA1\u6709\u67E5\u770B\u7EC4\u5B9A\u4E49\u7684\u6743\u9650
-view_dynagroup_recalcFailure = \u91CD\u7B97\u7EC4\u5B9A\u4E49\u5931\u8D25
-view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions
-view_dynagroup_recalcSuccessful = \u7EC4\u5B9A\u4E49\u5DF2\u7ECF\u91CD\u65B0\u8BA1\u7B97
-view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions
-view_dynagroup_recalculate = \u91CD\u7B97
-view_dynagroup_recalculationInterval = \u91CD\u7B97\u95F4\u9694 (ms)
-view_dynagroup_recursive = \u9012\u5F52
-view_dynagroup_saveAndRecalculate = \u4FDD\u5B58&\u91CD\u7B97
-view_dynagroup_saveFailure = \u4FDD\u5B58\u540D\u79F0\u4E3A[{0}]\u7684\u7EC4\u5B9A\u4E49\u5931\u8D25
-view_dynagroup_saveSuccessful = \u60A8\u6210\u529F\u7684\u4FDD\u5B58\u4E86\u540D\u79F0\u4E3A[{0}]\u7684\u7EC4\u5B9A\u4E49
-view_dynagroup_singleSaveFailure = \u62A5\u9519\u4E86 - \u6B63\u5E38\u5E94\u8BE5\u53EA\u521B\u5EFA\u5355\u4E2A\u7EC4\u5B9A\u4E49, \u4F46\u662F\u5374\u521B\u5EFA\u4E86[{0}]\u4E2A.
-view_dynagroup_template_customExpression = Custom Expression...
-view_dynagroup_template_downedResources = All resources currently down
-view_dynagroup_template_jbossas4_clusters = JBossAS 4 - \u96C6\u7FA4
-view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
-view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
-view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
-view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
-view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - \u96C6\u7FA4
-view_dynagroup_template_platforms = Platform resources in inventory
-view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
-view_groupConfigEdit_member = \u6210\u5458
-view_groupConfigEdit_noListProps = \u7EC4\u914D\u7F6E\u76EE\u524D\u4E0D\u652F\u6301\u67E5\u770B\u5C5E\u6027\u4FE1\u606F.
-view_groupConfigEdit_setAll = \u8BBE\u7F6E\u6240\u6709\u7684\u503C\u5230:
-view_groupConfigEdit_tooltip_1 = \u6210\u5458\u503C\u6709\u5DEE\u5F02 - \u70B9\u51FB\u6309\u94AE\u7F16\u8F91.
-view_groupConfigEdit_unset = \u56DE\u6EDA
-view_groupConfigEdit_valsDiff = \u6210\u5458\u503C\u6709\u5DEE\u5F02
-view_groupConfigEdit_valsDiffForProp = \u5C5E\u6027 [{0}]\u7684\u6210\u5458\u503C
-view_groupCreateWizard_createFailure = \u521B\u5EFA\u8D44\u6E90\u7EC4\u5931\u8D25
-view_groupCreateWizard_createStepName = \u7EC4\u8BBE\u7F6E
-view_groupCreateWizard_createStep_recursive = \u9012\u5F52
-view_groupCreateWizard_createSuccessful_concise = \u6210\u529F\u7684\u521B\u5EFA\u4E86\u8D44\u6E90\u7EC4. [<a href="{0}">\u67E5\u770B\u7EC4</a>]
-view_groupCreateWizard_createSuccessful_full = \u6210\u529F\u7684\u521B\u5EFA\u540D\u79F0\u662F [{1}]\u5305\u542B [{2}]\u4E2A\u8D44\u6E90\u6210\u5458\u7684[{0}]\u8D44\u6E90\u7EC4
-view_groupCreateWizard_membersStepName = \u9009\u62E9\u6210\u5458
-view_groupCreateWizard_title = \u521B\u5EFA\u7EC4
-view_groupCreateWizard_windowTitle = \u521B\u5EFA\u7EC4
-view_groupInventoryMembers_button_updateMembership = \u66F4\u65B0\u6210\u5458\u5173\u7CFB\u4E2D...
-view_groupInventoryMembers_title_updateMembership = \u66F4\u65B0\u6210\u5458\u5173\u7CFB
-view_group_detail_failLoad = \u52A0\u8F7D\u7EC4ID\u4E3A[{0}]\u7684\u7EC4\u4FE1\u606F\u5931\u8D25
-view_group_detail_failLoadComp = \u52A0\u8F7D\u7EC4ID\u4E3A[{0}]\u7684\u6DF7\u5408\u7EC4\u4FE1\u606F\u5931\u8D25
-view_group_detail_failRecursiveChange = \u4FEE\u6539\u7EC4[{0}]\u7684\u9012\u5F52\u8BBE\u7F6E\u5931\u8D25
-view_group_detail_recursiveChange = \u6210\u529F\u7684\u4FEE\u6539\u7EC4[{0}]\u7684\u9012\u5F52\u8BBE\u7F6E
-view_group_inventory_activity_no_recent_metrics = \u6B64\u7EC4\u6CA1\u6709\u6700\u65B0\u516C\u544A
-view_group_meas_schedules_title = Group Metric Collection Schedules
-view_group_membership_failFetch = \u83B7\u53D6\u8D44\u6E90\u7EC4\u5931\u8D25
-view_group_membership_saveFailure = \u4FEE\u6539[{0}]\u7684\u7EC4\u6210\u5458\u5173\u7CFB\u5931\u8D25
-view_group_membership_saveSuccessful = \u6210\u529F\u7684\u4FEE\u6539[{0}]\u7684\u7EC4\u6210\u5458\u5173\u7CFB
-view_group_operationScheduleDetails_failedToLoadMembers = \u52A0\u8F7D\u7EC4\u6210\u5458\u4FE1\u606F\u5931\u8D25.
-view_group_operationScheduleDetails_field_execute = \u6267\u884C
-view_group_operationScheduleDetails_field_haltOnFailure = \u5931\u8D25\u65F6\u505C\u6B62?
-view_group_operationScheduleDetails_memberResource = \u6210\u5458\u4FE1\u606F
-view_group_operationScheduleDetails_value_parallel = \u91C7\u53D6\u5E76\u884C\u7684\u65B9\u5F0F
-view_group_operationScheduleDetails_value_sequential = \u6309\u7167\u5982\u4E0B\u7684\u987A\u5E8F (\u6DFB\u52A0\u6216\u8005\u5220\u9664\u6210\u5458\u4EE5\u4FEE\u6539\u987A\u5E8F)
-view_group_pluginConfig_edit_currentGroupProperties = \u7EC4\u5F53\u524D\u5C5E\u6027
-view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]
-view_group_pluginConfig_edit_noperm = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u6B64\u7EC4\u8FDE\u63A5\u8BBE\u7F6E
-view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]
-view_group_pluginConfig_edit_saveInitiated_concise = \u7EC4\u8FDE\u63A5\u8BBE\u7F6E\u66F4\u65B0\u5DF2\u7ECF\u521D\u59CB\u5316
-view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]
-view_group_pluginConfig_edit_saveTooltip = \u66F4\u65B0\u6240\u6709\u7684\u7EC4\u6210\u5458\u8FDE\u63A5\u8BBE\u7F6E
-view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved
-view_group_pluginConfig_members_fetchFailure = \u83B7\u53D6[{0}]\u7EC4\u6210\u5458\u7684\u63D2\u4EF6\u914D\u7F6E\u66F4\u65B0\u5386\u53F2\u5931\u8D25
-view_group_pluginConfig_members_fetchFailureConn = \u68C0\u7D22[{0}]\u7684\u6210\u5458\u8FDE\u63A5\u8BBE\u7F6E\u5931\u8D25
-view_group_pluginConfig_members_fetchFailureConnInProgress = \u5F53\u524D\u5DF2\u5B58\u5728\u7EC4\u63D2\u4EF6\u914D\u7F6E\u66F4\u65B0\u8FDB\u7A0B . \u5728\u67E5\u770B\u7EC4\u8BBE\u7F6E\u4E4B\u524D\u9700\u8981\u7B49\u5F85\u66F4\u65B0\u5B8C\u6210.
-view_group_pluginConfig_members_statusDetails = \u8BE6\u7EC6\u72B6\u6001
-view_group_pluginConfig_members_statusFailure = \u672A\u77E5\u9519\u8BEF\uFF0C\u914D\u7F6E\u4FEE\u6539\u5931\u8D25
-view_group_pluginConfig_members_statusInprogress = \u6B63\u5728\u4FEE\u6539\u914D\u7F6E\u4E2D
-view_group_pluginConfig_members_statusNochange = \u6CA1\u6709\u5BF9\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
-view_group_pluginConfig_members_statusSuccess = \u4FEE\u6539\u914D\u7F6E\u6210\u529F
-view_group_pluginConfig_members_title = \u7EC4\u6210\u5458\u8FDE\u63A5\u8BBE\u7F6E\u5386\u53F2
-view_group_pluginConfig_table_clickStatusIcon = \u70B9\u51FB\u72B6\u6001\u6309\u94AE\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F
-view_group_pluginConfig_table_deleteFailure = \u5220\u9664\u7EC4\u63D2\u4EF6\u914D\u7F6E\u5386\u53F2\u5931\u8D25
-view_group_pluginConfig_table_deleteSuccessful = \u60A8\u5220\u9664\u4E86 [{0}] \u5386\u53F2\u9879
-view_group_pluginConfig_table_failFetch = \u83B7\u53D6\u7EC4\u63D2\u4EF6\u914D\u7F6E\u5386\u53F2\u5931\u8D25
-view_group_pluginConfig_table_msg1 = \u67E5\u770B\u5355\u72EC\u8D44\u6E90\u7684\u6210\u5458\u5386\u53F2\u72B6\u6001
-view_group_pluginConfig_table_statusDetails = \u8BE6\u7EC6\u72B6\u6001
-view_group_pluginConfig_table_statusFailure = \u4FEE\u6539\u6B64\u7EC4\u914D\u7F6E\u5931\u8D25
-view_group_pluginConfig_table_statusInprogress = \u7EC4\u914D\u7F6E\u66F4\u65B0\u4E2D
-view_group_pluginConfig_table_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u7EC4\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
-view_group_pluginConfig_table_statusSuccess = \u7EC4\u914D\u7F6E\u66F4\u65B0\u6210\u529F
-view_group_pluginConfig_table_title = \u5386\u53F2\u8FDE\u63A5\u8BBE\u7F6E\u7EC4
-view_group_pluginConfig_table_viewMemberHistory = \u67E5\u770B\u5386\u53F2\u6210\u5458
-view_group_pluginConfig_table_viewSettings = \u67E5\u770B\u8BBE\u7F6E
-view_group_pluginConfig_view_groupProperties = \u7EC4\u5C5E\u6027
-view_group_pluginConfig_view_noperm = \u60A8\u6CA1\u6709\u67E5\u770B\u8FDE\u63A5\u8BBE\u7F6E\u7684\u6743\u9650
-view_group_resConfig_edit_invalid = \u4E0B\u9762\u7684\u5C5E\u6027\u914D\u7F6E\u586B\u5199\u4E86\u65E0\u6548\u7684\u503C ,\u63D0\u4EA4\u4E4B\u524D\u8BF7\u4FEE\u6539: [{0}]
-view_group_resConfig_edit_loadFail = \u68C0\u7D22[{0}]\u7684\u6210\u5458\u8D44\u6E90\u914D\u7F6E\u5931\u8D25
-view_group_resConfig_edit_noperm = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u7EC4\u914D\u7F6E
-view_group_resConfig_edit_saveFailure = \u521D\u59CB\u5316\u8D44\u6E90\u7C7B\u578B[{0}],\u540D\u79F0\u4E3A[{1}]\u7684\u517C\u5BB9\u7EC4\u7EC4\u914D\u7F6E\u66F4\u65B0\u5931\u8D25
-view_group_resConfig_edit_saveInitiated_concise = \u521D\u59CB\u5316\u7EC4\u914D\u7F6E\u66F4\u65B0\u5B8C\u6210
-view_group_resConfig_edit_saveInitiated_full = \u6210\u529F\u521D\u59CB\u5316\u8D44\u6E90\u7C7B\u578B[{0}],\u540D\u79F0\u4E3A[{1}]\u7684\u517C\u5BB9\u7EC4\u7EC4\u914D\u7F6E\u66F4\u65B0
-view_group_resConfig_edit_saveTooltip = \u4FEE\u6539\u6240\u6709\u7684\u7EC4\u6210\u5458\u914D\u7F6E
-view_group_resConfig_edit_valid = \u6240\u6709\u7684\u5C5E\u6027\u914D\u7F6E\u5747\u6709\u6548,\u53EF\u4EE5\u63D0\u4EA4\u4FDD\u5B58
-view_group_resConfig_members_fetchFailure = \u83B7\u53D6\u8D44\u6E90\u7EC4[{0}]\u7684\u6210\u5458\u914D\u7F6E\u4FEE\u6539\u5386\u53F2\u8BB0\u5F55\u5931\u8D25
-view_group_resConfig_members_fetchFailureConfig = \u6062\u590D\u8D44\u6E90\u6210\u5458 [{0}]\u7684\u914D\u7F6E\u8BBE\u7F6E
-view_group_resConfig_members_fetchFailureConfigInProgress = \u6B64\u8D44\u6E90\u7EC4\u914D\u7F6E\u7684\u6B63\u5728\u4FEE\u6539\u4E2D\uFF0C\u5982\u679C\u8981\u67E5\u770B\u7EC4\u8BBE\u7F6E\uFF0C\u9700\u8981\u7B49\u5F85\u6B64\u4FEE\u6539\u5168\u90E8\u5B8C\u6210.
-view_group_resConfig_members_statusDetails = \u8BE6\u7EC6\u72B6\u6001
-view_group_resConfig_members_statusFailure = \u672A\u77E5\u9519\u8BEF\uFF0C\u4FEE\u6539\u914D\u7F6E\u5931\u8D25
-view_group_resConfig_members_statusInprogress = \u6B63\u4FEE\u6539\u6B64\u914D\u7F6E\u4E2D
-view_group_resConfig_members_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
-view_group_resConfig_members_statusSuccess = \u6210\u529F\u7684\u4FEE\u6539\u6B64\u914D\u7F6E
-view_group_resConfig_members_title = \u8D44\u6E90\u7EC4\u914D\u7F6E\u5386\u53F2\u6210\u5458
-view_group_resConfig_table_clickStatusIcon = \u70B9\u51FB\u72B6\u6001\u6309\u94AE\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F
-view_group_resConfig_table_deleteFailure = \u5220\u9664\u5386\u53F2\u8D44\u6E90\u7EC4\u914D\u7F6E\u5931\u8D25
-view_group_resConfig_table_deleteSuccessful = \u6210\u529F\u5220\u9664 [{0}] \u5386\u53F2\u9879
-view_group_resConfig_table_failFetch = \u83B7\u53D6\u8D44\u6E90\u7EC4\u5386\u53F2\u914D\u7F6E\u5931\u8D25
-view_group_resConfig_table_msg1 = \u67E5\u770B\u6BCF\u4E2A\u5355\u72EC\u8D44\u6E90\u7684\u6210\u5458\u5386\u53F2\u72B6\u6001
-view_group_resConfig_table_statusDetails = \u8BE6\u7EC6\u72B6\u6001
-view_group_resConfig_table_statusFailure = \u7EC4\u914D\u7F6E\u4FEE\u6539\u5931\u8D25
-view_group_resConfig_table_statusInprogress = \u6B64\u7EC4\u914D\u7F6E\u7684\u4FEE\u6539\u6B63\u5728\u8FDB\u884C\u4E2D
-view_group_resConfig_table_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u7EC4\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
-view_group_resConfig_table_statusSuccess = \u6210\u529F\u4FEE\u6539\u7EC4\u914D\u7F6E
-view_group_resConfig_table_title = \u5386\u53F2\u8D44\u6E90\u7EC4\u914D\u7F6E
-view_group_resConfig_table_viewMemberHistory = \u67E5\u770B\u5386\u53F2\u6210\u5458
-view_group_resConfig_table_viewSettings = \u67E5\u770B\u8BBE\u7F6E
-view_group_resConfig_view_groupProperties = \u7EC4\u5C5E\u6027
-view_group_resConfig_view_noperm = \u60A8\u6CA1\u6709\u6743\u9650\u67E5\u770B\u8D44\u6E90\u914D\u7F6E\u8BBE\u7F6E
-view_group_summary_compatible = \u517C\u5BB9\u7684
-view_group_summary_descUpdateFailure = \u4FEE\u6539ID\u4E3A[{0}]\u7684\u8D44\u6E90\u7EC4\u63CF\u8FF0\u4FE1\u606F\u5931\u8D25
-view_group_summary_descUpdateSuccessful = \u6210\u529F\u4FEE\u6539\u6B64\u8D44\u6E90\u7EC4\u7684\u63CF\u8FF0
-view_group_summary_dynamic = \u52A8\u6001
-view_group_summary_dynamicNote = \u52A8\u6001\u7EC4\u7684\u540D\u79F0\u548C\u63CF\u8FF0\u662F\u7BA1\u7406\u5C5E\u6027,\u6240\u4EE5\u4E0D\u80FD\u4FEE\u6539
-view_group_summary_groupDefinition = \u7EC4\u5B9A\u4E49
-view_group_summary_memberCount = \u6210\u5458\u6570
-view_group_summary_memberType = \u6210\u5458\u7C7B\u578B
-view_group_summary_mixed = \u6DF7\u5408
-view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]
-view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]
-view_group_summary_recursive = \u9012\u5F52
-view_helpTop_description = \u8BE5\u90E8\u5206\u5185\u5BB9\u63D0\u4F9B\u4E86\u4EA7\u54C1\u6587\u6863, \u6559\u7A0B, \u7248\u672C\u53F7\u548C\u5176\u4ED6\u6709\u7528\u7684\u4FE1\u606F.
-view_help_section_product = \u4EA7\u54C1\u5E2E\u52A9
-view_help_section_product_about = \u5173\u4E8E\u4EA7\u54C1\u5E2E\u52A9
-view_inventory_adq = Discovery Queue
-view_inventory_allGroups = \u6240\u6709\u7EC4
-view_inventory_allResources = \u6240\u6709\u8D44\u6E90
-view_inventory_collectionInterval = \u641C\u96C6\u95F4\u9694
-view_inventory_dynagroupDefs = \u52A8\u6001\u7EC4\u5B9A\u4E49
-view_inventory_eventDetails_loadFailed = \u52A0\u8F7D\u4E8B\u4EF6\u8BE6\u60C5\u5931\u8D25
-view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]
-view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]
-view_inventory_eventHistory_details = \u8BE6\u60C5
-view_inventory_eventHistory_detailsFilter = \u8BE6\u60C5\u8FC7\u6EE4
-view_inventory_eventHistory_groupEventHistory = \u7EC4\u5386\u53F2\u4E8B\u4EF6
-view_inventory_eventHistory_purgeFailed = \u4E3A[{0}]\u79FB\u9664\u4E8B\u4EF6\u5931\u8D25
-view_inventory_eventHistory_purgeSuccessful = \u6210\u529F\u5220\u9664[{0}]\u4E2A\u4E8B\u4EF6\u4E3A[{1}]
-view_inventory_eventHistory_resourceEventHistory = \u8D44\u6E90\u5386\u53F2\u4E8B\u4EF6
-view_inventory_eventHistory_severity = \u4E25\u91CD\u7EA7\u522B
-view_inventory_eventHistory_severityFilter = \u4E25\u91CD\u7EA7\u8FC7\u6EE4
-view_inventory_eventHistory_sourceFilter = Source\u8FC7\u6EE4
-view_inventory_eventHistory_sourceLocation = Source\u4F4D\u7F6E
-view_inventory_eventHistory_timestamp = \u65F6\u95F4\u6233
-view_inventory_groups = \u7EC4
-view_inventory_groups_children = \u5B50\u7EC4
-view_inventory_groups_deleteFailed = \u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90\u7EC4\u5931\u8D25
-view_inventory_groups_deleteSuccessful = \u6210\u529F\u7684\u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90\u7EC4
-view_inventory_groups_descendants = \u540E\u4EE3\u7EC4
-view_inventory_groups_loadFailed = \u52A0\u8F7D\u7EC4\u7EC4\u5408\u6570\u636E\u5931\u8D25
-view_inventory_groups_resourceGroups = \u8D44\u6E90\u7EC4
-view_inventory_mixed = \u6DF7\u5408
-view_inventory_platforms = \u5E73\u53F0
-view_inventory_problemGroups = \u95EE\u9898\u7EC4
-view_inventory_resource_loadFailed = id\u4E3A [{0}]\u7684\u8D44\u6E90\u4E0D\u5B58\u5728\u6216\u8005\u4E0D\u53EF\u8FBE
-view_inventory_resources_deleteConfirm = \u786E\u5B9A\u5220\u9664\u9009\u4E2D\u7684\u8D44\u6E90\uFF1F
-view_inventory_resources_deleteFailed = \u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90\u5931\u8D25
-view_inventory_resources_deleteSuccessful = \u6210\u529F\u7684\u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90
-view_inventory_resources_loadFailed = \u52A0\u8F7D\u8D44\u6E90\u7EC4\u5408\u6570\u636E\u5931\u8D25
-view_inventory_resources_title = Resources
-view_inventory_resources_title_children = \u5B50\u8D44\u6E90
-view_inventory_resources_title_members = \u6210\u5458\u8D44\u6E90
-view_inventory_resources_uninventoryConfirm = \u786E\u5B9A\u628A\u9009\u4E2D\u7684\u8D44\u6E90\u4ECE\u6E05\u5355\u4E2D\u5220\u9664? \u6CE8\u610F\uFF1A\u5982\u679C\u67D0\u4E2A\u9009\u4E2D\u7684\u8D44\u6E90\u4F9D\u7136\u5B58\u5728, \u5219\u7CFB\u7EDF\u4F1A\u5728\u6B64\u8D44\u6E90\u7684\u5BA2\u6237\u7AEF\u7A0B\u5E8F\u4E0B\u6B21\u63A2\u7D22\u626B\u63CF\u65F6\u91CD\u65B0\u52A0\u8F7D\u6B64\u8D44\u6E90.
-view_inventory_resources_uninventoryFailed = \u4ECE\u6E05\u5355\u4E2D\u5220\u9664\u9009\u4E2D\u7684\u8D44\u6E90\u5931\u8D25
-view_inventory_resources_uninventorySuccessful = \u6210\u529F\u4ECE\u6E05\u5355\u4E2D\u5220\u9664\u9009\u4E2D\u7684\u8D44\u6E90
-view_inventory_sectionHelp = \u6B64\u6A21\u5757\u53EF\u4EE5\u67E5\u770B\u548C\u7BA1\u7406\u65B0\u53D1\u73B0\u7684\u8D44\u6E90,\u5206\u7C7B\u7684\u8D44\u6E90\u548C\u7EC4.
-view_inventory_servers = \u670D\u52A1\u5668
-view_inventory_services = \u670D\u52A1
-view_inventory_summary_agent_error1 = \u67E5\u627E\u5BA2\u6237\u7AEF\u7BA1\u7406\u7684\u8D44\u6E90id\u5931\u8D25
-view_inventory_summary_agent_error2 = \u5BA2\u6237\u7AEF\u7BA1\u7406\u7684\u8D44\u6E90ping\u4E0D\u901A
-view_inventory_summary_agent_error3 = \u6CA1\u6709\u6743\u9650\u67E5\u770B\u6B64\u5BA2\u6237\u7AEF\u7684\u8BE6\u7EC6\u4FE1\u606F.
-view_inventory_summary_agent_fullEnpoint = Full Endpoint
-view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!
-view_inventory_summary_agent_last_title = \u6700\u540E\u63A5\u6536\u5230\u7684\u53EF\u7528\u4FE1\u606F\u62A5\u544A
-view_inventory_summary_agent_status_title = \u5BA2\u6237\u7AEF\u901A\u4FE1\u72B6\u6001
-view_inventory_summary_agent_title = \u5BA2\u6237\u7AEF\u7BA1\u7406\u6B64\u8D44\u6E90
-view_inventory_unavailableServers = \u4E0D\u53EF\u7528\u7684\u670D\u52A1
-view_leftNav_unknownPage = \u6A21\u5757[{1}]\u4E0B\u672A\u77E5\u7684\u9875\u9762[{0}] - \u94FE\u63A5\u65E0\u6548.
-view_login_invalidEmail = \u65E0\u6548\u7684\u90AE\u7BB1\u5730\u5740
-view_login_login = \u767B\u5F55
-view_login_logout = \u6CE8\u9500
-view_login_noBackend = \u540E\u7AEF\u6570\u636E\u4E0D\u53EF\u8FBE.
-view_login_noLdap = \u63D0\u793A: \u83B7\u53D6\u53EF\u9009\u7684ldap\u4FE1\u606F\u5931\u8D25. \u9700\u8981\u624B\u5DE5\u8F93\u5165.
-view_login_noUser = \u7528\u6237\u540D\u6216\u8005\u5BC6\u7801\u4E0D\u5339\u914D.
-view_login_prompt = \u8BF7\u767B\u5F55
-view_login_registerLater = (\u53D6\u6D88 - \u7A0D\u540E\u5B8C\u6210\u6CE8\u518C.)
-view_login_registerLdapSuccess = \u6210\u529F\u6CE8\u518C\u65B0\u7684LDAP\u7528\u6237.
-view_login_registerUser = \u7528\u6237\u6CE8\u518C
-view_login_welcome = \u6B22\u8FCE
-view_login_welcomeMsg = \u6B22\u8FCE\u6765\u5230 RHQ! <br/><br/> \u8F93\u5165\u6216\u8005\u4FEE\u6539\u4E0B\u9762\u7684\u4FE1\u606F\uFF0C\u4EE5\u5B8C\u6210\u6CE8\u518C<br/> \u70B9\u51FB"OK", \u5C31\u53EF\u4EE5\u767B\u5F55\u7CFB\u7EDF.<br/><br/>
-view_measureRange_last = \u65F6\u95F4\u8303\u56F4 - \u5148\u524D\u7684
-view_measureRange_simple = \u4E00\u822C...
-view_measureRange_start = \u65F6\u95F4\u8303\u56F4 - \u8D77\u59CB
-view_measureTable_chartMetricValues = Chart Selected Metrics
-view_measureTable_getLive = Get Live Value
-view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
-view_measureTable_live_title = \u52A8\u6001\u6570\u636E
-view_measure_nan = --\u65E0\u6570\u636E--
-view_measurementOob_title = Suspect Metrics
-view_menuBar_logout = \u6CE8\u9500
-view_messageCenter_clearAllMessages = \u6E05\u9664\u6240\u6709\u7684\u6D88\u606F
-view_messageCenter_lastNMessages = \u6700\u540E {0} \u6761\u4FE1\u606F
-view_messageCenter_maxMessages = \u6700\u5927\u6D88\u606F\u91CF
-view_messageCenter_messageBarShowDetails = \u663E\u793A\u5185\u5BB9
-view_messageCenter_messageDetail = \u8BE6\u7EC6\u5185\u5BB9
-view_messageCenter_messageSeverity = \u91CD\u8981\u7EA7\u522B
-view_messageCenter_messageTime = \u65F6\u95F4
-view_messageCenter_messageTitle = \u6D88\u606F\u4E2D\u5FC3
-view_messageCenter_noRecentMessages = \u65E0\u8FD1\u671F\u6D88\u606F
-view_messageCenter_stackTraceFollows = --- \u540E\u9762\u662F\u5F02\u5E38\u4FE1\u606F ---
-view_metric_traits = Traits
-view_metric_viewTraitHistory = Value History for Trait [{0}]
-view_operationHistoryDetails_dateCompleted = Date Completed
-view_operationHistoryDetails_dateSubmitted = Date Submitted
-view_operationHistoryDetails_error_fetchFailure = \u52A0\u8F7D\u64CD\u4F5C\u5386\u53F2\u5931\u8D25.
-view_operationHistoryDetails_noResults = \u6B64\u64CD\u4F5C\u6CA1\u6709\u4EFB\u4F55\u8FD4\u56DE.
-view_operationHistoryDetails_operation = \u64CD\u4F5C
-view_operationHistoryDetails_parameters = \u53C2\u6570
-view_operationHistoryDetails_requestor = \u8BF7\u6C42
-view_operationHistoryDetails_results = \u7ED3\u679C
-view_operationHistoryDetails_status = \u72B6\u6001
-view_operationHistoryList_button_forceDelete = \u5F3A\u5236\u5220\u9664
-view_operationHistoryList_button_runOperation = \u6267\u884C\u64CD\u4F5C
-view_operationHistoryList_notYetStarted = \u8FD8\u672A\u5F00\u59CB
-view_operationHistoryList_title = \u64CD\u4F5C\u5386\u53F2
-view_operationScheduleDetails_enterParametersBelow = \u8F93\u5165\u4E0B\u9762\u7684\u53C2\u6570...
-view_operationScheduleDetails_fieldDefault_description = \u9009\u62E9\u64CD\u4F5C\u67E5\u770B\u63CF\u8FF0.
-view_operationScheduleDetails_fieldDefault_parameters = \u9009\u62E9\u64CD\u4F5C\u67E5\u770B\u6240\u9700\u7684\u53C2\u6570.
-view_operationScheduleDetails_fieldHelp_description = \u6B64\u8C03\u5EA6\u64CD\u4F5C\u7684\u53EF\u9009\u63CF\u8FF0 (e.g. \u6BCF\u591C\u7EF4\u62A4\u5E94\u7528\u670D\u52A1\u91CD\u542F)
-view_operationScheduleDetails_fieldHelp_timeout = \u64CD\u4F5C\u6301\u7EED\u65F6\u95F4 - \u5982\u679C\u6307\u5B9A, \u5E76\u4E14\u8D85\u8FC7\u4E86\u6307\u5B9A\u7684\u65F6\u95F4\u64CD\u4F5C\u6CA1\u6709\u5B8C\u6210, RHQ \u670D\u52A1\u5224\u5B9A\u6B64\u64CD\u4F5C\u8D85\u65F6\u5E76\u4E14\u6807\u4E3A\u5931\u8D25; \u63D0\u793A, \u901A\u5E38 \u4E0D\u53EF\u80FD\u7EC8\u6B62\u5DF2\u7ECF\u5F00\u59CB\u8FD0\u884C\u7684\u540E\u53F0\u8D44\u6E90\u7BA1\u7406\u7684\u64CD\u4F5C.
-view_operationScheduleDetails_field_description = \u63CF\u8FF0
-view_operationScheduleDetails_field_parameters = \u53C2\u6570
-view_operationScheduleDetails_field_timeout = \u8D85\u65F6
-view_operationScheduleDetails_noParameters = \u6B64\u64CD\u4F5C\u4E0D\u9700\u8981\u4EFB\u4F55\u53C2\u6570.
-view_operationScheduleDetails_operationSchedule = \u64CD\u4F5C\u8BA1\u5212
-view_portlet_autodiscovery_setting_platforms = \u5E73\u53F0\u7ED3\u679C\u96C6
-view_portlet_configure_definitionDesc = portlet\u914D\u7F6E\u8BBE\u7F6E\u63CF\u8FF0.
-view_portlet_configure_definitionTitle = Portlet\u914D\u7F6E
-view_portlet_configure_needed = \u70B9\u51FB\u8BBE\u7F6E\u6309\u94AE\u914D\u7F6Eportlet.
-view_portlet_configure_notNeeded = \u6B64 portlet\u65E0\u9700\u914D\u7F6E.
-view_portlet_defaultName_autodiscovery = \u63A2\u7D22\u961F\u5217
-view_portlet_defaultName_favoriteResources = \u5E38\u7528\u8D44\u6E90
-view_portlet_defaultName_groupMetric = \u516C\u7528\u8D44\u6E90\u7EC4\u56FE\u6807
-view_portlet_defaultName_group_alerts = \u7EC4: \u544A\u8B66
-view_portlet_defaultName_group_bundles = \u7EC4: \u7C7B\u53D1\u5E03
-view_portlet_defaultName_group_config_updates = \u7EC4: \u914D\u7F6E\u66F4\u65B0
-view_portlet_defaultName_group_events = \u7EC4: \u4E8B\u4EF6\u7EDF\u8BA1
-view_portlet_defaultName_group_metrics = \u7EC4: Metrics
-view_portlet_defaultName_group_oobs = \u7EC4: OOB\u72B6\u6001
-view_portlet_defaultName_group_operations = \u7EC4: \u64CD\u4F5C\u96C6
-view_portlet_defaultName_group_pkg_hisory = \u7EC4: \u5386\u53F2\u6570\u636E\u5305
-view_portlet_defaultName_inventorySummary = \u6E05\u5355\u6982\u8981
-view_portlet_defaultName_mashup = Mashup
-view_portlet_defaultName_message = \u4FE1\u606F
-view_portlet_defaultName_operations = \u8FD1\u671F\u64CD\u4F5C
-view_portlet_defaultName_platformSummary = \u5E73\u53F0\u5229\u7528\u7387
-view_portlet_defaultName_problemResources = \u544A\u8B66\u6216\u8005\u4E0D\u53EF\u7528\u7684\u8D44\u6E90
-view_portlet_defaultName_recentAlerts = \u65B0\u544A\u8B66
-view_portlet_defaultName_recentlyAddedResources = \u65B0\u6DFB\u52A0\u8D44\u6E90
-view_portlet_defaultName_resourceMetric = \u516C\u7528\u8D44\u6E90\u56FE\u6807
-view_portlet_defaultName_resource_alerts = \u8D44\u6E90: \u544A\u8B66
-view_portlet_defaultName_resource_bundles = \u8D44\u6E90: \u7C7B\u53D1\u5E03
-view_portlet_defaultName_resource_config_updates = \u8D44\u6E90: \u914D\u7F6E\u66F4\u65B0
-view_portlet_defaultName_resource_events = \u8D44\u6E90: \u4E8B\u4EF6\u7EDF\u8BA1
-view_portlet_defaultName_resource_metrics = \u8D44\u6E90: \u5C5E\u6027
-view_portlet_defaultName_resource_oobs = \u8D44\u6E90: OOB Metrics
-view_portlet_defaultName_resource_operations = \u8D44\u6E90: \u64CD\u4F5C
-view_portlet_defaultName_resource_pkg_hisory = \u8D44\u6E90: \u5386\u53F2\u6570\u636E\u5305
-view_portlet_defaultName_tagCloud = \u6807\u7B7E\u4E91
-view_portlet_factory_invalidPortlet = \u8FD9\u662F\u4E00\u4E2A\u9648\u65E7\u5E76\u4E14\u5DF2\u7ECF\u5931\u6548\u7684portlet. \u8BF7\u5220\u9664.
-view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
-view_portlet_graph_configure_resource_graph = The resource to graph
-view_portlet_help_autodiscovery = \u6B64portlet\u5141\u8BB8\u5BFC\u5165 \u6216\u8005\u5931\u6548\u65B0\u53D1\u73B0\u7684\u8D44\u6E90. \u5BFC\u5165\u7684\u8D44\u6E90\u5C06\u4F1A\u6DFB\u52A0\u81F3\u76D1\u63A7\u548C\u7BA1\u7406\u6E05\u5355\u4E2D\uFF0C\u5931\u6548\u7684\u8D44\u6E90\u5C06\u4E0D\u4F1A\u88AB\u5BFC\u5165\u5E76\u4E14 \u662F\u4E0D\u53EF\u89C1\u7684\uFF0C\u9664\u975E\u660E\u786E\u6307\u5B9A\u4E0D\u53EF\u5931\u6548.
-view_portlet_help_bundle_deps = \u6B64portlet\u5C55\u793A\u57FA\u4E8E\u6807\u51C6\u914D\u7F6E\u663E\u793A\u7684\u76F8\u5173\u53D1\u5E03\u7C7B.
-view_portlet_help_config_updates = \u6B64portlet\u5C55\u793A\u4E0E\u914D\u7F6E\u8BBE\u7F6E\u517C\u5BB9\u7684\u6700\u65B0\u7684\u914D\u7F6E\u4FEE\u6539.
-view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
-view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
-view_portlet_help_graph = This portlet displays the resource metric graph.
-view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
-view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
-view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
-view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
-view_portlet_help_none = \u8FD9\u4E2Aportlet\u6CA1\u6709\u5E2E\u52A9.
-view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
-view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
-view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
-view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
-view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
-view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
-view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
-view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
-view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
-view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
-view_portlet_inventory_error1 = Failed to retrieve inventory summary
-view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
-view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
-view_portlet_message_title = \u663E\u793A\u4FE1\u606F.
-view_portlet_operations_config_completed = \u5DF2\u5B8C\u6210\u7684\u64CD\u4F5C
-view_portlet_operations_config_completed_enable = \u662F\u5426\u5BF9\u7EDF\u8BA1\u8868\u76D8\u7684\u5DF2\u5B8C\u6210\u64CD\u4F5C\u7684\u7ED3\u679C\u5206\u7EC4.
-view_portlet_operations_config_completed_maximum = \u80FD\u5C55\u793A\u7684\u5DF2\u5B8C\u6210\u64CD\u4F5C\u7684\u6700\u5927\u6570.
-view_portlet_operations_config_scheduled_enable = \u662F\u5426\u5BF9\u7EDF\u8BA1\u8868\u76D8\u7684\u8C03\u5EA6\u4E2D\u64CD\u4F5C\u7684\u7ED3\u679C\u5206\u7EC4.
-view_portlet_operations_config_scheduled_maximum = \u80FD\u5C55\u793A\u7684\u8C03\u5EA6\u64CD\u4F5C\u7684\u6700\u5927\u6570.
-view_portlet_operations_config_show_last = show last
-view_portlet_operations_config_show_next = show next
-view_portlet_operations_disabled = (\u76EE\u524D\u7ED3\u679C\u96C6\u7981\u7528.\u4FEE\u6539\u8BBE\u7F6E\u4F7F\u5176\u751F\u6548.
-view_portlet_platform_platform_error_1 = \u52A0\u8F7D\u5E73\u53F0\u6307\u6807\u5931\u8D25
-view_portlet_platform_type_error_1 = \u65E0\u6CD5\u52A0\u8F7D\u7C7B\u578B\u6570\u636E
-view_portlet_problemResources_config_display_maximum = \u80FD\u5C55\u793A\u7684\u95EE\u9898\u8D44\u6E90\u7684\u6700\u5927\u6570.
-view_portlet_problemResources_config_display_range = \u663E\u793A\u6570\u5C0F\u65F6\u5185\u6062\u590D\u6B63\u5E38\u7684\u95EE\u9898\u8D44\u6E90.
-view_portlet_problemResources_config_display_range2 = \u4ECE {0} \u5230 {1}
-view_portlet_problemResources_maxDisplaySetting = \u8D44\u6E90\u6700\u5927\u6570.
-view_portlet_recentAlerts_config_members = \u9009\u62E9\u6210\u5458
-view_portlet_recentAlerts_config_priority_label = \u4E4B\u524D\u7684\u544A\u8B66,
-view_portlet_recentAlerts_config_when = \u5728\u8FC7\u53BB
-view_portlet_recentAlerts_fail_msg = \u52A0\u8F7D\u544A\u8B66\u8FC7\u6EE4\u7684\u6307\u5B9A\u8D44\u6E90\u5931\u8D25.
-view_portlet_recentlyAdded_error1 = \u52A0\u8F7D\u6700\u65B0\u6DFB\u52A0\u7684\u8D44\u6E90\u5931\u8D25
-view_portlet_recentlyAdded_setting_addedPlatforms = \u65B0\u6DFB\u52A0\u5E73\u53F0
-view_portlet_results_empty = \u4F7F\u7528\u6307\u5B9A\u7684\u6807\u51C6\u65E0\u7ED3\u679C\u8FD4\u56DE.
-view_remoteAgentInstall_agentStatus = \u4EE3\u7406\u72B6\u6001
-view_remoteAgentInstall_agentStatusDefault = -\u5355\u51FB\u66F4\u65B0\u72B6\u6001\u6309\u94AE-
-view_remoteAgentInstall_buttonFindAgent = \u67E5\u627E\u4EE3\u7406
-view_remoteAgentInstall_connInfo = \u8FDE\u63A5\u4FE1\u606F
-view_remoteAgentInstall_error_1 = \u67E5\u627E\u4EE3\u7406\u5B89\u88C5\u8DEF\u5F84\u65F6\u53D1\u751F\u9519\u8BEF
-view_remoteAgentInstall_error_2 = \u65E0\u6CD5\u5728\u901A\u5E38\u4F4D\u7F6E\u53D1\u73B0\u5B89\u88C5\u7684\u4EE3\u7406
-view_remoteAgentInstall_error_3 = \u65E0\u6CD5\u770B\u5230\u5728[{0}]\u4E2D\u5B89\u88C5\u4E86\u4EE3\u7406
-view_remoteAgentInstall_error_4 = \u5B89\u88C5\u4EE3\u7406\u5931\u8D25
-view_remoteAgentInstall_error_5 = \u542F\u52A8\u4EE3\u7406\u5931\u8D25
-view_remoteAgentInstall_error_6 = \u505C\u6B62\u4EE3\u7406\u5931\u8D25
-view_remoteAgentInstall_installAgent = \u5B89\u88C5\u4EE3\u7406
-view_remoteAgentInstall_installInfo = \u4EE3\u7406\u5B89\u88C5\u4FE1\u606F
-view_remoteAgentInstall_installPath = \u4EE3\u7406\u5B89\u88C5\u8DEF\u5F84
-view_remoteAgentInstall_owner = \u6240\u6709\u8005
-view_remoteAgentInstall_promptHost = The host where the agent is or will be installed
-view_remoteAgentInstall_promptInstallPath = Where the agent is or will be installed. If you aren''t sure where an agent is installed, enter a parent directory and click the ''Find Agent'' button to scan that directory and below. If you enter an empty path, common locations are searched on the host for an agent install.
-view_remoteAgentInstall_promptPassword = The credentials that are used to authenticate the user on the host via SSH
-view_remoteAgentInstall_promptPort = The port the SSH server is listening to. If not specified, the default is 22
-view_remoteAgentInstall_promptUser = The name of the user whose credentials are passed to the host via SSH
-view_remoteAgentInstall_result = \u7ED3\u679C
-view_remoteAgentInstall_resultCode = ResultCode
-view_remoteAgentInstall_startAgent = \u542F\u52A8\u4EE3\u7406
-view_remoteAgentInstall_startAgentResults = \u4EE3\u7406\u542F\u52A8\u7ED3\u679C: [{0}]
-view_remoteAgentInstall_step = Step
-view_remoteAgentInstall_stopAgent = \u505C\u6B62\u4EE3\u7406
-view_remoteAgentInstall_stopAgentResults = \u4EE3\u7406\u505C\u6B62\u7ED3\u679C: [{0}]
-view_remoteAgentInstall_success = \u4EE3\u7406\u5B89\u88C5\u5B8C\u6210
-view_remoteAgentInstall_updateStatus = \u66F4\u65B0\u72B6\u6001
-view_reportsTop_description = \u8BE5\u90E8\u5206\u5185\u5BB9\u63D0\u4F9B\u4E86\u5168\u5C40\u62A5\u8868\u7684\u5165\u53E3.
-view_reportsTop_title = \u62A5\u8868
-view_reports_alertDefinitions = \u544A\u8B66\u5B9A\u4E49
-view_reports_alertDefinitions_parentHover = \u70B9\u51FB\u5230\u7236\u7EA7\u544A\u8B66\u83DC\u5355
-view_reports_alertDefinitions_resTypeLoadError = \u65E0\u6CD5\u83B7\u53D6\u8D44\u6E90\u6A21\u677F\u7C7B\u578B - \u65E0\u6CD5\u67E5\u770B\u544A\u8B66\u6A21\u677F.
-view_reports_inventorySummary_failFetch = \u83B7\u53D6\u7EDF\u8BA1\u6E05\u5355\u5931\u8D25
-view_reports_platforms = \u5E73\u53F0\u4F7F\u7528\u7387\u62A5\u8868
-view_reports_subsystems = \u5B50\u7CFB\u7EDF\u62A5\u8868
-view_resourceResourceGroupList_error_fetchFailure = \u83B7\u53D6\u8D44\u6E90\u7EC4\u4FE1\u606F\u5931\u8D25.
-view_resourceResourceGroupList_error_updateFailure = \u66F4\u65B0\u6307\u5B9A\u7684\u8D44\u6E90\u7EC4\u5931\u8D25.
-view_resourceResourceGroupList_message_updateSuccess = [{0}]\u7684\u7EC4\u6210\u5458\u5DF2\u7ECF\u66F4\u65B0.
-view_resource_inventory_activity_changed_by = Changed by
-view_resource_inventory_activity_criteria_no_recent_events = No event counts based off display criteria.
-view_resource_inventory_activity_no_recent_alerts = \u65E0\u6700\u65B0\u544A\u8B66
-view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
-view_resource_inventory_activity_no_recent_config_history = No configuration change history
-view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
-view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
-view_resource_inventory_activity_no_recent_oob = No OOB conditions found
-view_resource_inventory_activity_no_recent_operations = \u6CA1\u6709\u6700\u65B0\u64CD\u4F5C\u5386\u53F2
-view_resource_inventory_activity_no_recent_pkg_history = \u6CA1\u6709\u6700\u65B0\u5305\u5386\u53F2
-view_resource_inventory_childhistory_createdChild = Created Child
-view_resource_inventory_childhistory_deletedChild = Deleted Child
-view_resource_inventory_childhistory_filterTitle = Past N Days
-view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
-view_resource_inventory_childhistory_status_invalidConfig = \u65E0\u6548\u914D\u7F6E
-view_resource_monitor_availability_loadFailed = \u52A0\u8F7D\u53EF\u7528\u6027\u5386\u53F2\u8BB0\u5F55\u5931\u8D25
-view_resource_monitor_calltime_average = Average
-view_resource_monitor_calltime_count = Count
-view_resource_monitor_calltime_destination = Call Destination
-view_resource_monitor_calltime_editFailed = Call time data can not be edited
-view_resource_monitor_calltime_loadFailed = Could not load call time data
-view_resource_monitor_calltime_lookupFailed = Could not load resource for call time
-view_resource_monitor_calltime_maximum = Maximum
-view_resource_monitor_calltime_minimum = Minimum
-view_resource_monitor_calltime_title = Call Time Data
-view_resource_monitor_calltime_total = Total
-view_resource_monitor_detailed_graph_label = Detailed Graph
-view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
-view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
-view_resource_monitor_graphs_loadFailed = \u52A0\u8F7D\u7ED8\u56FE\u6570\u636E\u5931\u8D25
-view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
-view_resource_monitor_graphs_noneAvailable = No graphs available
-view_resource_monitor_schedules_title = Resource Metric Collection Schedules
-view_resource_monitor_table_alerts = Alerts
-view_resource_monitor_table_avg = Average
-view_resource_monitor_table_last = Last
-view_resource_monitor_table_max = Maximum
-view_resource_monitor_table_min = Minimum
-view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details
-view_resource_title_tagUpdateFailed = Failed to update resource tags
-view_searchBar_defaultPattern = \u5B9A\u4E49\u81EA\u5DF1\u7684\u6837\u5F0F
-view_searchBar_error_selectSavedSearch = ''\u9009\u62E9\u4FDD\u5B58\u7684\u641C\u7D22\u65F6\u51FA\u9519''
-view_searchBar_query = \u67E5\u8BE2
-view_searchBar_resourceGroups = \u8D44\u6E90\u7EC4
-view_searchBar_resources = \u8D44\u6E90
-view_searchBar_welcomeMessage = \u641C\u7D22\u4E86{0}\u79D2
-view_searchGUI_loginStatus = \u65E0\u6CD5\u786E\u5B9A\u767B\u5F55\u72B6\u6001\uFF0C\u8BF7\u68C0\u67E5\u670D\u52A1
-view_selector_assigned = \u6307\u5B9A\u7684 {0}
-view_selector_available = \u53EF\u7528\u7684 {0}
-view_subTab_error_disabled = \u65E0\u6CD5\u9009\u4E2D\u7981\u7528\u7684\u5B50\u8868 [{0}].
-view_summaryDashboard_resetConfirm = \u6062\u590D\u5230\u9ED8\u8BA4\u7684\u7EDF\u8BA1\u56FE\u8868 (\u653E\u5F03\u4E4B\u524D\u4FDD\u5B58\u7684\u4FE1\u606F)?
-view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].
-view_summaryOverviewForm_error_traitsLoadFailure = \u52A0\u8F7D {0}\u7684\u5C5E\u6027\u4FE1\u606F\u5931\u8D25.
-view_summaryOverviewForm_field_description = \u63CF\u8FF0
-view_summaryOverviewForm_field_location = \u4F4D\u7F6E
-view_summaryOverviewForm_field_name = \u5B57\u6BB5\u540D
-view_summaryOverviewForm_field_type = \u7C7B\u578B
-view_summaryOverviewForm_field_version = \u7248\u672C\u53F7
-view_summaryOverviewForm_header_summary = \u7EDF\u8BA1
-view_summaryOverviewForm_label_plugin = \u63D2\u4EF6\u6807\u7B7E:
-view_summaryOverviewForm_label_type = \u6807\u7B7E\u7C7B\u578B:
-view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
-view_summaryOverview_header_detectedErrors = \u5DF2\u68C0\u6D4B\u5230\u7684\u9519\u8BEF
-view_summaryOverview_title_errorDetailsWindow = \u9519\u8BEF\u8BE6\u7EC6
-view_summaryOverview_tooltip_detectedErrors = \u70B9\u51FB\u5BF9\u5E94\u7684\u884C\u67E5\u770B\u9519\u8BEF\u4FE1\u606F.
-view_tableSection_backButton = \u8FD4\u56DE\u5217\u8868
-view_tableSection_error_badId = \u65E0\u6CD5\u5C55\u793A [{0}]\u7684\u8BE6\u7EC6\u4FE1\u606F. \u65E0\u6548\u7684 'id': [{1}]. \u8BF7\u62A5\u544A\u6B64BUG
-view_tableSection_error_noId = \u8868\u5355 [{0}] \u8BB0\u5F55\u7F3A\u5C11'id'\u5C5E\u6027 - \u8BF7\u62A5\u544A\u6B64BUG.
-view_table_drawFail = \u751F\u6210\u8868\u683C[{0}]\u5931\u8D25.
-view_table_matchingRows = \u5339\u914D\u7684\u884C: {0} (\u9009\u4E2D: {1})
-view_table_totalRows = \u6240\u6709\u7684\u884C: {0} (\u9009\u4E2D: {1})
-view_tabs_common_activity = \u6D3B\u52A8
-view_tabs_common_agent = \u4EE3\u7406
-view_tabs_common_alerts = \u544A\u8B66
-view_tabs_common_availability = \u53EF\u7528\u6027
-view_tabs_common_calltime = Calltime
-view_tabs_common_child_history = \u5B50\u5386\u53F2
-view_tabs_common_child_resources = \u5B50\u8D44\u6E90
-view_tabs_common_configuration = \u914D\u7F6E
-view_tabs_common_connectionSettings = \u8FDE\u63A5\u8BBE\u7F6E
-view_tabs_common_connectionSettingsHistory = \u5386\u53F2\u8FDE\u63A5\u8BBE\u7F6E
-view_tabs_common_content = \u5185\u5BB9
-view_tabs_common_current = \u5F53\u524D
-view_tabs_common_dashboard = \u7EDF\u8BA1\u8868\u76D8
-view_tabs_common_definitions = \u5B9A\u4E49
-view_tabs_common_deployed = \u5DF2\u53D1\u5E03
-view_tabs_common_events = \u4E8B\u4EF6
-view_tabs_common_graphs = Graphs
-view_tabs_common_group_members = \u7EC4\u5458
-view_tabs_common_group_membership = \u7EC4\u6210\u5458\u5173\u7CFB
-view_tabs_common_groups = Groups
-view_tabs_common_history = \u5386\u53F2
-view_tabs_common_inventory = \u6E05\u5355
-view_tabs_common_members = Members
-view_tabs_common_monitoring = \u76D1\u63A7
-view_tabs_common_new = new
-view_tabs_common_operations = \u64CD\u4F5C
-view_tabs_common_overview = \u6982\u89C8
-view_tabs_common_schedule = \u8C03\u5EA6
-view_tabs_common_schedules = Schedules
-view_tabs_common_subscriptions = \u8FD0\u884C\u673A\u5236
-view_tabs_common_summary = \u6982\u8981
-view_tabs_common_tables = Tables
-view_tabs_common_timeline = \u65F6\u95F4\u8F74
-view_tabs_common_traits = Traits
-view_tabs_invalidSubTab = \u65E0\u6548\u7684\u5B50\u8868: {0}
-view_tabs_invalidTab = \u65E0\u6548\u7684\u8868: {0}
-view_tagCloud_deleteTag = \u5220\u9664\u6807\u7B7E
-view_tagCloud_deleteTagFailure = \u5220\u9664\u6807\u7B7E [{0}] \u5931\u8D25
-view_tagCloud_deleteTagSuccess = \u6210\u529F\u7684\u5220\u9664\u4E86\u6807\u7B7E [{0}]
-view_tagCloud_error_fetchFailure = \u52A0\u8F7D\u6807\u7B7E\u5931\u8D25.
-view_tagCloud_error_tagUsedCount = \u6807\u7B7E\u4F7F\u7528 {0} \u6B21.
-view_tagCloud_title = \u6807\u7B7E\u96C6
-view_taggedResources_title = \u8D44\u6E90
-view_tags_error_1 = \u52A0\u8F7D\u6807\u7B7E\u5931\u8D25
-view_tags_tags = \u6807\u7B7E
-view_tags_tooltip_1 = \u5220\u9664\u6807\u7B7E
-view_tags_tooltip_2 = \u7F16\u8F91\u6807\u7B7E
-view_tags_tooltip_3 = \u8F93\u5165\u6309\u7167\u4EE5\u4E0B\u683C\u5F0F\u7684\u6807\u7B7E: (namespace:)(semantic=)tagname (e.g. it:env=QA, or owner=John)
-view_testTop_description = \u8FD9\u90E8\u5206\u9875\u9762\u7528\u4E8E\u6D4B\u8BD5\u5404\u79CDGUI\u7EC4\u4EF6.
-view_testTop_title = \u6D4B\u8BD5
-view_titleBar_common_addedFav = \u6DFB\u52A0 [{0}]\u5230\u5E38\u7528\u83DC\u5355
-view_titleBar_common_addedFavFailure = \u6DFB\u52A0[{0}]\u5230\u6536\u85CF\u5939\u5931\u8D25
-view_titleBar_common_clickToAddFav = \u6DFB\u52A0\u5230\u6536\u85CF\u5939
-view_titleBar_common_clickToRemoveFav = \u5355\u51FB\u79FB\u51FA\u6536\u85CF\u5939
-view_titleBar_common_loadTagsFailure = \u4E3A[{0}]\u52A0\u8F7D\u6807\u7B7E\u5931\u8D25
-view_titleBar_common_removedFav = \u79FB\u52A8[{0}]\u5230\u5E38\u7528\u83DC\u5355
-view_titleBar_common_removedFavFailure = \u79FB\u52A8[{0}]\u5230\u5E38\u7528\u83DC\u5355\u5931\u8D25
-view_titleBar_common_updateTagsFailure = \u4E3A[{0}]\u66F4\u65B0\u6807\u7B7E\u5931\u8D25
-view_titleBar_common_updateTagsSuccessful = [{0}]\u7684\u6807\u7B7E\u5DF2\u7ECF\u66F4\u65B0
-view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
-view_titleBar_group_summary_collapsedTooltip = \u70B9\u51FB\u67E5\u770B\u6B64\u7EC4\u7684\u66F4\u591A\u4FE1\u606F
-view_titleBar_group_summary_expandedTooltip = \u70B9\u51FB\u9690\u85CF\u6B64\u7EC4\u7684\u66F4\u591A\u4FE1\u606F
-view_tree_common_contextMenu_addChartToDashboard = \u6DFB\u52A0\u56FE\u5230\u7EDF\u8BA1\u8868\u76D8[{0}]
-view_tree_common_contextMenu_editPluginConfiguration = \u7F16\u8F91[{0}]\u63D2\u4EF6\u914D\u7F6E
-view_tree_common_contextMenu_editResourceConfiguration = \u7F16\u8F91[{0}]\u8D44\u6E90\u914D\u7F6E
-view_tree_common_contextMenu_groupGraph = Group Metric Graph
-view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
-view_tree_common_contextMenu_loadFail_dashboards = \u52A0\u8F7D\u7528\u6237\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
-view_tree_common_contextMenu_loadFail_group = \u52A0\u8F7Dgroup for context menu\u5931\u8D25
-view_tree_common_contextMenu_loadFailed_dashboard = \u52A0\u8F7D\u7528\u6237\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
-view_tree_common_contextMenu_loadFailed_manualAddChildren = \u52A0\u8F7Dplatform manual add children\u5931\u8D25
-view_tree_common_contextMenu_measurements = Measurements
-view_tree_common_contextMenu_operations = \u64CD\u4F5C
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
-view_tree_common_contextMenu_resourceConfiguration = \u8D44\u6E90\u914D\u7F6E
-view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
-view_tree_common_contextMenu_saveChartToDashboardFailure = \u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
-view_tree_common_contextMenu_saveChartToDashboardSuccessful = \u6210\u529F\u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8 [{0}]
-view_tree_common_contextMenu_type_name_label = Type: {0}
-view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
-view_tree_common_loadFailed_children = \u52A0\u8F7D\u5B50\u8282\u70B9\u5931\u8D25
-view_tree_common_loadFailed_create = Failed to create view for this node
-view_tree_common_loadFailed_descendants = Failed to load descendants for tree
-view_tree_common_loadFailed_generic = \u52A0\u8F7D\u6811\u5931\u8D25
-view_tree_common_loadFailed_group = \u52A0\u8F7Did\u4E3A[{0}]\u7684\u7EC4\u5931\u8D25
-view_tree_common_loadFailed_groupTree = \u52A0\u8F7D\u7EC4\u6811\u5931\u8D25
-view_tree_common_loadFailed_node = \u52A0\u8F7D\u8FD9\u4E2A\u8282\u70B9\u6570\u636E\u5931\u8D25
-view_tree_common_loadFailed_root = \u52A0\u8F7D\u6811\u6839\u8282\u70B9\u5931\u8D25
-view_tree_common_loadFailed_selection = Failed to select this node
-view_tree_common_loadFailed_update = Failed to update view for this node
-view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
-view_type_parentId = \u7236ID
-view_type_resourceTypes = \u8D44\u6E90\u7C7B\u578B
-view_type_typeTreeLoadFailure = \u52A0\u8F7D\u8D44\u6E90\u7C7B\u578B\u6811\u5931\u8D25
-view_upload_alreadyUploaded = \u6587\u4EF6\u5DF2\u7ECF\u4E0A\u4F20
-view_upload_bundleDistFile = \u5206\u7C7B\u6587\u4EF6
-view_upload_error_bundleDistFile = \u4E0A\u4F20\u5206\u7C7B\u6587\u4EF6\u5931\u8D25
-view_upload_error_file = \u4E0A\u4F20\u6587\u4EF6\u51FA\u73B0\u9519\u8BEF
-view_upload_error_fileName = \u4E0A\u4F20\u6587\u4EF6 [{0}]\u51FA\u73B0\u9519\u8BEF
-view_upload_error_fileName_2 = \u4E0A\u4F20\u6587\u4EF6 [{0}]\u51FA\u73B0\u9519\u8BEF, \u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84.
-view_upload_error_packageVersionFile = \u4E0A\u4F20\u5305\u7248\u672C\u6587\u4EF6\u51FA\u73B0\u9519\u8BEF
-view_upload_error_results = \u4E0A\u4F20\u6587\u4EF6\u5931\u8D25, \u65E0\u6CD5\u9884\u6599\u7684\u7ED3\u679C: [{0}]
-view_upload_inProgress = \u65E0\u6CD5\u63D0\u4EA4, \u6587\u4EF6\u4E0A\u4F20\u6B63\u5728\u8FDB\u884C
-view_upload_prompt_1 = \u8BF7\u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\u4E0A\u4F20[{0}]
-view_upload_prompt_2 = \u8981\u4E0A\u4F20\u7684\u6587\u4EF6
-view_upload_success = \u6587\u4EF6\u4E0A\u4F20\u6210\u529F
-view_upload_tooltip_1a = \u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\u4E0A\u4F20,\u7136\u540E\u70B9\u51FBUpload\u6216\u8005Next
-view_upload_tooltip_1b = \u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\u4E0A\u4F20, \u7136\u540E\u70B9\u51FB Next
-view_upload_tooltip_2 = \u6587\u4EF6\u4E0A\u4F20 \u524D\u53D1\u751F\u9519\u8BEF
-view_upload_upload = \u4E0A\u4F20
-view_upload_uploadFile = \u4E0A\u4F20\u6587\u4EF6
-
-widget_colorPicker_tooltip = \u9009\u62E9\u989C\u8272
-widget_durationItem_inputUnitLessThanTargetUnit = \u8F93\u5165\u5355\u4F4D\u662F\u5C0F\u4E8E\u76EE\u6807\u5355\u4F4D.
-widget_durationItem_unitTypeNotSupported = \u5355\u4F4D\u7C7B\u578B[{0}]\u4E0D\u88ABDurationItem\u652F\u6301.
-widget_jobTriggerEditor_fieldHelp_repeatDuration = keep running this operation this many times or until this amount of time has elapsed
-widget_jobTriggerEditor_fieldHelp_repeatInterval = \u591A\u4E45\u6267\u884C\u64CD\u4F5C
-widget_jobTriggerEditor_fieldHelp_startDelay = \u6267\u884C\u64CD\u4F5C\u5EF6\u65F6
-widget_jobTriggerEditor_field_cronExpression = Cron\u8868\u8FBE\u5F0F
-widget_jobTriggerEditor_field_mode = Schedule using
-widget_jobTriggerEditor_field_repeatInterval_later = \u91CD\u590D\u6BCF
-widget_jobTriggerEditor_field_repeatInterval_now = Run now and every
-widget_jobTriggerEditor_field_startType = Run
-widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = \u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65F6\u95F4.
-widget_jobTriggerEditor_message_endTimeMustBeInFuture = \u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u662F\u672A\u6765\u65F6\u95F4.
-widget_jobTriggerEditor_message_startTimeMustBeInFuture = \u5F00\u59CB\u65F6\u95F4\u5FC5\u987B\u662F\u672A\u6765\u65F6\u95F4.
-widget_jobTriggerEditor_tab_examples = \u4F8B\u5B50
-widget_jobTriggerEditor_tab_format = \u683C\u5F0F
-widget_jobTriggerEditor_value_calendar = \u65E5\u5386
-widget_jobTriggerEditor_value_cronExpression = Cron\u8868\u8FBE\u5F0F
-widget_jobTriggerEditor_value_for = For
-widget_jobTriggerEditor_value_in = in
-widget_jobTriggerEditor_value_indefinitely = Indefinitely
-widget_jobTriggerEditor_value_later = Later
-widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
-widget_jobTriggerEditor_value_now = Now
-widget_jobTriggerEditor_value_nowAndRepeat = Now & Repeat
-widget_jobTriggerEditor_value_on = on
-widget_jobTriggerEditor_value_until = \u76F4\u5230
-widget_recordEditor_error_invalidViewPath = \u67E5\u770B\u8DEF\u5F84\u65E0\u6548: [{0}]
-widget_recordEditor_error_multipleRecords = \u591A\u6761\u8BB0\u5F55\u8FD4\u56DE- \u9884\u671F\u53EA\u6709\u4E00\u4E2A.
-widget_recordEditor_error_noRecords = \u65E0\u8BB0\u5F55\u8FD4\u56DE - \u9884\u671F\u6709\u4E00\u6761.
-widget_recordEditor_error_operation = \u64CD\u4F5C\u5931\u8D25.\u6709\u9519\u8BEF\u53D1\u751F
-widget_recordEditor_error_operationInvalidValues = \u64CD\u4F5C\u5931\u8D25-\u4E00\u4E2A\u6216\u591A\u4E2A\u5B57\u6BB5\u7684\u503C\u65E0\u6548
-widget_recordEditor_error_permissionCreate = \u4F60\u6CA1\u6709\u521B\u5EFA\u65B0[{0}]\u7684\u6743\u9650
-widget_recordEditor_error_unsupportedOperationType = \u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7C7B\u578B: [{0}]
-widget_recordEditor_info_recordCreatedConcise = {0} created.
-widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created.
-widget_recordEditor_info_recordUpdatedConcise = {0} updated.
-widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
-widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
-widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
-widget_recordEditor_label_loading = \u52A0\u8F7D\u4E2D...
-widget_recordEditor_title_edit = \u7F16\u8F91{0} [{1}]
-widget_recordEditor_title_new = \u65B0\u5EFA{0}
-widget_recordEditor_title_view = \u67E5\u770B{0} [{1}]
-widget_recordEditor_warn_validation = \u4E00\u4E2A\u6216\u591A\u4E2A\u5B57\u6BB5\u7684\u503C\u65E0\u6548. \u53EA\u6709\u5B57\u6BB5\u6709\u6548\u65F6\uFF0C[{0}]\u624D\u80FD\u4FDD\u5B58
-widget_resourceFactoryWizard_archPrompt = \u5305\u67B6\u6784
-widget_resourceFactoryWizard_configTemplatePrompt = \u8D44\u6E90\u914D\u7F6E\u6A21\u677F
-widget_resourceFactoryWizard_contentTemplatePrompt = \u53D1\u5E03\u65F6\u95F4\u914D\u7F6E\u6A21\u677F
-widget_resourceFactoryWizard_createSubmit = \u521B\u5EFA\u8D44\u6E90[{0}]\u6210\u529F.
-widget_resourceFactoryWizard_createSubmitType = \u521B\u5EFA\u7C7B\u578B[{0}]\u7684\u8D44\u6E90\u8BF7\u6C42\u63D0\u4EA4\u6210\u529F.
-widget_resourceFactoryWizard_createWizardTitle = \u521B\u5EFA\u7C7B\u578B[{0}]\u7684\u65B0\u8D44\u6E90
-widget_resourceFactoryWizard_createWizardWindowTitle = \u8D44\u6E90\u521B\u5EFA\u5411\u5BFC
-##widget_resourceFactoryWizard_editConfigStepName = Deployment Options
-widget_resourceFactoryWizard_execute1 = \u521B\u5EFA\u8D44\u6E90\u5931\u8D25 - \u6CA1\u6709\u5305\u7248\u672C
-widget_resourceFactoryWizard_execute2 = \u521B\u5EFA\u8D44\u6E90\u5931\u8D25
-widget_resourceFactoryWizard_failedToDeleteVersion = \u53D6\u6D88\u521B\u5EFA\u8D44\u6E90\u65F6\u65E0\u6CD5\u5220\u9664\u5305\u7684\u7248\u672C
-widget_resourceFactoryWizard_failedToGetType = Failed to get backing package type for new resource
-widget_resourceFactoryWizard_importFailure = \u624B\u5DE5\u5BFC\u5165\u8D44\u6E90\u5931\u8D25
-widget_resourceFactoryWizard_importSubmitted = \u5BFC\u5165\u7C7B\u578B[{0}]\u7684\u65B0\u8D44\u6E90\u8BF7\u6C42\u5DF2\u88AB\u63D0\u4EA4
-widget_resourceFactoryWizard_importWizardTitle = \u5BFC\u5165\u7C7B\u578B[{0}]\u7684\u8D44\u6E90
-widget_resourceFactoryWizard_importWizardWindowTitle = \u5BFC\u5165\u8D44\u6E90\u5411\u5BFC
-widget_resourceFactoryWizard_infoStepName = \u8D44\u6E90\u6D88\u606F
-widget_resourceFactoryWizard_infoStep_loadFail = \u65E0\u6CD5\u53D6\u5F97\u67B6\u6784
-widget_resourceFactoryWizard_namePrompt = \u65B0\u8D44\u6E90\u540D
-widget_resourceFactoryWizard_templatePrompt = \u8FDE\u63A5\u8BBE\u7F6E\u6A21\u677F
-##widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
-widget_resourceFactoryWizard_uploadFailure = \u4E0A\u4F20\u6587\u4EF6\u5931\u8D25
-widget_resourceFactoryWizard_uploadFileStepName = \u4E0A\u4F20\u8D44\u6E90Content\u6587\u4EF6
-widget_resourceFactoryWizard_uploadInProgress = \u6B63\u5728\u4E0A\u4F20\u4E2D... \u5927\u7684\u53D1\u5E03\u6587\u4EF6\u9700\u8981\u6D88\u8017\u6570\u5206\u949F\u5B8C\u6210.
-widget_resourceFactoryWizard_versionPrompt = \u5305\u7248\u672C
-widget_resourceSelector_groupCategory = \u7EC4\u7C7B\u522B
-widget_resourceSelector_pleaseSelectMultipleResource = \u8BF7\u9009\u62E9\u4E00\u4E2A\u6216\u591A\u4E2A\u8D44\u6E90
-widget_resourceSelector_pleaseSelectResource = \u8BF7\u9009\u62E9\u8D44\u6E90
-widget_resourceSelector_selectMultipleResources = \u9009\u62E9\u8D44\u6E90
-widget_resourceSelector_selectResource = \u9009\u62E9\u8D44\u6E90
-widget_typeCache_loadFail = \u65E0\u6CD5\u52A0\u8F7D\u8D44\u6E90\u7C7B\u578B\u7684\u5143\u6570\u636E
-widget_typeTree_badTemplateType = \u65E0\u6548\u7684URL. \u672A\u77E5\u6A21\u677F\u7C7B\u578B[{0}]
-widget_typeTree_badTypeId = \u65E0\u6548URL. \u9519\u8BEF\u8D44\u6E90\u7C7B\u578BID [{0}]
-widget_typeTree_loadFail = \u52A0\u8F7D\u8D44\u6E90\u7C7B\u578B\u5931\u8D25
+#
+# RHQ GUI i18n Messages - Localization: ZH
+#
+# Developers: See the following wiki page for how to work with this file:
+#
+# http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles
+#
+###################################
+common_alert_high = High
+common_alert_low = Low
+common_alert_medium = Medium
+common_buildInfo_gwtVersion = ${gwt.version}
+common_button_ack = \u786E\u8BA4
+common_button_ack_all = \u786E\u8BA4\u6240\u6709
+common_button_add = \u6DFB\u52A0
+common_button_advanced = \u9AD8\u7EA7...
+common_button_apply = \u63A5\u53D7
+common_button_cancel = \u53D6\u6D88
+common_button_close = \u5173\u95ED
+common_button_compare = \u5BF9\u6BD4
+common_button_create_child = Create Child
+common_button_delete = \u5220\u9664
+common_button_delete_all = \u5220\u9664\u6240\u6709
+common_button_disable = \u7981\u7528
+common_button_edit = \u7F16\u8F91
+common_button_enable = \u542F\u7528
+common_button_finish = \u5B8C\u6210
+common_button_import = \u5BFC\u5165
+common_button_new = \u65B0\u5EFA
+common_button_next = \u4E0B\u4E00\u6B65
+common_button_ok = OK
+common_button_previous = \u4E0A\u4E00\u6B65
+common_button_purgeAll = \u6E05\u9664\u6240\u6709
+common_button_refresh = \u5237\u65B0
+common_button_reset = \u91CD\u7F6E
+common_button_save = \u4FDD\u5B58
+common_button_schedule = \u8BA1\u5212
+common_button_search = \u68C0\u7D22
+common_button_set = Set
+common_button_showDetails = \u67E5\u770B\u8BE6\u60C5...
+common_button_uninventory = Uninventory
+common_calendar_april_short = \u56DB\u6708
+common_calendar_august_short = \u516B\u6708
+common_calendar_december_short = \u5341\u4E8C\u6708
+common_calendar_february_short = \u4E8C\u6708
+common_calendar_january_short = \u4E00\u6708
+common_calendar_july_short = \u4E03\u6708
+common_calendar_june_short = \u516D\u6708
+common_calendar_march_short = \u4E09\u6708
+common_calendar_may_short = \u4E94\u6708
+common_calendar_november_short = \u5341\u4E00\u6708
+common_calendar_october_short = \u5341\u6708
+common_calendar_september_short = \u4E5D\u6708
+common_label_ago = ago
+common_label_all = \u6240\u6709
+common_label_all_resources = \u6240\u6709\u8D44\u6E90
+common_label_day = \u5929
+common_label_days = \u5929
+common_label_hour = \u5C0F\u65F6
+common_label_hours = \u5C0F\u65F6
+common_label_item = \u9879
+common_label_items = \u9879
+common_label_milliseconds = \u6BEB\u79D2
+common_label_minutes = \u5206\u949F
+common_label_month = \u6708
+common_label_none = \u65E0
+common_label_role = \u89D2\u8272
+common_label_roles = \u89D2\u8272
+common_label_scheduled_operations = \u8BA1\u5212\u64CD\u4F5C
+common_label_seconds = \u79D2
+common_label_selected_resources = \u5DF2\u9009\u8D44\u6E90
+common_label_unlimited = \u65E0\u9650\u5236
+common_label_user = \u7528\u6237
+common_label_users = \u7528\u6237
+common_label_week = \u5468
+common_label_weeks = \u5468
+common_label_yesterday = \u6628\u5929
+common_msg_areYouSure = \u4F60\u786E\u5B9A?
+common_msg_asyncTimeout = {0}. \u56E0\u4E3A\u670D\u52A1\u5668\u54CD\u5E94\u65F6\u95F4\u592A\u957F. \u8BF7\u6CE8\u610F\u670D\u52A1\u5668\u53EF\u80FD\u4ECD\u5728\u5904\u7406\u60A8\u7684\u8BF7\u6C42\uFF0C\u5E76\u53EF\u80FD\u5728\u77ED\u671F\u5185\u5B8C\u6210. \u4F60\u53EF\u4EE5\u68C0\u67E5\u670D\u52A1\u5668\u65E5\u5FD7\uFF0C\u67E5\u770B\u662F\u5426\u51FA\u73B0\u4EFB\u4F55\u4E0D\u6B63\u5E38\u7684\u9519\u8BEF.
+common_msg_changeAutoDetected = Change auto-detected
+common_msg_deleteConfirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664# selected {0}?
+common_msg_emphasizedNotePrefix = \u6CE8\u610F:
+common_msg_loading = \u52A0\u8F7D\u4E2D...
+common_msg_noItemsToShow = \u6CA1\u6709\u6761\u76EE\u663E\u793A
+common_msg_notYetImplemented = \u5C1A\u672A\u5B9E\u73B0
+common_msg_see_more = \u67E5\u770B\u66F4\u591A...
+common_msg_step_x_of_y = Step {0} of {1}
+common_severity_debug = Debug
+common_severity_error = Error
+common_severity_fatal = Fatal
+common_severity_info = Info
+common_severity_warn = Warn
+common_status_canceled = Canceled
+common_status_deferred = Deferred
+common_status_failed = Failed
+common_status_inprogress = In Progress
+common_status_nochange = No Change
+common_status_partial = Partial
+common_status_success = Success
+common_status_timedOut = Timed Out
+common_status_unknown = Unknown
+common_title_add_column = \u6DFB\u52A0\u5217
+common_title_add_graph_to_view = \u6DFB\u52A0\u56FE\u5230\u76D1\u89C6\u89C6\u56FE
+common_title_add_portlet = \u6DFB\u52A0Portlet
+common_title_address = \u5730\u5740
+common_title_alert_range = \u544A\u8B66\u8303\u56F4
+common_title_ancestry = \u7956\u5148
+common_title_availability = \u53EF\u7528\u6027
+common_title_available_resources = \u53EF\u7528\u7684\u8D44\u6E90
+common_title_average_metrics = \u5E73\u5747\u6BCF\u5206\u949F\u6307\u6807
+common_title_background = \u80CC\u666F\u8272
+common_title_bundle = Bundle
+common_title_bundles = Bundles
+common_title_category = \u7C7B\u522B
+common_title_change_refresh_time = \u5237\u65B0\u95F4\u9694
+common_title_columns = \u5217
+common_title_compare_metrics = \u6307\u6807\u5BF9\u6BD4
+common_title_compatibleGroups = \u517C\u5BB9\u7EC4
+common_title_compatibleGroups_total = \u6240\u6709\u517C\u5BB9\u7EC4
+common_title_component_errors = \u7EC4\u4EF6\u9519\u8BEF
+common_title_config_update_status = \u66F4\u65B0\u72B6\u6001
+common_title_configuration = \u914D\u7F6E
+common_title_count = \u6570
+common_title_custom = \u81EA\u5B9A\u4E49
+common_title_dashboard_name = \u7EDF\u8BA1\u8868\u76D8\u540D
+common_title_dateCreated = \u521B\u5EFA\u65E5\u671F
+common_title_dateRange = \u65E5\u671F\u8303\u56F4
+common_title_default = \u9ED8\u8BA4
+common_title_description = \u63CF\u8FF0
+common_title_details = \u8BE6\u7EC6
+common_title_display = \u663E\u793A
+common_title_display_name = \u663E\u793A\u540D
+common_title_duration = \u95F4\u9694
+common_title_edit_mode = \u7F16\u8F91\u6A21\u5F0F
+common_title_enabled = \u542F\u7528?
+common_title_end = End
+common_title_error = Error
+common_title_generalProp = \u57FA\u672C\u5C5E\u6027
+common_title_group = \u7EC4
+common_title_group_def_total = \u5B9A\u4E49\u7EC4\u603B\u6570
+common_title_group_member_health = Group Member Health
+common_title_groups = \u7EC4
+common_title_help = \u5E2E\u52A9
+common_title_host = \u4E3B\u673A
+common_title_id = ID
+common_title_id_parent = \u7236ID
+common_title_info = Info
+common_title_inventory = \u6E05\u5355
+common_title_inventorySummary = \u6E05\u5355\u6C47\u603B
+common_title_lastUpdated = \u6700\u8FD1\u66F4\u65B0
+common_title_lastUpdatedBy = \u6700\u8FD1\u66F4\u65B0\u8005
+common_title_ldapGroups = LDAP\u7EC4
+common_title_mashup = Mashup
+common_title_members_reporting = \u7EC4\u62A5\u8868
+common_title_message = \u6D88\u606F
+common_title_metric = Metric
+common_title_metric_chart = Metric\u56FE\u8868
+common_title_mixedGroups = \u6DF7\u5408\u7EC4
+common_title_mixedGroups_total = \u6240\u6709\u6DF7\u5408\u7EC4
+common_title_name = \u540D\u79F0
+common_title_new_dashboard = \u65B0\u5EFA\u7EDF\u8BA1\u8868\u76D8
+common_title_numeric_metrics = \u6570\u5B57\u578B\u6307\u6807
+common_title_numeric_type = \u6570\u5B57\u7C7B\u578B
+common_title_operation_status = \u64CD\u4F5C\u72B6\u6001
+common_title_operations = \u64CD\u4F5C
+common_title_operations_range = \u64CD\u4F5C\u8303\u56F4
+common_title_over = Over
+common_title_password = \u5BC6\u7801
+common_title_path = Path
+common_title_permissions = \u6743\u9650
+common_title_platform = \u5E73\u53F0
+common_title_platform_total = \u6240\u6709\u5E73\u53F0
+common_title_plugin = \u63D2\u4EF6
+common_title_port = \u7AEF\u53E3
+common_title_providers = \u63D0\u4F9B\u8005
+common_title_recent_alerts = \u6700\u8FD1\u544A\u8B66
+common_title_recent_bundle_deployments = \u6700\u8FD1\u53D1\u5E03Bundles
+common_title_recent_configuration_updates = \u6700\u8FD1\u914D\u7F6E\u66F4\u65B0
+common_title_recent_event_counts = \u6700\u8FD1\u4E8B\u4EF6\u6570
+common_title_recent_measurements = Recent Measurements
+common_title_recent_oob_metrics = Recent Out of Bound metrics
+common_title_recent_operations = \u6700\u8FD1\u64CD\u4F5C
+common_title_recent_pkg_history = \u6700\u8FD1\u5386\u53F2\u5305
+common_title_recently_added = \u6700\u8FD1\u6DFB\u52A0
+common_title_remove_column = \u79FB\u9664\u5217
+common_title_repositories = \u5E93
+common_title_resource = \u8D44\u6E90
+common_title_resourceGroups = \u8D44\u6E90\u7EC4
+common_title_resource_group = \u8D44\u6E90\u7EC4
+common_title_resource_id = \u8D44\u6E90ID
+common_title_resource_inventory = \u8D44\u6E90\u6E05\u5355
+common_title_resource_key = \u8D44\u6E90Key
+common_title_resource_name = \u8D44\u6E90\u540D
+common_title_resource_type = \u8D44\u6E90\u7C7B\u578B
+common_title_resources = \u8D44\u6E90
+common_title_results_count = \u7ED3\u679C\u6570\u91CF
+common_title_results_count_tooltip = \u663E\u793A\u7ED3\u679C\u6570\u91CF
+common_title_role = \u89D2\u8272
+common_title_roles = \u89D2\u8272
+common_title_scheduled_operations = \u8BA1\u5212\u64CD\u4F5C
+common_title_search = \u641C\u7D22
+common_title_selected_resources = \u9009\u62E9\u7684\u8D44\u6E90
+common_title_server = \u670D\u52A1\u5668
+common_title_server_total = \u670D\u52A1\u5668\u603B\u6570
+common_title_service = \u670D\u52A1
+common_title_service_total = \u670D\u52A1\u603B\u6570
+common_title_settings = \u8BBE\u7F6E
+common_title_show = \u663E\u793A
+common_title_show_more = \u663E\u793A\u6240\u6709...
+common_title_sort_order = \u6392\u5E8F
+common_title_sort_order_tooltip = \u8BBE\u7F6E\u6392\u5E8F\u65B9\u5F0F.
+common_title_start = \u5F00\u59CB
+common_title_status = \u72B6\u6001
+common_title_stop = \u505C\u6B62
+common_title_summary = \u7EDF\u8BA1
+common_title_tag_cloud = \u6807\u7B7E\u4E91
+common_title_the = The
+common_title_timestamp = \u65E5\u671F/\u65F6\u95F4
+common_title_total = \u603B\u6570
+common_title_type = \u7C7B\u578B
+common_title_units = \u5355\u4F4D
+common_title_user = \u7528\u6237
+common_title_users = \u7528\u6237
+common_title_value = \u503C
+common_title_version = \u7248\u672C
+common_title_view_mode = \u67E5\u770B\u6A21\u5F0F
+common_title_web_address = Web\u5730\u5740
+common_title_welcome = \u6B22\u8FCE
+common_unit_days = \u5929
+common_unit_hours = \u5C0F\u65F6
+common_unit_milliseconds = \u6BEB\u79D2
+common_unit_minutes = \u5206\u949F
+common_unit_months = \u6708
+common_unit_seconds = \u79D2
+common_unit_times = \u6B21
+common_unit_weeks = \u5468
+common_unit_years = \u5E74
+common_val_for = for
+common_val_n1st = {0}st
+common_val_n2nd = {0}nd
+common_val_n3rd = {0}rd
+common_val_na = N/A
+common_val_never = Never
+common_val_no = No
+common_val_no_lower = no
+common_val_none = None
+common_val_nth = {0}th
+common_val_yes = Yes
+common_val_yes_lower = yes
+dataSource_ContentRepoTree_error_load = \u52A0\u8F7D\u5E93\u9519\u8BEF
+dataSource_ContentRepoTree_field_parentId = \u7236ID
+dataSource_bundle_loadFailed = \u52A0\u8F7Dbundle\u6570\u636E\u5931\u8D25
+dataSource_configurationHistory_clickToSeeError = \u53CC\u51FB\u67E5\u770B\u9519\u8BEF...
+dataSource_configurationHistory_currentConfig = \u8FD9\u662F\u5F53\u524D\u914D\u7F6E
+dataSource_configurationHistory_dateCompleted = \u5B8C\u6210\u65E5\u671F
+dataSource_configurationHistory_dateSubmitted = \u63D0\u4EA4\u65E5\u671F
+dataSource_configurationHistory_error_fetchFailure = \u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2\u914D\u7F6E.
+dataSource_configurationHistory_updateType = \u66F4\u65B0\u7C7B\u578B
+dataSource_configurationHistory_updateType_group = \u7EC4
+dataSource_configurationHistory_updateType_individual = Individual
+dataSource_definitions_loadFailed = \u65E0\u6CD5\u52A0\u8F7D\u6307\u6807\u5B9A\u4E49
+dataSource_measurementOob_error_fetchFailure = \u52A0\u8F7Dmeasurement OOB information\u5931\u8D25
+dataSource_measurementOob_field_factor = Out of Range Factor (%)
+dataSource_measurementOob_field_formattedBaseband = Band
+dataSource_measurementOob_field_formattedOutlier = Outlier
+dataSource_measurementOob_field_parentName = \u7236
+dataSource_measurementOob_field_resourceName = \u8D44\u6E90
+dataSource_measurementOob_field_scheduleName = \u6307\u6807
+dataSource_operationHistory_error_fetchFailure = \u52A0\u8F7D\u5386\u53F2\u64CD\u4F5C\u5931\u8D25.
+dataSource_operationHistory_field_createdTime = \u521B\u5EFA\u65F6\u95F4
+dataSource_operationHistory_field_operationName = \u64CD\u4F5C\u540D
+dataSource_operationHistory_field_startedTime = \u5F00\u59CB\u65F6\u95F4
+dataSource_operationHistory_field_subject = Requester
+dataSource_operationSchedule_field_description = \u6CE8\u610F
+dataSource_operationSchedule_field_id = \u8BA1\u5212\u4EFB\u52A1ID
+dataSource_operationSchedule_field_nextFireTime = \u4E0B\u6B21\u89E6\u53D1\u65F6\u95F4
+dataSource_operationSchedule_field_operationDisplayName = \u64CD\u4F5C
+dataSource_operationSchedule_field_operationName = \u64CD\u4F5C
+dataSource_operationSchedule_field_subject = \u6240\u6709\u8005
+dataSource_operationSchedule_field_timeout = \u8D85\u65F6(\u79D2)
+dataSource_platforms_field_cpu = CPU
+dataSource_platforms_field_memory = \u5185\u5B58
+dataSource_platforms_field_swap = \u4EA4\u6362\u533A
+dataSource_problemResources_error_fetchFailure = \u52A0\u8F7D\u544A\u8B66/\u4E0D\u53EF\u7528\u8D44\u6E90\u5931\u8D25.
+dataSource_problemResources_field_alerts = \u544A\u8B66
+dataSource_problemResources_field_available = \u5F53\u524D\u53EF\u7528\u6027
+dataSource_recentOperations_error_fetchFailure = \u52A0\u8F7D\u6700\u8FD1\u64CD\u4F5C\u5931\u8D25.
+dataSource_recentOperations_field_location = \u4F4D\u7F6E
+dataSource_recentOperations_field_operation = \u64CD\u4F5C
+dataSource_recentOperations_field_resource = \u8D44\u6E90
+dataSource_recentOperations_field_status = \u72B6\u6001
+dataSource_recentOperations_field_time = \u65E5\u671F/\u65F6\u95F4
+dataSource_resourceErrors_clickStatusIcon = \u70B9\u51FB\u56FE\u6807\u67E5\u770B\u8BE6\u60C5
+dataSource_resourceErrors_deleteFailure = \u5220\u9664\u8D44\u6E90\u9519\u8BEF\u5931\u8D25
+dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
+dataSource_resourceErrors_error_fetchFailure = Failed to find Resource errors for Resource with id [{0}].
+dataSource_resourceErrors_field_errorType = \u9519\u8BEF\u7C7B\u578B
+dataSource_resourceErrors_field_summary = \u7EDF\u8BA1
+dataSource_resourceErrors_field_timeOccured = \u65F6\u95F4
+dataSource_resourceGroups_loadFailed = \u52A0\u8F7D\u8D44\u6E90\u7EC4\u5931\u8D25
+dataSource_resources_field_discoveryTime = \u53D1\u73B0\u65F6\u95F4
+dataSource_resources_field_importTime = \u5BFC\u5165\u65F6\u95F4
+dataSource_resources_field_key = Key
+dataSource_resources_field_lastModifiedTime = \u6700\u8FD1\u66F4\u6539\u65F6\u95F4
+dataSource_resources_field_lastModifier = \u6700\u8FD1\u4FEE\u6539\u8005
+dataSource_resources_field_location = \u4F4D\u7F6E
+dataSource_rpc_error_transformRequestFailure = Failure in datasource while processing {0} request.
+dataSource_rpc_error_unsupportedArrayFilterType = No support for passing array filters of type {0}.
+dataSource_rpc_error_unsupportedEnumType = Please add an appropriate code block for enum {0} to RPCDataSource.getEnumArray(Class)
+dataSource_rpc_no = no
+dataSource_rpc_yes = yes
+dataSource_scheduledOperations_error_fetchFailure = \u65E0\u6CD5\u8F7D\u5165\u8BA1\u5212\u64CD\u4F5C.
+dataSource_scheduledOperations_field_location = \u4F4D\u7F6E
+dataSource_scheduledOperations_field_operation = \u64CD\u4F5C
+dataSource_scheduledOperations_field_resource = \u8D44\u6E90
+dataSource_scheduledOperations_field_time = \u65E5\u671F/\u65F6\u95F4
+dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
+dataSource_schedules_disableSuccessful_full_group = You have disabled the collection of [{0}] measurements for the resource group with ID [{1}]. The disabled measurements are: [{2}]
+dataSource_schedules_disableSuccessful_full_resource = You have disabled the collection of [{0}] measurements for the resource with ID [{1}]. The disabled measurements are: [{2}]
+dataSource_schedules_enableFailure_group = Failed to enable the collection of [{0}] metrics for group with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_enableFailure_resource = Failed to enable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
+dataSource_schedules_enableSuccessful_concise = You have enabled the collection of [{0}] measurements
+dataSource_schedules_enableSuccessful_full_group = You have enabled the collection of [{0}] measurements for the resource group with ID [{1}]. The enabled measurements are: [{2}]
+dataSource_schedules_enableSuccessful_full_resource = You have enabled the collection of [{0}] measurements for the resource with ID [{1}]. The enabled measurements are: [{2}]
+dataSource_schedules_field_resourceGroupId = \u7EC4ID
+dataSource_schedules_loadFailed = \u52A0\u8F7D\u6307\u6807\u8BA1\u5212\u4EFB\u52A1\u5931\u8D25
+dataSource_schedules_loadFailedContext = Failed to load metric schedules for context [{0}]
+dataSource_schedules_loadFailedCriteria = Failed to load metric schedules for criteria [{0}]
+dataSource_schedules_updateFailure_group = Failed to set the collection interval of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
+dataSource_schedules_updateFailure_resource = Failed to set the collection interval of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]. The collection interval was to be [{3}] seconds.
+dataSource_schedules_updateSuccessful_concise = A new collection interval of [{0}] seconds has been set on [{1}] measurements
+dataSource_schedules_updateSuccessful_full_group = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource group with ID [{2}]. The updated measurements are: [{3}]
+dataSource_schedules_updateSuccessful_full_resource = A new collection interval of [{0}] seconds has been set on [{1}] measurements for resource with ID [{2}]. The updated measurements are: [{3}]
+dataSource_traits_failFetch = Failed to fetch traits for criteria [{0}].
+dataSource_traits_field_definitionID = Definition ID
+dataSource_traits_field_lastChanged = \u6700\u8FD1\u66F4\u6539
+dataSource_traits_field_primaryKey = \u4E3B\u952E
+dataSource_traits_field_trait = Trait
+dataSource_traits_group_field_groupId = \u7EC4ID
+dataSource_users_delete = \u5220\u9664\u7528\u6237[{0}]
+dataSource_users_deleteFailed = \u5220\u9664\u7528\u6237[{0}]\u5931\u8D25
+dataSource_users_field_department = \u90E8\u95E8
+dataSource_users_field_emailAddress = Email\u5730\u5740
+dataSource_users_field_factive = \u5141\u8BB8\u767B\u5F55?
+dataSource_users_field_firstName = \u540D
+dataSource_users_field_id = ID
+dataSource_users_field_lastName = \u59D3
+dataSource_users_field_ldap = LDAP\u767B\u5F55?
+dataSource_users_field_name = \u7528\u6237\u540D
+dataSource_users_field_password = \u5BC6\u7801
+dataSource_users_field_passwordVerify = \u786E\u8BA4\u5BC6\u7801
+dataSource_users_field_phoneNumber = \u7535\u8BDD\u53F7\u7801
+dataSource_users_invalidEmailAddress = \u90AE\u7BB1\u5730\u5740\u65E0\u6548.
+dataSource_users_passwordsDoNotMatch = \u5BC6\u7801\u4E0D\u5339\u914D.
+datasource_roles_field_ldapGroups = LDAP\u7EC4
+datasource_roles_field_permissions = \u6743\u9650
+datasource_roles_field_resourceGroups = \u8D44\u6E90\u7EC4
+datasource_roles_field_subjects = Subjects
+datasource_templateSchedules_disabled = \u7981\u7528\u9009\u62E9\u7684\u6307\u6807[{0}]\u91C7\u96C6.
+datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_disabled_failed = Failed to disable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled = Enabled collection of selected metric [{0}].
+datasource_templateSchedules_enabled_detailed = Enabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_enabled_failed = Failed to enable collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
+datasource_templateSchedules_updated = Updated collection intervals of selected metric [{0}].
+datasource_templateSchedules_updated_detail = Collection interval for metric [{0}] [{1}] by default for ResourceType with id [{2}] set to [{3}] seconds.
+datasource_templateSchedules_updated_failed = Failed to set collection interval to [{0}] seconds for metric [{1}] [{2}] by default for ResourceType with id [{3}].
+favorites = \u6536\u85CF\u5939
+favorites_groups = \u7EC4\u6536\u85CF\u5939
+favorites_recentlyViewed = \u6700\u8FD1\u67E5\u770B
+favorites_resources = \u8D44\u6E90\u6536\u85CF\u5939
+group_tree_partialClusterTooltip = \u9664\u53BB {1},{0}\u7684\u7EC4\u6210\u5458\u62E5\u6709 \u4E00\u4E2A''{2}''\u8D44\u6E90
+util_ancestry_parentAncestry = Parent Ancestry for:
+util_errorHandler_nullException = exception was null
+util_monitoringRequestCallback_error_checkServerStatusFailure = \u65E0\u6CD5\u786E\u5B9A\u767B\u5F55\u72B6\u6001- \u68C0\u67E5\u670D\u52A1\u5668\u72B6\u6001.
+util_rpcManager_activeRequests = {0}\u6FC0\u6D3B\u7684\u8BF7\u6C42
+util_userPerm_loadFailGlobal = \u65E0\u6CD5\u8F7D\u5165\u5168\u5C40\u6743\u9650- \u672A\u6388\u6743.
+util_userPerm_loadFailGroup = \u65E0\u6CD5\u8BBF\u95EE\u8D44\u6E90\u7EC4[{0}] - \u672A\u6388\u6743.
+util_userPerm_loadFailResource = \u65E0\u6CD5\u8BBF\u95EE\u8D44\u6E90[{0}] - \u672A\u6388\u6743.
+util_userSession_loadFailSubject = UserSessionManager: \u52A0\u8F7D\u7528\u6237\u4E3B\u9898\u5931\u8D25
+util_userSession_logoutFail = \u6CE8\u9500\u5931\u8D25.
+util_widgetsField_unlimited = \u65E0\u9650\u5236
+view_aboutBox_allRightsReserved = All Rights Reserved.
+view_aboutBox_buildNumber = \u4EA7\u54C1\u7F16\u8BD1\u53F7:
+view_aboutBox_failedToLoad = \u52A0\u8F7D\u4EA7\u54C1\u4FE1\u606F\u5931\u8D25.
+view_aboutBox_homepage = \u4E3B\u9875
+view_aboutBox_jbossByRedHat = JBoss by Red Hat
+view_aboutBox_title = \u5173\u4E8E {0}
+view_aboutBox_version = \u7248\u672C:
+view_adminConfig_downloads = \u4E0B\u8F7D
+view_adminConfig_plugins = \u63D2\u4EF6
+view_adminConfig_systemSettings = \u7CFB\u7EDF\u8BBE\u7F6E
+view_adminConfig_templates = \u6A21\u677F
+view_adminContent_contentSources = Content\u6E90
+view_adminContent_repositories = \u5E93
+view_adminRoles_assignedGroups = \u5206\u914D\u7684\u8D44\u6E90\u7EC4
+view_adminRoles_assignedSubjects = \u5206\u914D\u7684\u4E3B\u9898
+view_adminRoles_failLdap = \u65E0\u6CD5\u786E\u5B9ALDAP - \u5047\u5B9A\u6CA1\u6709LDAP.
+view_adminRoles_failLdapGroups = \u67E5\u8BE2\u6709\u6548LDAP\u7EC4\u5931\u8D25 - \u5047\u5B9A\u65E0DAP\u7EC4.
+view_adminRoles_failLdapGroupsRole = \u52A0\u8F7DLDAP\u7EC4\u89D2\u8272\u5931\u8D25.
+view_adminRoles_failRoles = \u53D6\u5F97\u89D2\u8272\u5931\u8D25.
+view_adminRoles_globalPerms = \u5168\u5C40\u6388\u6743
+view_adminRoles_ldapGroups = LDAP\u7EC4
+view_adminRoles_ldapGroupsReadOnly = LDAP\u7EC4\u6570\u636E\u4E3A\u53EA\u8BFB
+view_adminRoles_noItems = \u6CA1\u6709\u6761\u76EE\u663E\u793A
+view_adminRoles_noLdap = \u6CA1\u6709\u96C6\u6210LDAP\u5B89\u5168, \u5230<a {0}>{1}</a>.
+view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
+view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
+view_adminRoles_permissions_autoselecting_manageInventory_implied = Autoselected unselected Resource permissions, since MANAGE_INVENTORY implies all Resource permissions...
+view_adminRoles_permissions_autoselecting_manageSecurity_implied = Autoselected unselected permissions, since MANAGE_SECURITY implies all other permissions...
+view_adminRoles_permissions_globalPermissions = \u5168\u5C40\u6388\u6743
+view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} read permission cannot be deselected, unless the {0} write permission, which implies the read permission, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} permission cannot be deselected, unless Manage Inventory, which implies all Resource permissions, is deselected first.
+view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} permission cannot be deselected, unless the Manage Security permission, which implies all other permissions, is deselected first.
+view_adminRoles_permissions_isAuthorized = \u6388\u6743?
+view_adminRoles_permissions_isRead = \u8BFB?
+view_adminRoles_permissions_isWrite = \u5199?
+view_adminRoles_permissions_permDesc_manageBundles = \u80FD\u521B\u5EFA,\u66F4\u65B0\u6216\u8005\u5220\u9664\u63D0\u4F9B\u7684bundles(\u4EFB\u4F55\u4EBA\u90FD\u80FD\u67E5\u770B)
+view_adminRoles_permissions_permDesc_manageInventory = \u62E5\u6709\u6240\u6709\u8D44\u6E90\u6743\u9650, \u5982\u4E0B\u6240\u8FF0, \u5BF9\u6240\u6709\u8D44\u6E90; \u5177\u6709\u521B\u5EFA, \u66F4\u65B0, \u5220\u9664\u7EC4; \u80FD\u5BFC\u5165\u81EA\u52A8\u53D1\u73B0\u6216\u624B\u52A8\u53D1\u73B0\u7684\u8D44\u6E90
+view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
+view_adminRoles_permissions_permDesc_manageSecurity = \u80FD\u521B\u5EFA,\u66F4\u65B0,\u6216\u5220\u9664\u7528\u6237\u548C\u89D2\u8272 (\u4EFB\u4F55\u4EBA\u90FD\u6709\u67E5\u770B\u6743\u9650)
+view_adminRoles_permissions_permDesc_manageSettings = \u80FD\u4FEE\u6539RHQ\u670D\u52A1\u5668\u914D\u7F6E\u800C\u4E14\u80FD\u64CD\u4F5C\u4EFB\u4F55\u76F8\u5173\u7684\u670D\u52A1\u5668\u529F\u80FD
+view_adminRoles_permissions_permReadDesc_configure = \u67E5\u770B\u8D44\u6E90\u914D\u7F6E\u548C\u8D44\u6E90\u914D\u7F6E\u4FEE\u8BA2\u5386\u53F2
+view_adminRoles_permissions_permReadDesc_control = (IMPLIED) \u67E5\u770B\u53EF\u7528\u64CD\u4F5C\u548C\u64CD\u4F5C\u6267\u884C\u5386\u53F2
+view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) \u67E5\u770B\u5B50\u8D44\u6E90\u521B\u5EFA\u5386\u53F2
+view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) \u67E5\u770B\u5B50\u8D44\u6E90\u5220\u9664\u5386\u53F2
+view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
+view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) \u67E5\u770B\u544A\u8B66\u5B9A\u4E49\u548C\u544A\u8B66\u5386\u53F2
+view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) \u67E5\u770B\u5B89\u88C5\u7684\u548C\u53EF\u7528\u7684\u5305; \u67E5\u770B\u5305\u5B89\u88C5\u5386\u53F2
+view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED)\u67E5\u770B\u4E8B\u4EF6
+view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
+view_adminRoles_permissions_permWriteDesc_configure = \u66F4\u65B0\u8D44\u6E90\u914D\u7F6E; delete Resource configuration revision history items
+view_adminRoles_permissions_permWriteDesc_control = \u6267\u884C\u64CD\u4F5C; \u5220\u9664\u64CD\u4F5C\u6267\u884C\u5386\u53F2
+view_adminRoles_permissions_permWriteDesc_createChildResources = \u521B\u5EFA\u65B0\u7684\u5B50\u8D44\u6E90 (for child Resources of types that are creatable)
+view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory resources; delete Resources (for Resources of types that are deletable)
+view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
+view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
+view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
+view_adminRoles_permissions_permWriteDesc_manageEvents = \u5220\u9664\u4E8B\u4EF6
+view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
+view_adminRoles_permissions_perm_configure = \u914D\u7F6E
+view_adminRoles_permissions_perm_control = \u63A7\u5236
+view_adminRoles_permissions_perm_createChildResources = \u521B\u5EFA\u5B50\u8D44\u6E90
+view_adminRoles_permissions_perm_deleteChildResources = \u5220\u9664\u5B50\u8D44\u6E90
+view_adminRoles_permissions_perm_inventory = \u6E05\u5355
+view_adminRoles_permissions_perm_manageAlerts = \u7BA1\u7406\u544A\u8B66
+view_adminRoles_permissions_perm_manageBundles = \u7BA1\u7406Bundles
+view_adminRoles_permissions_perm_manageContent = \u7BA1\u7406Content
+view_adminRoles_permissions_perm_manageEvents = \u7BA1\u7406\u4E8B\u4EF6
+view_adminRoles_permissions_perm_manageInventory = \u7BA1\u7406\u6E05\u5355
+view_adminRoles_permissions_perm_manageMeasurements = \u7BA1\u7406\u6307\u6807
+view_adminRoles_permissions_perm_manageRepositories = \u7BA1\u7406\u5E93
+view_adminRoles_permissions_perm_manageSecurity = \u7BA1\u7406\u6743\u9650
+view_adminRoles_permissions_perm_manageSettings = \u7BA1\u7406\u914D\u7F6E
+view_adminRoles_permissions_read = \u8BFB:
+view_adminRoles_permissions_readAccessImplied = \u9ED8\u8BA4\u6709\u8BBF\u95EE{0}\u7684\u6743\u9650\u800C\u4E14\u65E0\u6CD5\u7981\u7528.
+view_adminRoles_permissions_resourcePermissions = \u8D44\u6E90\u6388\u6743
+view_adminRoles_permissions_write = \u5199:
+view_adminRoles_perms = \u6743\u9650
+view_adminRoles_resourcePerms = \u8D44\u6E90\u6388\u6743
+view_adminRoles_roleAdded = \u89D2\u8272[{0}]\u6DFB\u52A0.
+view_adminRoles_roleDeleteFailed = \u5220\u9664\u89D2\u8272[{0}]\u5931\u8D25.
+view_adminRoles_roleDeleted = \u89D2\u8272[{0}]\u5220\u9664.
+view_adminRoles_roleUpdateFailed = \u4FEE\u6539\u89D2\u8272[{0}]\u5931\u8D25.
+view_adminRoles_roleUpdated = \u89D2\u8272[{0}]\u66F4\u65B0\u4E86.
+view_adminSecurity_roles = \u89D2\u8272
+view_adminSecurity_users = \u7528\u6237
+view_adminTemplates_disabledAlertTemplates = \u7981\u7528\u544A\u8B66\u6A21\u677F
+view_adminTemplates_disabledMetricTemplates = \u7981\u7528\u6307\u6807\u6A21\u677F
+view_adminTemplates_editAlertTemplate = \u7F16\u8F91\u544A\u8B66\u6A21\u677F
+view_adminTemplates_editMetricTemplate = \u7F16\u8F91\u6307\u6807\u6A21\u677F
+view_adminTemplates_enabledAlertTemplates = \u542F\u7528\u544A\u8B66\u6A21\u677F
+view_adminTemplates_enabledMetricTemplates = \u542F\u7528\u6307\u6807\u6A21\u677F
+view_adminTemplates_platformServices = \u5E73\u53F0\u670D\u52A1
+view_adminTemplates_platforms = \u5E73\u53F0
+view_adminTemplates_prompt_disabledAlertTemplates = \u8FD9\u79CD\u8D44\u6E90\u7C7B\u578B\u521B\u5EFA\u800C\u7981\u7528\u7684\u544A\u8B66\u6A21\u677F\u6570
+view_adminTemplates_prompt_disabledMetricTemplates = Number of metric schedules that are disabled by default on this resource type
+view_adminTemplates_prompt_enabledAlertTemplates = \u8FD9\u79CD\u8D44\u6E90\u7C7B\u578B\u542F\u7528\u7684\u544A\u8B66\u6A21\u677F\u6570
+view_adminTemplates_prompt_enabledMetricTemplates = Number of metric schedules that are enabled by default on this resource type
+view_adminTemplates_servers = \u670D\u52A1\u5668
+view_adminTopology_affinityGroups = \u76F8\u5173\u7EC4
+view_adminTopology_agents = \u4EE3\u7406
+view_adminTopology_partitionEvents = Partition\u4E8B\u4EF6
+view_adminTopology_remoteAgentInstall = \u8FDC\u7A0B\u4EE3\u7406\u5B89\u88C5
+view_adminTopology_servers = \u670D\u52A1\u5668
+view_adminUsersDetails_dataTypeName = user
+view_adminUsersList_dataTypeName = user
+view_adminUsersList_dataTypeNamePlural = users
+view_admin_administration = \u7BA1\u7406
+view_admin_configuration = \u914D\u7F6E
+view_admin_content = Content
+view_admin_downloads_agentDownload = \u4EE3\u7406\u4E0B\u8F7D
+view_admin_downloads_agent_buildNumber = \u4EE3\u7406Build
+view_admin_downloads_agent_help = <p> \u8FD9\u662FRHQ Agent\u66F4\u65B0\u7684\u4E8C\u8FDB\u5236jar\u6587\u4EF6. The purpose of this jar file is to allow you to install a fresh agent on a machine where an agent does not yet exist and to allow you to update an agent that is already installed on a machine. For more details, run this agent download jar with the --help command line option:<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>\u4EE3\u7406\u5B89\u88C5</h3> <p> <b>java -jar <agent-download.jar> --install[=<new agent directory>]</b><br/> This command will install a new agent. If you do not specify the new agent directory, the default will be "." </p> <h3>\u4EE3\u7406\u66F4\u65B0</h3> <p> <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/> This will update an existing agent that was already installed. If you do not specify the directory where the old, existing agent was installed, it will assumed to be "rhq-agent". </p>
+view_admin_downloads_agent_link_label = Link
+view_admin_downloads_agent_link_value = \u4E0B\u8F7D\u4EE3\u7406 {0} ({1})
+view_admin_downloads_agent_loadError = \u65E0\u6CD5\u83B7\u5F97\u4EE3\u7406\u7248\u672C\u4FE1\u606F
+view_admin_downloads_agent_md5 = \u4EE3\u7406MD5
+view_admin_downloads_agent_version = \u4EE3\u7406\u7248\u672C
+view_admin_downloads_bundleDownload = Bundle\u90E8\u7F72\u5668\u4E0B\u8F7D
+view_admin_downloads_bundle_help = <p> This is the Bundle Deployer tool. It is for use by developers and packagers of RHQ bundles. This standalone tool allows you to test your bundles and their recipes from a console. </p>
+view_admin_downloads_bundle_link_label = Link
+view_admin_downloads_bundle_link_value = Download Bundle Deployer {0}
+view_admin_downloads_bundle_loadError = Cannot get bundle deployer info
+view_admin_downloads_cliDownload = \u547D\u4EE4\u884C\u5BA2\u6237\u7AEF\u4E0B\u8F7D
+view_admin_downloads_cli_buildNumber = CLI Build
+view_admin_downloads_cli_help = <p> This is the Command Line Client tool, otherwise known as the CLI. It is a standalone tool that runs from within a console and provides a command line interface to the RHQ Server. You can invoke commands via the CLI as well as run scripts to perform automated tasks. See the documentation for more information on how to install and use the CLI. </p>
+view_admin_downloads_cli_link_label = Link
+view_admin_downloads_cli_link_value = \u4E0B\u8F7DCLI {0} ({1})
+view_admin_downloads_cli_loadError = \u65E0\u6CD5\u83B7\u5F97CLI\u7248\u672C\u4FE1\u606F
+view_admin_downloads_cli_md5 = CLI MD5
+view_admin_downloads_cli_version = CLI\u7248\u672C
+view_admin_downloads_connectorsDownload = \u8FDE\u63A5\u5668\u4E0B\u8F7D
+view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by RHQ. You install connectors into some managed products so RHQ agents can talk to them. See the documentation for more information.
+view_admin_downloads_connectors_loadError = Cannot get connectors info
+view_admin_downloads_connectors_none = No connectors are available for download
+view_admin_landing = \u8FD9\u91CC\u4F60\u53EF\u4EE5\u7BA1\u7406RHQ\u5168\u5C40\u914D\u7F6E.\u5305\u62EC\u914D\u7F6E\u5B89\u5168,\u5B89\u88C5\u63D2\u4EF6,\u7BA1\u7406RHQ\u670D\u52A1\u5668\u548C\u4EE3\u7406.
+view_admin_measTemplates_title = Template Metric Collection Schedules
+view_admin_measTemplates_updateExisting_title = \u66F4\u65B0\u5B58\u5728\u7684\u8BA1\u5212\u4EFB\u52A1
+view_admin_measTemplates_updateExisting_tooltip = Check this box to update the collection schedules for the selected metrics on all existing resources of this type. If this is not checked, the template schedules will only be applied to new resources of this type that are added to inventory in the future.
+view_admin_security = \u5B89\u5168
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = If this amount of time passes without hearing from an agent, that quiet agent will be considered down. This value is specified in minutes.
+view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = Agent Max Quiet Time Allowed
+view_admin_systemSettings_AlertPurge_desc = How old alert history items must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AlertPurge_name = Delete Alerts Older Than
+view_admin_systemSettings_AvailabilityPurge_desc = How old availability data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_AvailabilityPurge_name = Delete Availability Data Older Than
+view_admin_systemSettings_BaseURL_desc = A URL to the server GUI, used mainly within alert email notifications.
+view_admin_systemSettings_BaseURL_name = GUI Console URL
+view_admin_systemSettings_BaselineDataSet_desc = The amount of past measurement data that is used to determine a baseline. This is specified in days.
+view_admin_systemSettings_BaselineDataSet_name = Baseline Dataset
+view_admin_systemSettings_BaselineFrequency_desc = The frequency which the auto-calculation of baselines will be performed. If 0, baseline auto-calculation is disabled. This is specified in days.
+view_admin_systemSettings_BaselineFrequency_name = Baseline Calculation Frequency
+view_admin_systemSettings_DataMaintenance_desc = How often database maintenance is performed (for example, vacuuming if using Postgres). This is specified in hours.
+view_admin_systemSettings_DataMaintenance_name = \u6570\u636E\u5E93\u7EF4\u62A4\u671F\u95F4
+view_admin_systemSettings_DataReindex_desc = If enabled, certain database tables will be re-indexed periodically.
+view_admin_systemSettings_DataReindex_name = Reindex Data Tables Nightly
+view_admin_systemSettings_EnableAgentAutoUpdate_desc = Determines if the server will allow agents to auto-update themselves. You will not be able to download agent distributions from the server if this is disabled.
+view_admin_systemSettings_EnableAgentAutoUpdate_name = \u542F\u7528\u4EE3\u7406\u81EA\u52A8\u5347\u7EA7
+view_admin_systemSettings_EnableDebugMode_desc = \u5982\u679C\u542F\u7528,\u670D\u52A1\u5668\u5C06\u8FDB\u5165debug\u6A21\u5F0F.
+view_admin_systemSettings_EnableDebugMode_name = \u542F\u7528Debug\u6A21\u5F0F
+view_admin_systemSettings_EnableExperimentalFeatures_desc = If enabled, any experimental features that exist in the current product will be available.
+view_admin_systemSettings_EnableExperimentalFeatures_name = Enable Experimental Features
+view_admin_systemSettings_EventPurge_desc = How old event data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_EventPurge_name = Delete Events Older Than
+view_admin_systemSettings_JAASProvider_desc = Should LDAP be used to determine user identity?
+view_admin_systemSettings_JAASProvider_name = \u542F\u7528LDAP
+view_admin_systemSettings_LDAPBaseDN_desc = The base of the directory tree to search for usernames and passwords while authenticating users, e.g. ou=People,dc=redhat,dc=com
+view_admin_systemSettings_LDAPBaseDN_name = Search Base
+view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn=Manager,dc=redhat,dc=com
+view_admin_systemSettings_LDAPBindDN_name = \u7528\u6237\u540D
+view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
+view_admin_systemSettings_LDAPBindPW_name = \u5BC6\u7801
+view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser=true
+view_admin_systemSettings_LDAPFilter_name = Search Filter
+view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupFilter_name = Group Search Filter
+view_admin_systemSettings_LDAPGroupMember_desc = LDAP search filter that is used in conjunction with the group search filter to determine user authorization. This is used for LDAP group authorization.
+view_admin_systemSettings_LDAPGroupMember_name = Group Member Filter
+view_admin_systemSettings_LDAPLoginProperty_desc = The LDAP property that contains the user name. Defaults to "cn". If multiple matches are found, the first entry found is used.
+view_admin_systemSettings_LDAPLoginProperty_name = Login Property
+view_admin_systemSettings_LDAPProtocol_desc = Should communication with the LDAP server be done over SSL?
+view_admin_systemSettings_LDAPProtocol_name = SSL
+view_admin_systemSettings_LDAPUrl_desc = URL to the LDAP Server
+view_admin_systemSettings_LDAPUrl_name = LDAP URL
+view_admin_systemSettings_RtDataPurge_desc = How old response time data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_RtDataPurge_name = Delete Response Time Data Older Than
+view_admin_systemSettings_TraitPurge_desc = How old measurement trait data must be before being purged from the database. This is specified in days.
+view_admin_systemSettings_TraitPurge_name = Delete Measurement Traits Older Than
+view_admin_systemSettings_cannotLoadServerDetails = \u65E0\u6CD5\u52A0\u8F7D\u670D\u52A1\u5668\u8BE6\u60C5
+view_admin_systemSettings_cannotLoadSettings = \u65E0\u6CD5\u83B7\u5F97\u5F53\u524D\u7CFB\u7EDF\u914D\u7F6E
+view_admin_systemSettings_fixBeforeSaving = \u4FDD\u5B58\u524D\u8BF7\u4FEE\u590D\u9519\u8BEF
+view_admin_systemSettings_group_baseline = \u81EA\u52A8Baseline\u914D\u7F6E\u5C5E\u6027
+view_admin_systemSettings_group_dataMgr = \u6570\u636E\u7BA1\u7406\u5668\u57FA\u672C\u5C5E\u6027
+view_admin_systemSettings_group_general = \u57FA\u672C\u914D\u7F6E\u5C5E\u6027
+view_admin_systemSettings_group_ldap = LDAP\u914D\u7F6E\u5C5E\u6027
+view_admin_systemSettings_saveFailure = \u4FDD\u5B58\u7CFB\u7EDF\u5C5E\u6027\u5931\u8D25
+view_admin_systemSettings_savedSettings = \u4FDD\u5B58\u7CFB\u7EDF\u5C5E\u6027\u6210\u529F
+view_admin_systemSettings_serverDetails = \u670D\u52A1\u5668\u8BE6\u60C5
+view_admin_systemSettings_serverDetails_buildNumber = Build Number
+view_admin_systemSettings_serverDetails_currentTable = Current Measurement Raw Table
+view_admin_systemSettings_serverDetails_dbDriverName = \u6570\u636E\u5E93\u9A71\u52A8\u540D
+view_admin_systemSettings_serverDetails_dbDriverVersion = \u6570\u636E\u5E93\u9A71\u52A8\u7248\u672C
+view_admin_systemSettings_serverDetails_dbName = \u6570\u636E\u5E93\u4EA7\u54C1\u540D
+view_admin_systemSettings_serverDetails_dbUrl = \u6570\u636E\u5E93\u8FDE\u63A5URL
+view_admin_systemSettings_serverDetails_dbVersion = \u6570\u636E\u5E93\u7248\u672C\u4FE1\u606F
+view_admin_systemSettings_serverDetails_installDir = \u670D\u52A1\u5668\u5B89\u88C5\u76EE\u5F55
+view_admin_systemSettings_serverDetails_nextRotation = Next Measurement Table Rotation
+view_admin_systemSettings_serverDetails_time = \u670D\u52A1\u5668\u672C\u5730\u65F6\u95F4
+view_admin_systemSettings_serverDetails_tz = \u670D\u52A1\u5668\u65F6\u533A
+view_admin_topology = \u62D3\u6251
+view_alert_common_tab_conditions = Conditions
+view_alert_common_tab_conditions_expression = \u89E6\u53D1\u4E8B\u4EF6\u5F53
+view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
+view_alert_common_tab_conditions_modal_title = \u6DFB\u52A0\u6761\u4EF6
+view_alert_common_tab_conditions_recovery_disabled = This alert caused its alert definition to be disabled
+view_alert_common_tab_conditions_recovery_enabled = Triggered ''{0}'' to be re-enabled
+view_alert_common_tab_conditions_text = \u6761\u4EF6
+view_alert_common_tab_conditions_type_availability = \u53EF\u7528\u6027\u6539\u53D8
+view_alert_common_tab_conditions_type_availability_down = Went down
+view_alert_common_tab_conditions_type_availability_up = Came up
+view_alert_common_tab_conditions_type_event = \u4E8B\u4EF6\u68C0\u6D4B
+view_alert_common_tab_conditions_type_event_matching = with event source matching
+view_alert_common_tab_conditions_type_metric_baseline = \u6307\u6807\u57FA\u51C6
+view_alert_common_tab_conditions_type_metric_baseline_verb = of
+view_alert_common_tab_conditions_type_metric_calltime_change = Call Time Value Changes
+view_alert_common_tab_conditions_type_metric_calltime_change_verb = by at least
+view_alert_common_tab_conditions_type_metric_calltime_delta_grows = Grows
+view_alert_common_tab_conditions_type_metric_calltime_delta_other = Changes
+view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
+view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
+view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
+view_alert_common_tab_conditions_type_metric_change = Metric Value Change
+view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
+view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
+view_alert_common_tab_conditions_type_operation = \u64CD\u4F5C\u6267\u884C
+view_alert_common_tab_conditions_type_operation_status = with result status
+view_alert_common_tab_conditions_type_resource_configuration = \u8D44\u6E90\u914D\u7F6E Change
+view_alert_common_tab_conditions_value = Value
+view_alert_common_tab_dampening = Dampening
+view_alert_common_tab_dampening_category_consecutive_count = Consecutive
+view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
+view_alert_common_tab_dampening_category_duration_count = Time Period
+view_alert_common_tab_dampening_category_duration_count_tooltip = An alert is triggered once every X occurrences the condition set is true within a given time period.
+view_alert_common_tab_dampening_category_none = None
+view_alert_common_tab_dampening_category_none_tooltip = Dampening is disabled. Every time the condition set is true, an alert will be triggered.
+view_alert_common_tab_dampening_category_partial_count = Last N Evaluations
+view_alert_common_tab_dampening_category_partial_count_tooltip = An alert is triggered once every X occurrences the condition set is true during the last N evaluations of the condition set.
+view_alert_common_tab_dampening_consecutive_occurrences_label = Occurrences
+view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = The number of times the condition set must be consecutively true before the alert is triggered
+view_alert_common_tab_dampening_duration_occurrences_label = Occurrences
+view_alert_common_tab_dampening_duration_occurrences_label_tooltip = The number of times the condition set must be true during the given time period before the alert is triggered.
+view_alert_common_tab_dampening_duration_period_label = \u65F6\u95F4\u6BB5
+view_alert_common_tab_dampening_duration_period_label_tooltip = The time span in which the condition set will be tested to see if the given number of occurrences are true.
+view_alert_common_tab_dampening_partial_evalatuions_label = \u8BC4\u4F30
+view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = The total number of times the condition set will be tested to see if the given number of occurrences are true.
+view_alert_common_tab_dampening_partial_occurrences_label = Occurrences
+view_alert_common_tab_dampening_partial_occurrences_label_tooltip = The number of times the condition set must be true during the last N evaluations before the alert is triggered.
+view_alert_common_tab_general = \u57FA\u672C\u5C5E\u6027
+view_alert_common_tab_invalid_condition_category = Invalid condition category - please report this as a bug: {0}
+view_alert_common_tab_invalid_dampening_category = Invalid dampening category - please report this as a bug: {0}
+view_alert_common_tab_invalid_time_units = \u65E0\u6548\u65F6\u95F4\u5355\u4F4D - \u8BF7\u62A5\u544Abug: {0}
+view_alert_common_tab_notifications = \u901A\u77E5
+view_alert_common_tab_notifications_message = \u6D88\u606F
+view_alert_common_tab_notifications_sender = Sender
+view_alert_common_tab_notifications_status = \u72B6\u6001
+view_alert_common_tab_recovery = \u8FD8\u539F
+view_alert_definition_condition_editor_avilability_option_down = Goes down
+view_alert_definition_condition_editor_avilability_option_up = Comes up
+view_alert_definition_condition_editor_avilability_tooltip = Specify the availability state change that will trigger the condition.
+view_alert_definition_condition_editor_avilability_value = \u53EF\u7528\u6027
+view_alert_definition_condition_editor_common_avg = Average
+view_alert_definition_condition_editor_common_max = Maximum
+view_alert_definition_condition_editor_common_min = Minimum
+view_alert_definition_condition_editor_delete_confirm = \u5220\u9664\u9009\u5B9A\u7684\u8B66\u62A5\u6761\u4EF6?
+view_alert_definition_condition_editor_event_regex = \u6B63\u5219\u8868\u8FBE\u5F0F
+view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
+view_alert_definition_condition_editor_event_severity = Event Severity
+view_alert_definition_condition_editor_event_severity_debug = Debug
+view_alert_definition_condition_editor_event_severity_error = Error
+view_alert_definition_condition_editor_event_severity_fatal = Fatal
+view_alert_definition_condition_editor_event_severity_info = Info
+view_alert_definition_condition_editor_event_severity_warn = Warn
+view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
+view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
+view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
+view_alert_definition_condition_editor_metric_baseline_tooltip = Specify the baseline value that must be violated to trigger the condition. The value you specify is a percentage of the given baseline value.
+view_alert_definition_condition_editor_metric_baseline_value = Baseline
+view_alert_definition_condition_editor_metric_calltime_change_percentage = Percentage Change
+view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = A collected calltime value will trigger this condition when it differs by at least this percentage of the selected calltime limit value
+view_alert_definition_condition_editor_metric_calltime_change_tooltip = Specify the calltime value that, when changed at least a specified amount, triggers the condition. You must specify which calltime limit to check (minimum, maximum or average calltime value) and the percentage of change that must occur.
+view_alert_definition_condition_editor_metric_calltime_common_comparator = Comparator
+view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = Changes
+view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = Grows
+view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = Shrinks
+view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = How a collected calltime value should be compared to the given calltime limit
+view_alert_definition_condition_editor_metric_calltime_common_limit = Call Time Limit
+view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = The calltime limit value that is to be compared with the given value
+view_alert_definition_condition_editor_metric_calltime_common_name = Call Time Metric
+view_alert_definition_condition_editor_metric_calltime_common_regex = \u6B63\u5219\u8868\u8FBE\u5F0F
+view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = If specified, this is a regular expression that must match a call destination in order to trigger the condition.
+view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = Specify the calltime threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier. You also must specify which calltime limit to compare the value with (minimum, maximum or average calltime value).
+view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Time Value
+view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
+view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
+view_alert_definition_condition_editor_metric_threshold_comparator_equal = \u7B49\u4E8E
+view_alert_definition_condition_editor_metric_threshold_comparator_greater = \u5927\u4E8E
+view_alert_definition_condition_editor_metric_threshold_comparator_less = \u5C0F\u4E8E
+view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = How a collected metric value should be compared to the given threshold value
+view_alert_definition_condition_editor_metric_threshold_name = \u6307\u6807
+view_alert_definition_condition_editor_metric_threshold_tooltip = Specify the threshold value that, when violated, triggers the condition. The value you specify is an absolute value with an optional units specifier.
+view_alert_definition_condition_editor_metric_threshold_value = \u6307\u6807\u503C
+view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
+view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
+view_alert_definition_condition_editor_metric_trait_change_value = Trait
+view_alert_definition_condition_editor_operation_status = \u64CD\u4F5C\u72B6\u6001
+view_alert_definition_condition_editor_operation_status_canceled = Canceled
+view_alert_definition_condition_editor_operation_status_failure = Failure
+view_alert_definition_condition_editor_operation_status_inprogress = \u8FDB\u884C\u4E2D
+view_alert_definition_condition_editor_operation_status_success = Success
+view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
+view_alert_definition_condition_editor_operation_value = \u64CD\u4F5C
+view_alert_definition_condition_editor_option_availability = Availability Change
+view_alert_definition_condition_editor_option_event = \u4E8B\u4EF6\u68C0\u6D4B
+view_alert_definition_condition_editor_option_label = Condition Type
+view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
+view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
+view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
+view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
+view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
+view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
+view_alert_definition_condition_editor_option_operation = Operation Execution
+view_alert_definition_condition_editor_option_resource_configuration = \u8D44\u6E90\u914D\u7F6E\u6539\u53D8
+view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
+view_alert_definition_for_group = \u67E5\u770B\u7EC4\u5B9A\u4E49
+view_alert_definition_for_type = \u67E5\u770B\u6A21\u677F
+view_alert_definition_notification_cliScript_editor_anotherUser = \u5176\u4ED6\u7528\u6237
+view_alert_definition_notification_cliScript_editor_existingScript = Existing Script
+view_alert_definition_notification_cliScript_editor_loadFailed = Loading the CLI Notification Editor Failed.
+view_alert_definition_notification_cliScript_editor_newScriptVersion = Version
+view_alert_definition_notification_cliScript_editor_repository = Repository
+view_alert_definition_notification_cliScript_editor_script = Script
+view_alert_definition_notification_cliScript_editor_selectRepo = Select the repository where the script should reside
+view_alert_definition_notification_cliScript_editor_selectRepoFirst = \u9996\u5148\u9009\u62E9\u5E93.
+view_alert_definition_notification_cliScript_editor_thisUser = Myself
+view_alert_definition_notification_cliScript_editor_uploadNewScript = \u4E0A\u4F20\u65B0\u811A\u672C
+view_alert_definition_notification_cliScript_editor_verifyAuthentication = Verify
+view_alert_definition_notification_cliScript_editor_whichUser = User To Run The Script As
+view_alert_definition_notification_editor_delete_confirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u9009\u5B9A\u7684\u544A\u8B66\u901A\u77E5?
+view_alert_definition_notification_editor_field_configuration = \u914D\u7F6E
+view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
+view_alert_definition_notification_editor_field_configuration_not_loaded = Unknown
+view_alert_definition_notification_editor_field_sender = Sender
+view_alert_definition_notification_editor_loadFailed = Cannot get alert senders
+view_alert_definition_notification_editor_loadFailed_single = Cannot get alert sender configuration definition
+view_alert_definition_notification_editor_none_available = No alert senders available
+view_alert_definition_notification_editor_saveFailed = Cannot save the notification configuration
+view_alert_definition_notification_editor_sender = \u901A\u77E5\u53D1\u9001\u8005
+view_alert_definition_notification_editor_title_add = \u6DFB\u52A0\u901A\u77E5
+view_alert_definition_notification_editor_title_edit = \u7F16\u8F91\u901A\u77E5
+view_alert_definition_notification_operation_editor_common_operation = \u64CD\u4F5C
+view_alert_definition_notification_operation_editor_mode_relative = \u76F8\u5173\u8D44\u6E90
+view_alert_definition_notification_operation_editor_mode_specific = \u6307\u5B9A\u8D44\u6E90
+view_alert_definition_notification_operation_editor_mode_this = \u8FD9\u4E2A\u8D44\u6E90
+view_alert_definition_notification_operation_editor_mode_title = \u8D44\u6E90\u9009\u62E9\u6A21\u5F0F
+view_alert_definition_notification_operation_editor_mode_unknown = UNKNOWN OPTION - THIS IS A BUG
+view_alert_definition_notification_operation_editor_operations_loadFailed = Failed to load the list of available operations
+view_alert_definition_notification_operation_editor_operations_no_parameters = This operation does not take any parameters
+view_alert_definition_notification_operation_editor_relative_ancestor = Start Search From
+view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = Cannot get type ancestry
+view_alert_definition_notification_operation_editor_relative_ancestor_root = Root Ancestor Type
+view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = Select the top of the type hierarchy from which to search its descendant tree for the Filter By type
+view_alert_definition_notification_operation_editor_relative_descendant = Then Filter By
+view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = A specific name to uniquely identify a resource when more than one resource of the selected type might exist. This is optional if there will only ever be one resource of the resource type in the selected type hierarchy.
+view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = Cannot get type descendants
+view_alert_definition_notification_operation_editor_relative_descendant_tooltip = The resource type to search for under the root type defined in the Start Search From selection.
+view_alert_definition_notification_operation_editor_specific_pick_button = Pick
+view_alert_definition_notification_operation_editor_specific_pick_error_invalid = Please pick a resource
+view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = Please pick a resource that has one or more operations
+view_alert_definition_notification_operation_editor_specific_pick_text = Pick a resource...
+view_alert_definition_notification_operation_editor_specific_resource = \u8D44\u6E90
+view_alert_definition_notification_role_editor_loadFailed = Cannot determine current roles - starting empty
+view_alert_definition_notification_role_editor_restoreFailed = Cannot use current roles - starting empty
+view_alert_definition_notification_role_editor_saveFailed = Cannot save the selected roles
+view_alert_definition_notification_user_editor_loadFailed = Cannot determine current users - starting empty
+view_alert_definition_notification_user_editor_restoreFailed = Cannot use current users - starting empty
+view_alert_definition_notification_user_editor_saveFailed = Cannot save the selected users
+view_alert_definition_recovery_editor_disable_when_fired = Disable When Fired
+view_alert_definition_recovery_editor_disable_when_fired_tooltip = Indicates if this alert will be disabled after it fires. Once disabled, the alert can be manually re-enabled or a recovery alert can be set up to automatically re-enable it. If this alert is a recovery alert itself, this setting cannot be turned on.
+view_alert_definition_recovery_editor_loadFailed = Cannot build recovery menu
+view_alert_definition_recovery_editor_none_available = None
+view_alert_definition_recovery_editor_recovery_alert = Recover Alert
+view_alert_definition_recovery_editor_recovery_alert_tooltip = The target alert that will be recovered (i.e. re-enabled) after this alert triggers. Do not select an alert here if you are not defining a recovery alert.
+view_alert_definitions_create_failure = Alert definition creation failed
+view_alert_definitions_create_success = Alert definition successfully created
+view_alert_definitions_delete_confirm = Delete the selected alert definition(s)?
+view_alert_definitions_delete_failure = Failed to deleted the selected alert definitions
+view_alert_definitions_delete_success = Successfully deleted {0} alert definitions
+view_alert_definitions_disable_confirm = Disable the selected alert definition(s)?
+view_alert_definitions_disable_failure = Failed to disable the selected alert definitions
+view_alert_definitions_disable_success = Successfully disabled {0} alert definitions
+view_alert_definitions_enable_confirm = Enable the selected alert definition(s)?
+view_alert_definitions_enable_failure = Failed to enable the selected alert definitions
+view_alert_definitions_enable_success = Successfully enabled {0} alert definitions
+view_alert_definitions_loadFailed = Failed to fetch alert definition data
+view_alert_definitions_loadFailed_single = Failed to fetch data for alert definition with id {0}
+view_alert_definitions_table_title_group = \u7EC4\u544A\u8B66\u5B9A\u4E49
+view_alert_definitions_table_title_resource = \u7EC4\u544A\u8B66\u5B9A\u4E49
+view_alert_definitions_update_failure = \u544A\u8B66\u5B9A\u4E49\u66F4\u65B0\u5931\u8D25
+view_alert_definitions_update_success = \u544A\u8B66\u5B9A\u4E49\u66F4\u65B0\u6210\u529F
+view_alert_details_field_ack_at = \u786E\u8BA4\u4E8E
+view_alert_details_field_ack_by = \u786E\u8BA4\u8005
+view_alert_details_field_recovery_info = \u8FD8\u539F\u4FE1\u606F
+view_alert_details_loadFailed = \u53D6\u5F97\u544A\u8B66\u8BE6\u60C5\u5931\u8D25
+view_alerts_ack_confirm = Acknowledge the selected alert(s)?
+view_alerts_ack_confirm_all = Acknowledge all alerts from this source?
+view_alerts_ack_failure = Failed to acknowledge alerts with id''s: {0}
+view_alerts_ack_failure_all = Failed to acknowledge all alerts from this source
+view_alerts_ack_success = Successfully acknowledged {0} alerts
+view_alerts_delete_confirm = Delete the selected alert(s)?
+view_alerts_delete_confirm_all = Delete all alerts from this source?
+view_alerts_delete_failure = Failed to delete alerts with id''s: {0}
+view_alerts_delete_failure_all = Failed to delete all alerts from this source
+view_alerts_delete_success = Successfully deleted {0} alerts
+view_alerts_field_ack_status = \u72B6\u6001
+view_alerts_field_ack_status_ack = Ack ({0})
+view_alerts_field_ack_status_ackHover = \u786E\u8BA4\u8005{0}\u4E8E{1}
+view_alerts_field_ack_status_noAck = No Ack
+view_alerts_field_ack_status_noAckHover = \u8FD8\u6CA1\u786E\u8BA4\u7684
+view_alerts_field_ack_subject = Acknowledge Subject
+view_alerts_field_ack_time = \u786E\u8BA4\u65F6\u95F4
+view_alerts_field_condition_text = Condition Text
+view_alerts_field_condition_text_many = Multiple Conditions
+view_alerts_field_condition_text_none = No Conditions
+view_alerts_field_condition_value = Condition Value
+view_alerts_field_created_time = \u4EA7\u751F\u65F6\u95F4
+view_alerts_field_enabled = \u542F\u7528
+view_alerts_field_modified_time = \u4FEE\u6539\u65F6\u95F4
+view_alerts_field_name = Name
+view_alerts_field_parent = \u7236
+view_alerts_field_priority = \u4F18\u5148\u7EA7
+view_alerts_field_protected = Protected
+view_alerts_field_protected_tooltip = If true, this definition is protected from being changed by the parent definition. In other words, the parent definition settings will not override this definition.
+view_alerts_loadFailed = Failed to fetch alerts data
+view_alerts_table_filter_priority = \u4F18\u5148\u7EA7\u8FC7\u6EE4
+view_alerts_table_title_group = \u7EC4\u544A\u8B66\u5386\u53F2
+view_alerts_table_title_resource = \u8D44\u6E90\u544A\u8B66\u5386\u53F2
+view_autoDiscoveryQ_committed = Committed
+view_autoDiscoveryQ_confirmSelect = \u662F\u5426\u9009\u4E2D\u5B50\u8282\u70B9\uFF1F
+view_autoDiscoveryQ_deleted = Deleted
+view_autoDiscoveryQ_field_discoveryTime = \u53D1\u73B0\u65F6\u95F4
+view_autoDiscoveryQ_field_inventoryStatus = \u6E05\u5355\u72B6\u6001
+view_autoDiscoveryQ_field_key = \u8D44\u6E90Key
+view_autoDiscoveryQ_field_name = \u8D44\u6E90\u540D\u79F0
+view_autoDiscoveryQ_field_parentId = \u7236ID
+view_autoDiscoveryQ_ignore = \u5FFD\u7565
+view_autoDiscoveryQ_ignoreFailure = Failed to ignore resources
+view_autoDiscoveryQ_ignoreSuccessful = \u6210\u529F\u5FFD\u7565\u9009\u5B9A\u8D44\u6E90.
+view_autoDiscoveryQ_ignored = Ignored
+view_autoDiscoveryQ_import = \u5BFC\u5165
+view_autoDiscoveryQ_importFailure = \u5BFC\u5165\u8D44\u6E90\u5931\u8D25
+view_autoDiscoveryQ_importSuccessful = \u6210\u529F\u5BFC\u5165\u88AB\u9009\u8D44\u6E90.
+view_autoDiscoveryQ_loadFailure = \u52A0\u8F7D\u8D44\u6E90\u6E05\u5355\u53D1\u73B0\u961F\u5217\u5931\u8D25
+view_autoDiscoveryQ_new = New
+view_autoDiscoveryQ_newAndIgnored = New and Ignored
+view_autoDiscoveryQ_noItems = \u65E0\u6761\u76EE\u663E\u793A
+view_autoDiscoveryQ_noperm = (\u60A8\u6CA1\u6709\u6743\u9650\u67E5\u770B\u81EA\u52A8\u53D1\u73B0\u961F\u5217)
+view_autoDiscoveryQ_showStatus = \u663E\u793A\u72B6\u6001
+view_autoDiscoveryQ_title = \u81EA\u52A8\u53D1\u73B0\u961F\u5217
+view_autoDiscoveryQ_unignore = Unignore
+view_autoDiscoveryQ_unignoreFailure = Failed to unignore resources
+view_autoDiscoveryQ_unignoreSuccessful = \u6210\u529F\u4F7F\u9009\u4E2D\u7684\u8D44\u6E90\u751F\u6548.
+view_autoDiscoveryQ_uninventoried = Uninventoried
+view_bundleVersion_loadFailure = Failed to load bundle version data
+view_bundle_bundle = Bundle
+view_bundle_bundleDeployment = Bundle\u53D1\u5E03
+view_bundle_bundleDeployments = Bundle\u53D1\u5E03
+view_bundle_bundleDestinations = Bundle\u76EE\u7684\u5730
+view_bundle_bundleFiles = Bundle\u6587\u4EF6
+view_bundle_bundleType = Bundle\u7C7B\u578B
+view_bundle_bundleVersion = Bundle\u7248\u672C
+view_bundle_bundleVersions = Bundle\u7248\u672C
+view_bundle_bundles = Bundles
+view_bundle_createWizard_bundleDistro = Bundle Distribution
+view_bundle_createWizard_cancelFailure = Failed to fully cancel the creation of bundle [{0}], version = [{1}] - the bundle may still exist in the database
+view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
+view_bundle_createWizard_clickToUploadRecipe = Click to load a recipe file
+view_bundle_createWizard_createFailure = \u521B\u5EFAbundle\u5931\u8D25
+view_bundle_createWizard_createSuccessful = You have successfully created a bundle named [{0}] with a version of [{1}]
+view_bundle_createWizard_enterRecipe = Please supply a valid recipe
+view_bundle_createWizard_enterUrl = Please enter a valid URL where the bundle distribution file can be downloaded from
+view_bundle_createWizard_failedToUploadDistroFile = Failed to upload bundle distribution file
+view_bundle_createWizard_failedToUploadFile = Failed to upload bundle file
+view_bundle_createWizard_loadBundleFileFailure = Cannot obtain bundle file information from server
+view_bundle_createWizard_noAdditionalFilesNeeded = No additional files need to be uploaded for this bundle
+view_bundle_createWizard_noBundleTypesAvail = No bundle types are available
+view_bundle_createWizard_noBundleTypesSupported = No bundle types are supported - you must deploy a valid plugin that supports bundle deployments
+view_bundle_createWizard_provideBundleDistro = Provide a Bundle Distribution
+view_bundle_createWizard_recipeOption = Recipe
+view_bundle_createWizard_title = \u521B\u5EFABundle
+view_bundle_createWizard_uploadInProgress = Upload is in progress... This can take several minutes for large files
+view_bundle_createWizard_uploadOption = \u4E0A\u4F20
+view_bundle_createWizard_uploadStepName = Upload Bundle Files
+view_bundle_createWizard_urlOption = URL
+view_bundle_createWizard_windowTitle = Bundle\u521B\u5EFA\u5411\u5BFC
+view_bundle_createWizard_youMustChooseOne = You must choose one option in order to create a bundle!
+view_bundle_deleteConfirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2Abundle? \u8FD9\u4E2Abundle\u6240\u6709\u7684\u7248\u672C, \u76EE\u7684\u5730\u548C\u90E8\u7F72\u5C06\u88AB\u5220\u9664.
+view_bundle_deploy = \u53D1\u5E03
+view_bundle_deployDir = \u53D1\u5E03\u76EE\u5F55
+view_bundle_deployWizard_deployStep = \u53D1\u5E03Bundle\u5230\u76EE\u7684\u5E73\u53F0
+view_bundle_deployWizard_deploying = \u53D1\u5E03\u4E2D...
+view_bundle_deployWizard_deploymentCreated = \u521B\u5EFA\u90E8\u7F72...
+view_bundle_deployWizard_deploymentCreatedDetail = You have created the deployment [{0}] with the description [{1}]
+view_bundle_deployWizard_deploymentCreatedDetail_concise = You have created the deployment [{0}]
+view_bundle_deployWizard_deploymentScheduled = Bundle Deployment Scheduled!
+view_bundle_deployWizard_deploymentScheduledDetail = You have scheduled the bundle deployment [{0}] to the destination group [{1}]
+view_bundle_deployWizard_deploymentScheduledDetail_concise = You have scheduled the bundle deployment
+view_bundle_deployWizard_destinationCreatedDetail = You have created the destination [{0}] with the description [{1}]
+view_bundle_deployWizard_destinationCreatedDetail_concise = You have created the destination [{0}]
+view_bundle_deployWizard_error_1 = Failed to delete new deployment on Cancel
+view_bundle_deployWizard_error_10 = Failed to create destination, it may already exist. (Note, for an existing destination deploy from the Destination view)
+view_bundle_deployWizard_error_11 = Failed to find defined deployments.
+view_bundle_deployWizard_error_12 = Failed to find defined bundles.
+view_bundle_deployWizard_error_2 = Failed to delete new destination on Cancel
+view_bundle_deployWizard_error_3 = Failed to Schedule Deployment!
+view_bundle_deployWizard_error_4 = Failed to schedule deployment: {0}
+view_bundle_deployWizard_error_5 = \u521B\u5EFA\u53D1\u5E03\u5931\u8D25!
+view_bundle_deployWizard_error_6 = \u521B\u5EFA\u53D1\u5E03\u5931\u8D25: {0}
+view_bundle_deployWizard_error_7 = Failed to get deployment name.
+view_bundle_deployWizard_error_8 = You must select a valid resource group from the drop down
+view_bundle_deployWizard_error_9 = Failed to delete new destination in nextPage
+view_bundle_deployWizard_getConfigSkip = No configuration needed for this bundle version.
+view_bundle_deployWizard_getConfigStep = Set Deployment Configuration
+view_bundle_deployWizard_getDestStep = \u65B0\u5EFA\u76EE\u7684\u5730
+view_bundle_deployWizard_getDest_deployDir = Root Deployment Directory (on destination platforms)
+view_bundle_deployWizard_getDest_desc = \u76EE\u7684\u5730\u63CF\u8FF0
+view_bundle_deployWizard_getDest_name = \u76EE\u7684\u5730\u540D
+view_bundle_deployWizard_getInfoStep = \u63D0\u4F9B\u53D1\u5E03\u4FE1\u606F
+view_bundle_deployWizard_getInfo_clean = Clean Deployment? (wipe deploy directory on destination platform)
+view_bundle_deployWizard_getInfo_deploymentDesc = \u53D1\u5E03\u63CF\u8FF0
+view_bundle_deployWizard_getInfo_deploymentName = \u53D1\u5E03\u540D\u79F0
+view_bundle_deployWizard_getOptionsStep = \u53D1\u5E03\u9009\u9879
+view_bundle_deployWizard_getOptions_deployLater = \u7A0D\u5019\u53D1\u5E03
+view_bundle_deployWizard_getOptions_deployNow = \u9A6C\u4E0A\u53D1\u5E03
+view_bundle_deployWizard_getOptions_deployTime = \u53D1\u5E03\u65F6\u95F4
+view_bundle_deployWizard_selectBundleStep = Select Deployment Bundle
+view_bundle_deployWizard_selectBundle_single = Select only a single bundle for deployment.
+view_bundle_deployWizard_selectVersionStep = Select Deployment Bundle Version
+view_bundle_deployWizard_selectVersion_latest = \u6700\u65B0\u7248\u672C [{0}]
+view_bundle_deployWizard_selectVersion_live = Live Version [{0}]
+view_bundle_deployWizard_selectVersion_select = Select Version from List:
+view_bundle_deployWizard_title = Bundle\u53D1\u5E03\u5411\u5BFC
+view_bundle_deploy_action = \u64CD\u4F5C
+view_bundle_deploy_backButton = \u8FD4\u56DE
+view_bundle_deploy_clickForError = Click the icon for the error message
+view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
+view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
+view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
+view_bundle_deploy_deployedBy = \u53D1\u5E03\u8005
+view_bundle_deploy_deploymentPlatforms = \u53D1\u5E03\u5E73\u53F0
+view_bundle_deploy_installDetails = \u5B89\u88C5\u7EC6\u8282
+view_bundle_deploy_loadBundleFailure = \u67E5\u627Ebundle\u5931\u8D25
+view_bundle_deploy_loadDeployFailure = Failed to load bundle deployments
+view_bundle_deploy_loadFailure = Failed to load bundle deployment
+view_bundle_deploy_name = \u53D1\u5E03\u540D
+view_bundle_deploy_operatingSystem = \u64CD\u4F5C\u7CFB\u7EDF
+view_bundle_deploy_selectARow = \u9009\u4E2D\u884C\u663E\u793A\u5B89\u88C5\u7EC6\u8282
+view_bundle_deploy_tagUpdateFailure = Failed to update bundle deployment tags
+view_bundle_deploy_tagUpdateSuccessful = You have successfully updated the bundle deployment tags
+view_bundle_deploy_time = \u53D1\u5E03\u65F6\u95F4
+view_bundle_deployed = \u5DF2\u53D1\u5E03
+view_bundle_deployments = \u53D1\u5E03
+view_bundle_dest_backToBundle = \u8FD4\u56DEBundle
+view_bundle_dest_created = \u5DF2\u521B\u5EFA
+view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination? This only deletes it from the database; all bundle content that was deployed to this destination on remote machines will remain.
+view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
+view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
+view_bundle_dest_deployDir = \u53D1\u5E03\u76EE\u5F55
+view_bundle_dest_group = \u7EC4
+view_bundle_dest_lastDeployedVersion = \u4E0A\u6B21\u53D1\u5E03\u7248\u672C
+view_bundle_dest_lastDeploymentDate = \u4E0A\u6B21\u53D1\u5E03\u65E5\u671F
+view_bundle_dest_lastDeploymentStatus = \u4E0A\u6B21\u53D1\u5E03\u72B6\u6001
+view_bundle_dest_loadFailure = \u52A0\u8F7Dbundle\u76EE\u7684\u5730\u5931\u8D25
+view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination deployed version information
+view_bundle_dest_purgeConfirm = This will purge the bundle content from all remote machines. Are you sure you want to do this?
+view_bundle_dest_purgeFailure = Failed to purge the bundle destination [{0}] from some or all of the remote machines.
+view_bundle_dest_purgeSuccessful = You successfully purged the bundle destination [{0}] from all of the remote machines.
+view_bundle_dest_revertConfirm = This will revert all remote machines back to the previous bundle deployment. Are you sure you want to do this?
+view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
+view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
+view_bundle_destinations = \u76EE\u7684\u5730
+view_bundle_fileListView_fileSize = \u6587\u4EF6\u5927\u5C0F
+view_bundle_fileListView_loadFailure = \u52A0\u8F7Dbundle\u6587\u4EF6\u5931\u8D25
+view_bundle_fileListView_md5 = MD5
+view_bundle_fileListView_sha256 = SHA256
+view_bundle_files = \u6587\u4EF6
+view_bundle_latestVersion = \u6700\u65B0\u7248\u672C
+view_bundle_list_backToAll = \u8FD4\u56DE\u6240\u6709Bundles
+view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
+view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
+view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
+view_bundle_list_deletesFailure = Failed to delete the bundles
+view_bundle_list_deletesSuccessful = You successfully deleted the bundles
+view_bundle_list_destinationsCount = Destinations Count
+view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
+view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
+view_bundle_list_error3 = \u52A0\u8F7Dbundle\u5931\u8D25
+view_bundle_list_loadFailure = Failed to load the bundle to be deployed [{0}]
+view_bundle_list_loadWithLatestFailure = Failed to load bundle with the latest version data
+view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deployed [{0}]
+view_bundle_list_tagUpdateFailure = \u66F4\u65B0bundle\u6807\u8BB0\u5931\u8D25
+view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
+view_bundle_list_versionsCount = \u7248\u672C\u6570\u91CF
+view_bundle_purge = \u6E05\u9664
+view_bundle_recipe = Recipe
+view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
+view_bundle_revert = \u8FD8\u539F
+view_bundle_revertWizard_confirmStep_confirmation = Reverting Live Deployment to Previous Deployment. Click "Next" to continue...
+view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
+view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
+view_bundle_revertWizard_confirmStep_name = \u53D1\u5E03\u8FD8\u539F\u786E\u8BA4
+view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
+view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
+view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
+view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
+view_bundle_revertWizard_confirmStep_prevDeployment = Previous Deployment
+view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
+view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
+view_bundle_revertWizard_getInfoStep_name = \u63D0\u4F9B\u8FD8\u539F\u4FE1\u606F
+view_bundle_revertWizard_getInfoStep_revertDeployDesc = \u90E8\u7F72\u8FD8\u539F\u63CF\u8FF0
+view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\\n\\n[REVERT To]\\n{1}
+view_bundle_revertWizard_getInfoStep_revertDeployName = \u90E8\u7F72\u8FD8\u539F\u540D\u79F0
+view_bundle_revertWizard_revertStep_name = Deploy Bundle to Destination Platforms
+view_bundle_revertWizard_revertStep_reverting = \u8FD8\u539F\u4E2D...
+view_bundle_revertWizard_revertStep_scheduled = You have successfully scheduled the revert deployment!
+view_bundle_revertWizard_revertStep_scheduledDetails = You have successfully scheduled to revert the bundle deployment [{0}] from resource group [{1}]
+view_bundle_revertWizard_revertStep_scheduledFailure = Failed to schedule revert deployment!
+view_bundle_revertWizard_title = Bundle\u8FD8\u539F
+view_bundle_revertWizard_windowTitle = Bundle\u8FD8\u539F\u5411\u5BFC
+view_bundle_tree_loadFailure = \u52A0\u8F7Dbundle\u6570\u636E\u5931\u8D25
+view_bundle_version_backToBundle = \u8FD4\u56DEBundle
+view_bundle_version_bundleVersionTagUpdateFailure = \u66F4\u65B0bundle\u7248\u672C\u6807\u8BB0\u5931\u8D25
+view_bundle_version_bundleVersionTagUpdateSuccessful = \u66F4\u65B0bundle\u7248\u672C\u6807\u8BB0\u6210\u529F
+view_bundle_version_deleteConfirm = \u4F60\u786E\u5B9A\u8981\u5220\u9664bundle\u7248\u672C?
+view_bundle_version_deleteFailure = \u5220\u9664bundle\u7248\u672C[{0}]\u5931\u8D25
+view_bundle_version_deleteSuccessful = \u5220\u9664bundle\u7248\u672C[{0}]\u6210\u529F
+view_bundle_version_loadFailure = \u52A0\u8F7Dbundle\u7248\u672C\u5931\u8D25
+view_bundle_versions = \u7248\u672C
+view_configCompare_comparingConfigs = \u6BD4\u8F83\u8BBE\u7F6E
+view_configCompare_configCompare = \u914D\u7F6E\u6BD4\u8F83\u7ED3\u679C\u96C6
+view_configEdit_addItem = \u6DFB\u52A0\u6761\u76EE\u81F3\u5217\u8868.
+view_configEdit_confirm_1 = \u786E\u5B9A\u8981\u4ECE\u96C6\u5408\u4E2D\u5220\u9664\u6307\u5B9A\u7684\u5C5E\u6027?
+view_configEdit_confirm_2 = \u786E\u5B9A\u8981\u5220\u9664\u8BE5\u884C?
+view_configEdit_confirm_3 = \u786E\u5B9A\u8981\u5220\u9664 [{0}]\u9879\u9009\u4E2D\u7684 [{1}]?
+view_configEdit_editRow = \u7F16\u8F91\u884C
+view_configEdit_enterPropName = \u8F93\u5165\u8981\u6DFB\u52A0\u7684\u5C5E\u6027\u540D\u79F0.
+view_configEdit_error_1 = \u6B64\u8D44\u6E90\u65E0\u6CD5\u914D\u7F6E.
+view_configEdit_error_2 = \u6B64\u8D44\u6E90\u65E0\u6CD5\u8FDB\u884C\u8FDE\u63A5\u8BBE\u7F6E.
+view_configEdit_error_3 = \u65E0\u6CD5\u6DFB\u52A0\u540D\u4E3A[{0}]\u7684\u5C5E\u6027. \u5C5E\u6027\u540D\u5728\u96C6\u5408\u4E2D\u5DF2\u7ECF\u88AB\u4F7F\u7528.
+view_configEdit_files = \u6587\u4EF6
+view_configEdit_hideAll = \u9690\u85CF\u6240\u6709
+view_configEdit_jumpToSection = \u8DF3\u81F3\u6A21\u5757
+view_configEdit_msg_1 = \u589E\u52A0\u5C5E\u6027 [{0}]\u5230\u96C6\u5408.
+view_configEdit_msg_2 = \u79FB\u9664\u96C6\u5408\u5185\u6240\u6709\u7684\u5C5E\u6027.
+view_configEdit_msg_3 = \u4ECE\u5217\u8868\u4E2D\u5220\u9664[{0} {1}]\u6210\u529F.
+view_configEdit_msg_4 = \u6DFB\u52A0\u6761\u76EE\u81F3\u5217\u8868.
+view_configEdit_properties = \u5C5E\u6027
+view_configEdit_tooltip_1 = \u4ECE\u5217\u8868\u4E2D\u5220\u9664\u9009\u4E2D\u7684\u6761\u76EE.
+view_configEdit_tooltip_2 = \u6DFB\u52A0\u4E00\u9879\u6761\u76EE\u5230\u5217\u8868.
+view_configEdit_viewRow = \u67E5\u770B\u884C
+view_configurationDetails_allPropertiesValid = \u6240\u6709\u7684\u914D\u7F6E\u4FE1\u606F\u5DF2\u7ECF\u586B\u5199\u4E86\u6709\u6548\u7684\u503C, \u73B0\u5728\u4FDD\u5B58\u914D\u7F6E.
+view_configurationDetails_configNotUpdatedDueToNoChange = \u7531\u4E8E\u65B0\u65E7\u914D\u7F6E\u4E00\u81F4\uFF0C\u6240\u4EE5\u914D\u7F6E\u6CA1\u6709\u66F4\u65B0.
+view_configurationDetails_error_updateFailure = \u66F4\u65B0\u914D\u7F6E\u5931\u8D25.
+view_configurationDetails_messageConcise = \u914D\u7F6E\u66F4\u65B0\u6210\u529F - \u76EE\u524D\u7248\u672C\u662F {0}.
+view_configurationDetails_messageDetailed = \u8D44\u6E90 [{1}]\u7684\u914D\u7F6E\u7248\u672C\u66F4\u65B0\u5230 {0} .
+view_configurationDetails_noPermission = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u6B64\u8D44\u6E90\u7684\u914D\u7F6E\u4FE1\u606F.
+view_configurationDetails_somePropertiesInvalid = \u4E0B\u9762\u7684\u914D\u7F6E\u4FE1\u606F\u586B\u5199\u4E86\u975E\u6CD5\u7684\u503C: {0}. \u5FC5\u987B\u4FEE\u6539\u6B64\u4FE1\u606F\u4EE5\u4FBF\u4FDD\u5B58\u6B64\u914D\u7F6E.
+view_configurationHistoryDetails_error_loadFailure = \u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2\u914D\u7F6E.
+view_configurationHistoryList_cannotDeleteCurrent = \u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E\u4E2D\u7684\u4E00\u9879\u662F\u73B0\u6709\u751F\u6548\u7684\u914D\u7F6E - \u4F60\u4E0D\u80FD\u5220\u9664\u5B83.
+view_configurationHistoryList_cannotDeleteGroupItems = \u4E00\u4E2A\u6216\u591A\u4E2A\u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E\u9879\u662F\u67D0\u4E2A\u7EC4\u914D\u7F6E\u7684\u4E00\u90E8\u5206\u3002 \u5728\u5220\u9664\u5355\u4E2A\u7684\u5386\u53F2\u914D\u7F6E\u4FE1\u606F\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u5220\u9664 \u4E0A\u4E00\u7EA7\u7684\u5386\u53F2\u7EC4\u914D\u7F6E.
+view_configurationHistoryList_delete_failure = \u5220\u9664\u5386\u53F2\u914D\u7F6E\u9879\u5931\u8D25
+view_configurationHistoryList_delete_success = \u60A8\u6210\u529F\u7684\u5220\u9664\u4E86\u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E\u9879.
+view_configurationHistoryList_rollback = \u56DE\u6EDA
+view_configurationHistoryList_rollback_failure = \u56DE\u6EDA\u914D\u7F6E\u5931\u8D25. \u539F\u6765\u7684\u914D\u7F6E\u4F9D\u7136\u751F\u6548.
+view_configurationHistoryList_rollback_success = \u60A8\u6210\u529F\u7684\u5C06\u8BE5\u914D\u7F6E\u56DE\u6EDA\u5230\u9009\u4E2D\u7684\u5386\u53F2\u914D\u7F6E.
+view_configurationHistoryList_table_clickStatusIcon = \u70B9\u51FB\u72B6\u6001\u6309\u94AE\u83B7\u53D6\u8BE6\u7EC6\u7684\u4FE1\u606F
+view_configurationHistoryList_table_statusFailure = \u6B64\u914D\u7F6E\u66F4\u65B0\u5931\u8D25
+view_configurationHistoryList_table_statusInprogress = \u66F4\u65B0\u6B64\u914D\u7F6E\u7684\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\u4E2D
+view_configurationHistoryList_table_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
+view_configurationHistoryList_table_statusSuccess = \u6B64\u914D\u7F6E\u6210\u529F\u66F4\u65B0
+view_configurationHistoryList_title = \u5386\u53F2\u914D\u7F6E
+view_connectionSettingsDetails_allPropertiesValid = \u6240\u6709\u8FDE\u63A5\u8BBE\u7F6E\u7684\u914D\u7F6E\u5DF2\u7ECF\u586B\u5199\u4E86\u6709\u6548\u7684\u503C,\u73B0\u5728\u53EF\u4EE5\u4FDD\u5B58\u8BBE\u7F6E.
+view_connectionSettingsDetails_error_updateFailure = \u66F4\u65B0\u8FDE\u63A5\u8BBE\u7F6E\u5931\u8D25.
+##view_connectionSettingsDetails_messageConcise_updateSuccess = \u8FDE\u63A5\u8BBE\u7F6E\u5DF2\u66F4\u65B0.
+##view_connectionSettingsDetails_messageDetailed_updateSuccess = \u8D44\u6E90 [{0}]\u7684\u8FDE\u63A5\u8BBE\u7F6E\u5DF2\u7ECF\u66F4\u65B0.
+view_connectionSettingsDetails_noPermission = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u6B64\u8D44\u6E90\u7684\u8FDE\u63A5\u8BBE\u7F6E.
+view_connectionSettingsDetails_somePropertiesInvalid = \u4E0B\u9762\u7684\u8FDE\u63A5\u8BBE\u7F6E\u4FE1\u606F\u586B\u5199\u4E86\u975E\u6CD5\u7684\u503C: {0}. \u5FC5\u987B\u4FEE\u6539\u6B64\u4FE1\u606F\u4EE5\u4FBF\u4FDD\u5B58\u6B64\u8BBE\u7F6E.
+view_core_error_1 = \u67E5\u627E\u65B0\u544A\u8B66\u4FE1\u606F\u5931\u8D25
+view_core_loggedOut = \u9000\u51FA\u767B\u5F55
+view_core_noRecentAlerts = \u6CA1\u6709\u65B0\u4EA7\u751F\u7684\u544A\u8B66\u4FE1\u606F
+view_core_recentAlerts = \u65B0\u4EA7\u751F [{0}] \u6761\u544A\u8B66 - \u70B9\u51FB\u8DF3\u8F6C\u5230\u65B0\u544A\u8B66\u62A5\u8868\u754C\u9762
+view_core_uncaught = \u5168\u5C40\u672A\u6355\u6349\u7684\u5F02\u5E38
+view_dashboardManager_deleteFail = \u5220\u9664\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25.
+view_dashboardManager_deleted = \u6210\u529F\u5220\u9664\u7EDF\u8BA1\u8868\u76D8{0}
+view_dashboardManager_error = \u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
+view_dashboardManager_saved = \u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8{0}
+view_dashboardManager_success = \u6210\u529F\u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8
+view_dashboard_favorites_error1 = \u52A0\u8F7D\u5E38\u7528\u8D44\u6E90\u5931\u8D25.
+view_dashboardsManager_error1 = \u6DFB\u52A0\u65B0\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
+view_dashboardsManager_message_title_details = <h1>\u6B22\u8FCE\u4F7F\u7528RHQ</h1>\n<p>RHQ\u9879\u76EE\u662F\u4E00\u4E2A\u62BD\u8C61\u7684\u3001\u57FA\u4E8E\u63D2\u4EF6\u7684\u7CFB\u7EDF\u7BA1\u7406\u5957\u4EF6\u3002\u901A\u8FC7\u4E00\u7CFB\u5217\u6838\u5FC3\u529F\u80FD\u63D0\u4F9B\u591A\u4EA7\u54C1\u548C\u5E73\u53F0\u7684\u53EF\u6269\u5C55\u7684\u96C6\u6210\u7BA1\u7406. \u672C\u9879\u76EE\u5206\u5C42\u6A21\u5757\u5177\u6709\u7075\u6D3B\u53D1\u5E03\u67B6\u6784. \u5B83\u63D0\u4F9B\u4E86\u4E00\u4E2A\u6838\u5FC3\u7528\u6237\u754C\u9762\u4F9B\u8DE8\u6574\u4E2A\u4F01\u4E1A\u7684\u5BA1\u8BA1\u548C\u5386\u53F2\u7BA1\u7406. \u670D\u52A1\u5668/\u4EE3\u7406\u67B6\u6784\u63D0\u4F9B\u8FDC\u7A0B\u7BA1\u7406,\u63D2\u4EF6\u63D0\u4F9B\u7279\u5B9A\u4EA7\u54C1\u7684\u7BA1\u7406\u652F\u6301.</p>\n <p>\u901A\u8FC7\u5355\u51FB(\u7F16\u8F91\u6A21\u5F0F)\u6309\u94AE\u53EF\u4EE5\u7F16\u8F91\u9ED8\u8BA4\u7EDF\u8BA1\u8868\u76D8.</p>
+view_dashboards_confirm1 = \u60A8\u786E\u5B9A\u8981\u5220\u9664\uFF1F
+view_dashboards_portlets_refresh_fail1 = \u4FEE\u6539portlets\u81EA\u52A8\u5237\u65B0\u7684\u95F4\u9694\u65F6\u95F4\u5931\u8D25
+view_dashboards_portlets_refresh_fail2 = \u505C\u7528portlets\u81EA\u52A8\u5237\u65B0\u7684\u91CD\u8F7D\u5931\u8D25
+view_dashboards_portlets_refresh_multiple_min = {0} \u5206\u949F
+view_dashboards_portlets_refresh_none = \u65E0\u5237\u65B0
+view_dashboards_portlets_refresh_one_min = 1 \u5206\u652F
+view_dashboards_portlets_refresh_success1 = \u6210\u529F\u4FEE\u6539portlets\u81EA\u52A8\u5237\u65B0\u7684\u95F4\u9694\u65F6\u95F4
+view_dashboards_portlets_refresh_success2 = \u6210\u529F\u505C\u7528portlets\u81EA\u52A8\u5237\u65B0\u7684\u91CD\u8F7D
+view_dashboards_title = \u7EDF\u8BA1\u8868\u76D8
+view_dynagroup_children = \u5B50\u52A8\u6001\u7EC4
+view_dynagroup_compatible = \u517C\u5BB9\u6027
+view_dynagroup_definitionAlreadyExists = \u5DF2\u7ECF\u5B58\u5728\u4EE5\u8BE5\u540D\u79F0\u547D\u540D\u7684\u7EC4\u5B9A\u4E49
+view_dynagroup_definitionCreated = \u60A8\u6210\u529F\u7684\u521B\u5EFA\u540D\u79F0\u4E3A[{0}]\u7684\u7EC4\u5B9A\u4E49
+view_dynagroup_definitionLoadFailure = \u52A0\u8F7D\u6240\u6709\u7684\u7EC4\u5B9A\u4E49\u5931\u8D25
+view_dynagroup_definitions = \u52A8\u6001\u7EC4\u5B9A\u4E49
+view_dynagroup_deleteFailureSelection = \u5220\u9664\u9009\u4E2D\u7684\u7EC4\u5B9A\u4E49\u5931\u8D25
+view_dynagroup_deleteSuccessfulSelection = \u6210\u529F\u7684\u5220\u9664 [{0}]\u7EC4\u5B9A\u4E49
+view_dynagroup_editing = \u7F16\u8F91 [{0}]
+view_dynagroup_exprBuilder_addExpression = \u6DFB\u52A0\u8868\u8FBE\u5F0F
+view_dynagroup_exprBuilder_comparisonType = \u5BF9\u6BD4\u7C7B\u578B
+view_dynagroup_exprBuilder_comparisonType_contains = \u5305\u542B
+view_dynagroup_exprBuilder_comparisonType_endsWith = ends with
+view_dynagroup_exprBuilder_comparisonType_equals = \u76F8\u7B49
+view_dynagroup_exprBuilder_comparisonType_startsWith = starts with
+view_dynagroup_exprBuilder_comparisonType_tooltip = \u5BF9\u6BD4\u7C7B\u578B
+view_dynagroup_exprBuilder_definingPlugin = \u5B9A\u4E49\u63D2\u4EF6
+view_dynagroup_exprBuilder_definingPlugin_tooltip = \u67E5\u627E\u63D2\u4EF6
+view_dynagroup_exprBuilder_expression = \u8868\u8FBE\u5F0F
+view_dynagroup_exprBuilder_expressionType = \u8868\u8FBE\u5F0F\u7C7B\u578B
+view_dynagroup_exprBuilder_expressionType_pluginConfig = \u63D2\u4EF6\u914D\u7F6E
+view_dynagroup_exprBuilder_expressionType_resource = \u8D44\u6E90
+view_dynagroup_exprBuilder_expressionType_resourceCategory = \u8D44\u6E90\u79CD\u7C7B
+view_dynagroup_exprBuilder_expressionType_resourceConfig = \u8D44\u6E90\u914D\u7F6E
+view_dynagroup_exprBuilder_expressionType_resourceType = \u8D44\u6E90\u7C7B\u578B
+view_dynagroup_exprBuilder_expressionType_tooltip = \u6B64\u8868\u8FBE\u5F0F\u6307\u5B9A\u8868\u8FBE\u5F0F\u7684\u5C5E\u6027\u7C7B\u578B:<br/> <b>\u8D44\u6E90</b>: \u8D44\u6E90\u5C5E\u6027\uFF1A\u6BD4\u5982\u540D\u79F0\u548C\u7248\u672C<br/> <b>\u8D44\u6E90\u7C7B\u578B</b>: \u641C\u5BFB\u6307\u5B9A\u7C7B\u578B\u7684\u8D44\u6E90<br/> <b>\u8D44\u6E90\u7C7B\u522B</b>: \u6309\u7167\u7C7B\u522B\u67E5\u627E\u8D44\u6E90: \u5E73\u53F0, \u670D\u52A1\u5668, \u670D\u52A1<br/> <b>\u7279\u5F81</b>: \u5B58\u5728\u76D1\u63A7\u70B9\u7684\u8D44\u6E90<br/> <b>\u63D2\u4EF6\u914D\u7F6E</b>: \u6309\u7167\u63D2\u4EF6\u7EC4\u4EF6\u548C\u7EC4\u4EF6\u7684\u914D\u7F6E\u8BBE\u7F6E\u67E5\u8BE2<br/> <b>\u8D44\u6E90\u914D\u7F6E</b>: \u6309\u7167\u88AB\u7BA1\u8D44\u6E90\u7684\u914D\u7F6E\u8BBE\u7F6E\u67E5\u8BE2
+view_dynagroup_exprBuilder_expressionType_trait = \u7279\u5F81
+view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button.
+view_dynagroup_exprBuilder_groupBy = \u5206\u7EC4
+view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it.
+view_dynagroup_exprBuilder_noPlugins = --\u65E0\u63D2\u4EF6--
+view_dynagroup_exprBuilder_noProperties = -\u65E0\u5C5E\u6027--
+view_dynagroup_exprBuilder_noResourceTypes = --\u65E0\u8D44\u6E90\u7C7B\u578B--
+view_dynagroup_exprBuilder_pluginLoadFailure = \u65E0\u6CD5\u83B7\u53D6\u63D2\u4EF6\u5217\u8868
+view_dynagroup_exprBuilder_propLoadFailure = \u65E0\u6CD5\u83B7\u53D6\u5C5E\u6027\u5217\u8868
+view_dynagroup_exprBuilder_propertyName = \u5C5E\u6027\u540D\u79F0
+view_dynagroup_exprBuilder_propertyName_tooltip = \u7528\u4E8E\u67E5\u8BE2\u7684\u5C5E\u6027\u540D\u79F0. \u8FD9\u662F\u7531\u8868\u8FBE\u5F0F\u7C7B\u578B\u548C\u8D44\u6E90\u7C7B\u578B\u51B3\u5B9A\u7684.
+view_dynagroup_exprBuilder_resTypeLoadFailure = \u65E0\u6CD5\u83B7\u53D6\u63D2\u4EF6[{0}]\u7684\u8D44\u6E90\u7C7B\u578B\u5217\u8868
+view_dynagroup_exprBuilder_resource = \u8D44\u6E90
+view_dynagroup_exprBuilder_resourceType = \u8D44\u6E90\u7C7B\u578B
+view_dynagroup_exprBuilder_resourceType_tooltip = \u8D44\u6E90\u7C7B\u578B
+view_dynagroup_exprBuilder_resource_child = Child
+view_dynagroup_exprBuilder_resource_grandparent = Grandparent
+view_dynagroup_exprBuilder_resource_greatGrandparent = GreatGrandparent
+view_dynagroup_exprBuilder_resource_greatGreatGrandparent = GreatGreatGrandparent
+view_dynagroup_exprBuilder_resource_parent = Parent
+view_dynagroup_exprBuilder_resource_resource = Resource
+view_dynagroup_exprBuilder_resource_tooltip = \u9009\u62E9\u8981\u67E5\u8BE2\u8D44\u6E90\u6240\u5728\u7684\u5C42\u7EA7. \u4F8B\u5982, \u9009\u4E2D "parent"\u4F1A\u67E5\u8BE2\u51FA\u7236\u8D44\u6E90\u7684\u6EE1\u8DB3\u5269\u4F59\u8868\u8FBE\u5F0F\u7684\u8D44\u6E90.
+view_dynagroup_exprBuilder_title = \u8868\u8FBE\u5F0F\u7F16\u8BD1
+view_dynagroup_exprBuilder_unset = \u6062\u590D\u8BBE\u7F6E
+view_dynagroup_exprBuilder_unset_tooltip = Unset will find all of the values that have a null value in the database. This is not possible using the "=" operator because of how databases store and query data.
+view_dynagroup_exprBuilder_value_tooltip = \u67E5\u8BE2\u8868\u8FBE\u5F0F\u5B57\u7B26\u4E32\u7684\u503C
+view_dynagroup_expression = \u8868\u8FBE\u5F0F
+view_dynagroup_expressionBuilderIconTooltip = \u8868\u8FBE\u5F0F\u7F16\u8BD1\u4E2D...
+view_dynagroup_expressionSet = \u8868\u8FBE\u5F0F\u7EC4
+view_dynagroup_lastCalculationTime = \u4E0A\u6B21\u8BA1\u7B97\u6301\u7EED\u65F6\u95F4
+view_dynagroup_loadDefinitionFailure = \u52A0\u8F7D\u7EC4\u5B9A\u4E49 [{0}]\u5931\u8D25
+view_dynagroup_loadDefinitionMissing = \u6CA1\u6709ID\u662F[{0}]\u7684\u7EC4\u5B9A\u4E49
+view_dynagroup_mixed = Mixed
+view_dynagroup_newGroupDefinition = \u65B0\u5EFA\u7EC4\u5B9A\u4E49
+view_dynagroup_nextCalculationTime = \u4E0B\u6B21\u8BA1\u7B97\u6301\u7EED\u65F6\u95F4
+view_dynagroup_permDenied = \u60A8\u6CA1\u6709\u67E5\u770B\u7EC4\u5B9A\u4E49\u7684\u6743\u9650
+view_dynagroup_recalcFailure = \u91CD\u7B97\u7EC4\u5B9A\u4E49\u5931\u8D25
+view_dynagroup_recalcFailureSelection = Failed to recalculated the selected group definitions
+view_dynagroup_recalcSuccessful = \u7EC4\u5B9A\u4E49\u5DF2\u7ECF\u91CD\u65B0\u8BA1\u7B97
+view_dynagroup_recalcSuccessfulSelection = You have successfully recalculated [{0}] group definitions
+view_dynagroup_recalculate = \u91CD\u7B97
+view_dynagroup_recalculationInterval = \u91CD\u7B97\u95F4\u9694 (ms)
+view_dynagroup_recursive = \u9012\u5F52
+view_dynagroup_saveAndRecalculate = \u4FDD\u5B58&\u91CD\u7B97
+view_dynagroup_saveFailure = \u4FDD\u5B58\u540D\u79F0\u4E3A[{0}]\u7684\u7EC4\u5B9A\u4E49\u5931\u8D25
+view_dynagroup_saveSuccessful = \u60A8\u6210\u529F\u7684\u4FDD\u5B58\u4E86\u540D\u79F0\u4E3A[{0}]\u7684\u7EC4\u5B9A\u4E49
+view_dynagroup_singleSaveFailure = \u62A5\u9519\u4E86 - \u6B63\u5E38\u5E94\u8BE5\u53EA\u521B\u5EFA\u5355\u4E2A\u7EC4\u5B9A\u4E49, \u4F46\u662F\u5374\u521B\u5EFA\u4E86[{0}]\u4E2A.
+view_dynagroup_template_customExpression = Custom Expression...
+view_dynagroup_template_downedResources = All resources currently down
+view_dynagroup_template_jbossas4_clusters = JBossAS 4 - \u96C6\u7FA4
+view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - Clustered EARs
+view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - All hosting any version of "my" app
+view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - All non-secured
+view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - Unique versions
+view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - \u96C6\u7FA4
+view_dynagroup_template_platforms = Platform resources in inventory
+view_dynagroup_template_uniqueResourceTypes = Unique resource types in inventory
+view_groupConfigEdit_member = \u6210\u5458
+view_groupConfigEdit_noListProps = \u7EC4\u914D\u7F6E\u76EE\u524D\u4E0D\u652F\u6301\u67E5\u770B\u5C5E\u6027\u4FE1\u606F.
+view_groupConfigEdit_setAll = \u8BBE\u7F6E\u6240\u6709\u7684\u503C\u5230:
+view_groupConfigEdit_tooltip_1 = \u6210\u5458\u503C\u6709\u5DEE\u5F02 - \u70B9\u51FB\u6309\u94AE\u7F16\u8F91.
+view_groupConfigEdit_unset = \u56DE\u6EDA
+view_groupConfigEdit_valsDiff = \u6210\u5458\u503C\u6709\u5DEE\u5F02
+view_groupConfigEdit_valsDiffForProp = \u5C5E\u6027 [{0}]\u7684\u6210\u5458\u503C
+view_groupCreateWizard_createFailure = \u521B\u5EFA\u8D44\u6E90\u7EC4\u5931\u8D25
+view_groupCreateWizard_createStepName = \u7EC4\u8BBE\u7F6E
+view_groupCreateWizard_createStep_recursive = \u9012\u5F52
+view_groupCreateWizard_createSuccessful_concise = \u6210\u529F\u7684\u521B\u5EFA\u4E86\u8D44\u6E90\u7EC4. [<a href="{0}">\u67E5\u770B\u7EC4</a>]
+view_groupCreateWizard_createSuccessful_full = \u6210\u529F\u7684\u521B\u5EFA\u540D\u79F0\u662F [{1}]\u5305\u542B [{2}]\u4E2A\u8D44\u6E90\u6210\u5458\u7684[{0}]\u8D44\u6E90\u7EC4
+view_groupCreateWizard_membersStepName = \u9009\u62E9\u6210\u5458
+view_groupCreateWizard_title = \u521B\u5EFA\u7EC4
+view_groupCreateWizard_windowTitle = \u521B\u5EFA\u7EC4
+view_groupInventoryMembers_button_updateMembership = \u66F4\u65B0\u6210\u5458\u5173\u7CFB\u4E2D...
+view_groupInventoryMembers_title_updateMembership = \u66F4\u65B0\u6210\u5458\u5173\u7CFB
+view_group_detail_failLoad = \u52A0\u8F7D\u7EC4ID\u4E3A[{0}]\u7684\u7EC4\u4FE1\u606F\u5931\u8D25
+view_group_detail_failLoadComp = \u52A0\u8F7D\u7EC4ID\u4E3A[{0}]\u7684\u6DF7\u5408\u7EC4\u4FE1\u606F\u5931\u8D25
+view_group_detail_failRecursiveChange = \u4FEE\u6539\u7EC4[{0}]\u7684\u9012\u5F52\u8BBE\u7F6E\u5931\u8D25
+view_group_detail_recursiveChange = \u6210\u529F\u7684\u4FEE\u6539\u7EC4[{0}]\u7684\u9012\u5F52\u8BBE\u7F6E
+view_group_inventory_activity_no_recent_metrics = \u6B64\u7EC4\u6CA1\u6709\u6700\u65B0\u516C\u544A
+view_group_meas_schedules_title = Group Metric Collection Schedules
+view_group_membership_failFetch = \u83B7\u53D6\u8D44\u6E90\u7EC4\u5931\u8D25
+view_group_membership_saveFailure = \u4FEE\u6539[{0}]\u7684\u7EC4\u6210\u5458\u5173\u7CFB\u5931\u8D25
+view_group_membership_saveSuccessful = \u6210\u529F\u7684\u4FEE\u6539[{0}]\u7684\u7EC4\u6210\u5458\u5173\u7CFB
+view_group_operationScheduleDetails_failedToLoadMembers = \u52A0\u8F7D\u7EC4\u6210\u5458\u4FE1\u606F\u5931\u8D25.
+view_group_operationScheduleDetails_field_execute = \u6267\u884C
+view_group_operationScheduleDetails_field_haltOnFailure = \u5931\u8D25\u65F6\u505C\u6B62?
+view_group_operationScheduleDetails_memberResource = \u6210\u5458\u4FE1\u606F
+view_group_operationScheduleDetails_value_parallel = \u91C7\u53D6\u5E76\u884C\u7684\u65B9\u5F0F
+view_group_operationScheduleDetails_value_sequential = \u6309\u7167\u5982\u4E0B\u7684\u987A\u5E8F (\u6DFB\u52A0\u6216\u8005\u5220\u9664\u6210\u5458\u4EE5\u4FEE\u6539\u987A\u5E8F)
+view_group_pluginConfig_edit_currentGroupProperties = \u7EC4\u5F53\u524D\u5C5E\u6027
+view_group_pluginConfig_edit_invalid = The following connection setting properties have invalid values and must be corrected before the connection settings can be saved: [{0}]
+view_group_pluginConfig_edit_noperm = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u6B64\u7EC4\u8FDE\u63A5\u8BBE\u7F6E
+view_group_pluginConfig_edit_saveFailure = Failed to initiate group connection setting update for [{0}] compatible group named [{1}]
+view_group_pluginConfig_edit_saveInitiated_concise = \u7EC4\u8FDE\u63A5\u8BBE\u7F6E\u66F4\u65B0\u5DF2\u7ECF\u521D\u59CB\u5316
+view_group_pluginConfig_edit_saveInitiated_full = The group connection setting updates have been initiated for the [{0}] compatible group named [{1}]
+view_group_pluginConfig_edit_saveTooltip = \u66F4\u65B0\u6240\u6709\u7684\u7EC4\u6210\u5458\u8FDE\u63A5\u8BBE\u7F6E
+view_group_pluginConfig_edit_valid = All connection setting properties have valid values, so the connection settings can now be saved
+view_group_pluginConfig_members_fetchFailure = \u83B7\u53D6[{0}]\u7EC4\u6210\u5458\u7684\u63D2\u4EF6\u914D\u7F6E\u66F4\u65B0\u5386\u53F2\u5931\u8D25
+view_group_pluginConfig_members_fetchFailureConn = \u68C0\u7D22[{0}]\u7684\u6210\u5458\u8FDE\u63A5\u8BBE\u7F6E\u5931\u8D25
+view_group_pluginConfig_members_fetchFailureConnInProgress = \u5F53\u524D\u5DF2\u5B58\u5728\u7EC4\u63D2\u4EF6\u914D\u7F6E\u66F4\u65B0\u8FDB\u7A0B . \u5728\u67E5\u770B\u7EC4\u8BBE\u7F6E\u4E4B\u524D\u9700\u8981\u7B49\u5F85\u66F4\u65B0\u5B8C\u6210.
+view_group_pluginConfig_members_statusDetails = \u8BE6\u7EC6\u72B6\u6001
+view_group_pluginConfig_members_statusFailure = \u672A\u77E5\u9519\u8BEF\uFF0C\u914D\u7F6E\u4FEE\u6539\u5931\u8D25
+view_group_pluginConfig_members_statusInprogress = \u6B63\u5728\u4FEE\u6539\u914D\u7F6E\u4E2D
+view_group_pluginConfig_members_statusNochange = \u6CA1\u6709\u5BF9\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
+view_group_pluginConfig_members_statusSuccess = \u4FEE\u6539\u914D\u7F6E\u6210\u529F
+view_group_pluginConfig_members_title = \u7EC4\u6210\u5458\u8FDE\u63A5\u8BBE\u7F6E\u5386\u53F2
+view_group_pluginConfig_table_clickStatusIcon = \u70B9\u51FB\u72B6\u6001\u6309\u94AE\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F
+view_group_pluginConfig_table_deleteFailure = \u5220\u9664\u7EC4\u63D2\u4EF6\u914D\u7F6E\u5386\u53F2\u5931\u8D25
+view_group_pluginConfig_table_deleteSuccessful = \u60A8\u5220\u9664\u4E86 [{0}] \u5386\u53F2\u9879
+view_group_pluginConfig_table_failFetch = \u83B7\u53D6\u7EC4\u63D2\u4EF6\u914D\u7F6E\u5386\u53F2\u5931\u8D25
+view_group_pluginConfig_table_msg1 = \u67E5\u770B\u5355\u72EC\u8D44\u6E90\u7684\u6210\u5458\u5386\u53F2\u72B6\u6001
+view_group_pluginConfig_table_statusDetails = \u8BE6\u7EC6\u72B6\u6001
+view_group_pluginConfig_table_statusFailure = \u4FEE\u6539\u6B64\u7EC4\u914D\u7F6E\u5931\u8D25
+view_group_pluginConfig_table_statusInprogress = \u7EC4\u914D\u7F6E\u66F4\u65B0\u4E2D
+view_group_pluginConfig_table_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u7EC4\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
+view_group_pluginConfig_table_statusSuccess = \u7EC4\u914D\u7F6E\u66F4\u65B0\u6210\u529F
+view_group_pluginConfig_table_title = \u5386\u53F2\u8FDE\u63A5\u8BBE\u7F6E\u7EC4
+view_group_pluginConfig_table_viewMemberHistory = \u67E5\u770B\u5386\u53F2\u6210\u5458
+view_group_pluginConfig_table_viewSettings = \u67E5\u770B\u8BBE\u7F6E
+view_group_pluginConfig_view_groupProperties = \u7EC4\u5C5E\u6027
+view_group_pluginConfig_view_noperm = \u60A8\u6CA1\u6709\u67E5\u770B\u8FDE\u63A5\u8BBE\u7F6E\u7684\u6743\u9650
+view_group_resConfig_edit_invalid = \u4E0B\u9762\u7684\u5C5E\u6027\u914D\u7F6E\u586B\u5199\u4E86\u65E0\u6548\u7684\u503C ,\u63D0\u4EA4\u4E4B\u524D\u8BF7\u4FEE\u6539: [{0}]
+view_group_resConfig_edit_loadFail = \u68C0\u7D22[{0}]\u7684\u6210\u5458\u8D44\u6E90\u914D\u7F6E\u5931\u8D25
+view_group_resConfig_edit_noperm = \u60A8\u6CA1\u6709\u6743\u9650\u7F16\u8F91\u7EC4\u914D\u7F6E
+view_group_resConfig_edit_saveFailure = \u521D\u59CB\u5316\u8D44\u6E90\u7C7B\u578B[{0}],\u540D\u79F0\u4E3A[{1}]\u7684\u517C\u5BB9\u7EC4\u7EC4\u914D\u7F6E\u66F4\u65B0\u5931\u8D25
+view_group_resConfig_edit_saveInitiated_concise = \u521D\u59CB\u5316\u7EC4\u914D\u7F6E\u66F4\u65B0\u5B8C\u6210
+view_group_resConfig_edit_saveInitiated_full = \u6210\u529F\u521D\u59CB\u5316\u8D44\u6E90\u7C7B\u578B[{0}],\u540D\u79F0\u4E3A[{1}]\u7684\u517C\u5BB9\u7EC4\u7EC4\u914D\u7F6E\u66F4\u65B0
+view_group_resConfig_edit_saveTooltip = \u4FEE\u6539\u6240\u6709\u7684\u7EC4\u6210\u5458\u914D\u7F6E
+view_group_resConfig_edit_valid = \u6240\u6709\u7684\u5C5E\u6027\u914D\u7F6E\u5747\u6709\u6548,\u53EF\u4EE5\u63D0\u4EA4\u4FDD\u5B58
+view_group_resConfig_members_fetchFailure = \u83B7\u53D6\u8D44\u6E90\u7EC4[{0}]\u7684\u6210\u5458\u914D\u7F6E\u4FEE\u6539\u5386\u53F2\u8BB0\u5F55\u5931\u8D25
+view_group_resConfig_members_fetchFailureConfig = \u6062\u590D\u8D44\u6E90\u6210\u5458 [{0}]\u7684\u914D\u7F6E\u8BBE\u7F6E
+view_group_resConfig_members_fetchFailureConfigInProgress = \u6B64\u8D44\u6E90\u7EC4\u914D\u7F6E\u7684\u6B63\u5728\u4FEE\u6539\u4E2D\uFF0C\u5982\u679C\u8981\u67E5\u770B\u7EC4\u8BBE\u7F6E\uFF0C\u9700\u8981\u7B49\u5F85\u6B64\u4FEE\u6539\u5168\u90E8\u5B8C\u6210.
+view_group_resConfig_members_statusDetails = \u8BE6\u7EC6\u72B6\u6001
+view_group_resConfig_members_statusFailure = \u672A\u77E5\u9519\u8BEF\uFF0C\u4FEE\u6539\u914D\u7F6E\u5931\u8D25
+view_group_resConfig_members_statusInprogress = \u6B63\u4FEE\u6539\u6B64\u914D\u7F6E\u4E2D
+view_group_resConfig_members_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
+view_group_resConfig_members_statusSuccess = \u6210\u529F\u7684\u4FEE\u6539\u6B64\u914D\u7F6E
+view_group_resConfig_members_title = \u8D44\u6E90\u7EC4\u914D\u7F6E\u5386\u53F2\u6210\u5458
+view_group_resConfig_table_clickStatusIcon = \u70B9\u51FB\u72B6\u6001\u6309\u94AE\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F
+view_group_resConfig_table_deleteFailure = \u5220\u9664\u5386\u53F2\u8D44\u6E90\u7EC4\u914D\u7F6E\u5931\u8D25
+view_group_resConfig_table_deleteSuccessful = \u6210\u529F\u5220\u9664 [{0}] \u5386\u53F2\u9879
+view_group_resConfig_table_failFetch = \u83B7\u53D6\u8D44\u6E90\u7EC4\u5386\u53F2\u914D\u7F6E\u5931\u8D25
+view_group_resConfig_table_msg1 = \u67E5\u770B\u6BCF\u4E2A\u5355\u72EC\u8D44\u6E90\u7684\u6210\u5458\u5386\u53F2\u72B6\u6001
+view_group_resConfig_table_statusDetails = \u8BE6\u7EC6\u72B6\u6001
+view_group_resConfig_table_statusFailure = \u7EC4\u914D\u7F6E\u4FEE\u6539\u5931\u8D25
+view_group_resConfig_table_statusInprogress = \u6B64\u7EC4\u914D\u7F6E\u7684\u4FEE\u6539\u6B63\u5728\u8FDB\u884C\u4E2D
+view_group_resConfig_table_statusNochange = \u6CA1\u6709\u5BF9\u6B64\u7EC4\u914D\u7F6E\u505A\u4EFB\u4F55\u4FEE\u6539
+view_group_resConfig_table_statusSuccess = \u6210\u529F\u4FEE\u6539\u7EC4\u914D\u7F6E
+view_group_resConfig_table_title = \u5386\u53F2\u8D44\u6E90\u7EC4\u914D\u7F6E
+view_group_resConfig_table_viewMemberHistory = \u67E5\u770B\u5386\u53F2\u6210\u5458
+view_group_resConfig_table_viewSettings = \u67E5\u770B\u8BBE\u7F6E
+view_group_resConfig_view_groupProperties = \u7EC4\u5C5E\u6027
+view_group_resConfig_view_noperm = \u60A8\u6CA1\u6709\u6743\u9650\u67E5\u770B\u8D44\u6E90\u914D\u7F6E\u8BBE\u7F6E
+view_group_summary_compatible = \u517C\u5BB9\u7684
+view_group_summary_descUpdateFailure = \u4FEE\u6539ID\u4E3A[{0}]\u7684\u8D44\u6E90\u7EC4\u63CF\u8FF0\u4FE1\u606F\u5931\u8D25
+view_group_summary_descUpdateSuccessful = \u6210\u529F\u4FEE\u6539\u6B64\u8D44\u6E90\u7EC4\u7684\u63CF\u8FF0
+view_group_summary_dynamic = \u52A8\u6001
+view_group_summary_dynamicNote = \u52A8\u6001\u7EC4\u7684\u540D\u79F0\u548C\u63CF\u8FF0\u662F\u7BA1\u7406\u5C5E\u6027,\u6240\u4EE5\u4E0D\u80FD\u4FEE\u6539
+view_group_summary_groupDefinition = \u7EC4\u5B9A\u4E49
+view_group_summary_memberCount = \u6210\u5458\u6570
+view_group_summary_memberType = \u6210\u5458\u7C7B\u578B
+view_group_summary_mixed = \u6DF7\u5408
+view_group_summary_nameUpdateFailure = Failed to change the name of the resource group with ID [{0}] - could not change from [{1}] to [{2}]
+view_group_summary_nameUpdateSuccessful = You have changed the name of the resource group with ID [{0}] from [{1}] to [{2}]
+view_group_summary_recursive = \u9012\u5F52
+view_helpTop_description = \u8BE5\u90E8\u5206\u5185\u5BB9\u63D0\u4F9B\u4E86\u4EA7\u54C1\u6587\u6863, \u6559\u7A0B, \u7248\u672C\u53F7\u548C\u5176\u4ED6\u6709\u7528\u7684\u4FE1\u606F.
+view_help_section_product = \u4EA7\u54C1\u5E2E\u52A9
+view_help_section_product_about = \u5173\u4E8E\u4EA7\u54C1\u5E2E\u52A9
+view_inventory_adq = Discovery Queue
+view_inventory_allGroups = \u6240\u6709\u7EC4
+view_inventory_allResources = \u6240\u6709\u8D44\u6E90
+view_inventory_collectionInterval = \u641C\u96C6\u95F4\u9694
+view_inventory_dynagroupDefs = \u52A8\u6001\u7EC4\u5B9A\u4E49
+view_inventory_eventDetails_loadFailed = \u52A0\u8F7D\u4E8B\u4EF6\u8BE6\u60C5\u5931\u8D25
+view_inventory_eventHistory_deleteFailed = Failed to deleted selected events for [{0}]
+view_inventory_eventHistory_deleteSuccessful = You have successfully deleted [{0}] events for [{1}]
+view_inventory_eventHistory_details = \u8BE6\u60C5
+view_inventory_eventHistory_detailsFilter = \u8BE6\u60C5\u8FC7\u6EE4
+view_inventory_eventHistory_groupEventHistory = \u7EC4\u5386\u53F2\u4E8B\u4EF6
+view_inventory_eventHistory_purgeFailed = \u4E3A[{0}]\u79FB\u9664\u4E8B\u4EF6\u5931\u8D25
+view_inventory_eventHistory_purgeSuccessful = \u6210\u529F\u5220\u9664[{0}]\u4E2A\u4E8B\u4EF6\u4E3A[{1}]
+view_inventory_eventHistory_resourceEventHistory = \u8D44\u6E90\u5386\u53F2\u4E8B\u4EF6
+view_inventory_eventHistory_severity = \u4E25\u91CD\u7EA7\u522B
+view_inventory_eventHistory_severityFilter = \u4E25\u91CD\u7EA7\u8FC7\u6EE4
+view_inventory_eventHistory_sourceFilter = Source\u8FC7\u6EE4
+view_inventory_eventHistory_sourceLocation = Source\u4F4D\u7F6E
+view_inventory_eventHistory_timestamp = \u65F6\u95F4\u6233
+view_inventory_groups = \u7EC4
+view_inventory_groups_children = \u5B50\u7EC4
+view_inventory_groups_deleteFailed = \u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90\u7EC4\u5931\u8D25
+view_inventory_groups_deleteSuccessful = \u6210\u529F\u7684\u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90\u7EC4
+view_inventory_groups_descendants = \u540E\u4EE3\u7EC4
+view_inventory_groups_loadFailed = \u52A0\u8F7D\u7EC4\u7EC4\u5408\u6570\u636E\u5931\u8D25
+view_inventory_groups_resourceGroups = \u8D44\u6E90\u7EC4
+view_inventory_mixed = \u6DF7\u5408
+view_inventory_platforms = \u5E73\u53F0
+view_inventory_problemGroups = \u95EE\u9898\u7EC4
+view_inventory_resource_loadFailed = id\u4E3A [{0}]\u7684\u8D44\u6E90\u4E0D\u5B58\u5728\u6216\u8005\u4E0D\u53EF\u8FBE
+view_inventory_resources_deleteConfirm = \u786E\u5B9A\u5220\u9664\u9009\u4E2D\u7684\u8D44\u6E90\uFF1F
+view_inventory_resources_deleteFailed = \u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90\u5931\u8D25
+view_inventory_resources_deleteSuccessful = \u6210\u529F\u7684\u5220\u9664\u6307\u5B9A\u7684\u8D44\u6E90
+view_inventory_resources_loadFailed = \u52A0\u8F7D\u8D44\u6E90\u7EC4\u5408\u6570\u636E\u5931\u8D25
+view_inventory_resources_title = Resources
+view_inventory_resources_title_children = \u5B50\u8D44\u6E90
+view_inventory_resources_title_members = \u6210\u5458\u8D44\u6E90
+view_inventory_resources_uninventoryConfirm = \u786E\u5B9A\u628A\u9009\u4E2D\u7684\u8D44\u6E90\u4ECE\u6E05\u5355\u4E2D\u5220\u9664? \u6CE8\u610F\uFF1A\u5982\u679C\u67D0\u4E2A\u9009\u4E2D\u7684\u8D44\u6E90\u4F9D\u7136\u5B58\u5728, \u5219\u7CFB\u7EDF\u4F1A\u5728\u6B64\u8D44\u6E90\u7684\u5BA2\u6237\u7AEF\u7A0B\u5E8F\u4E0B\u6B21\u63A2\u7D22\u626B\u63CF\u65F6\u91CD\u65B0\u52A0\u8F7D\u6B64\u8D44\u6E90.
+view_inventory_resources_uninventoryFailed = \u4ECE\u6E05\u5355\u4E2D\u5220\u9664\u9009\u4E2D\u7684\u8D44\u6E90\u5931\u8D25
+view_inventory_resources_uninventorySuccessful = \u6210\u529F\u4ECE\u6E05\u5355\u4E2D\u5220\u9664\u9009\u4E2D\u7684\u8D44\u6E90
+view_inventory_sectionHelp = \u6B64\u6A21\u5757\u53EF\u4EE5\u67E5\u770B\u548C\u7BA1\u7406\u65B0\u53D1\u73B0\u7684\u8D44\u6E90,\u5206\u7C7B\u7684\u8D44\u6E90\u548C\u7EC4.
+view_inventory_servers = \u670D\u52A1\u5668
+view_inventory_services = \u670D\u52A1
+view_inventory_summary_agent_error1 = \u67E5\u627E\u5BA2\u6237\u7AEF\u7BA1\u7406\u7684\u8D44\u6E90id\u5931\u8D25
+view_inventory_summary_agent_error2 = \u5BA2\u6237\u7AEF\u7BA1\u7406\u7684\u8D44\u6E90ping\u4E0D\u901A
+view_inventory_summary_agent_error3 = \u6CA1\u6709\u6743\u9650\u67E5\u770B\u6B64\u5BA2\u6237\u7AEF\u7684\u8BE6\u7EC6\u4FE1\u606F.
+view_inventory_summary_agent_fullEnpoint = Full Endpoint
+view_inventory_summary_agent_fullEnpoint_err1 = !No remote endpoint associated with this resource!
+view_inventory_summary_agent_last_title = \u6700\u540E\u63A5\u6536\u5230\u7684\u53EF\u7528\u4FE1\u606F\u62A5\u544A
+view_inventory_summary_agent_status_title = \u5BA2\u6237\u7AEF\u901A\u4FE1\u72B6\u6001
+view_inventory_summary_agent_title = \u5BA2\u6237\u7AEF\u7BA1\u7406\u6B64\u8D44\u6E90
+view_inventory_unavailableServers = \u4E0D\u53EF\u7528\u7684\u670D\u52A1
+view_leftNav_unknownPage = \u6A21\u5757[{1}]\u4E0B\u672A\u77E5\u7684\u9875\u9762[{0}] - \u94FE\u63A5\u65E0\u6548.
+view_login_invalidEmail = \u65E0\u6548\u7684\u90AE\u7BB1\u5730\u5740
+view_login_login = \u767B\u5F55
+view_login_logout = \u6CE8\u9500
+view_login_noBackend = \u540E\u7AEF\u6570\u636E\u4E0D\u53EF\u8FBE.
+view_login_noLdap = \u63D0\u793A: \u83B7\u53D6\u53EF\u9009\u7684ldap\u4FE1\u606F\u5931\u8D25. \u9700\u8981\u624B\u5DE5\u8F93\u5165.
+view_login_noUser = \u7528\u6237\u540D\u6216\u8005\u5BC6\u7801\u4E0D\u5339\u914D.
+view_login_prompt = \u8BF7\u767B\u5F55
+view_login_registerLater = (\u53D6\u6D88 - \u7A0D\u540E\u5B8C\u6210\u6CE8\u518C.)
+view_login_registerLdapSuccess = \u6210\u529F\u6CE8\u518C\u65B0\u7684LDAP\u7528\u6237.
+view_login_registerUser = \u7528\u6237\u6CE8\u518C
+view_login_welcome = \u6B22\u8FCE
+view_login_welcomeMsg = \u6B22\u8FCE\u6765\u5230 RHQ! <br/><br/> \u8F93\u5165\u6216\u8005\u4FEE\u6539\u4E0B\u9762\u7684\u4FE1\u606F\uFF0C\u4EE5\u5B8C\u6210\u6CE8\u518C<br/> \u70B9\u51FB"OK", \u5C31\u53EF\u4EE5\u767B\u5F55\u7CFB\u7EDF.<br/><br/>
+view_measureRange_last = \u65F6\u95F4\u8303\u56F4 - \u5148\u524D\u7684
+view_measureRange_simple = \u4E00\u822C...
+view_measureRange_start = \u65F6\u95F4\u8303\u56F4 - \u8D77\u59CB
+view_measureTable_chartMetricValues = Chart Selected Metrics
+view_measureTable_getLive = Get Live Value
+view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up.
+view_measureTable_live_title = \u52A8\u6001\u6570\u636E
+view_measure_nan = --\u65E0\u6570\u636E--
+view_measurementOob_title = Suspect Metrics
+view_menuBar_logout = \u6CE8\u9500
+view_messageCenter_clearAllMessages = \u6E05\u9664\u6240\u6709\u7684\u6D88\u606F
+view_messageCenter_lastNMessages = \u6700\u540E {0} \u6761\u4FE1\u606F
+view_messageCenter_maxMessages = \u6700\u5927\u6D88\u606F\u91CF
+view_messageCenter_messageBarShowDetails = \u663E\u793A\u5185\u5BB9
+view_messageCenter_messageDetail = \u8BE6\u7EC6\u5185\u5BB9
+view_messageCenter_messageSeverity = \u91CD\u8981\u7EA7\u522B
+view_messageCenter_messageTime = \u65F6\u95F4
+view_messageCenter_messageTitle = \u6D88\u606F\u4E2D\u5FC3
+view_messageCenter_noRecentMessages = \u65E0\u8FD1\u671F\u6D88\u606F
+view_messageCenter_stackTraceFollows = --- \u540E\u9762\u662F\u5F02\u5E38\u4FE1\u606F ---
+view_metric_traits = Traits
+view_metric_viewTraitHistory = Value History for Trait [{0}]
+view_operationHistoryDetails_dateCompleted = Date Completed
+view_operationHistoryDetails_dateSubmitted = Date Submitted
+view_operationHistoryDetails_error_fetchFailure = \u52A0\u8F7D\u64CD\u4F5C\u5386\u53F2\u5931\u8D25.
+view_operationHistoryDetails_noResults = \u6B64\u64CD\u4F5C\u6CA1\u6709\u4EFB\u4F55\u8FD4\u56DE.
+view_operationHistoryDetails_operation = \u64CD\u4F5C
+view_operationHistoryDetails_parameters = \u53C2\u6570
+view_operationHistoryDetails_requestor = \u8BF7\u6C42
+view_operationHistoryDetails_results = \u7ED3\u679C
+view_operationHistoryDetails_status = \u72B6\u6001
+view_operationHistoryList_button_forceDelete = \u5F3A\u5236\u5220\u9664
+view_operationHistoryList_button_runOperation = \u6267\u884C\u64CD\u4F5C
+view_operationHistoryList_notYetStarted = \u8FD8\u672A\u5F00\u59CB
+view_operationHistoryList_title = \u64CD\u4F5C\u5386\u53F2
+view_operationScheduleDetails_enterParametersBelow = \u8F93\u5165\u4E0B\u9762\u7684\u53C2\u6570...
+view_operationScheduleDetails_fieldDefault_description = \u9009\u62E9\u64CD\u4F5C\u67E5\u770B\u63CF\u8FF0.
+view_operationScheduleDetails_fieldDefault_parameters = \u9009\u62E9\u64CD\u4F5C\u67E5\u770B\u6240\u9700\u7684\u53C2\u6570.
+view_operationScheduleDetails_fieldHelp_description = \u6B64\u8C03\u5EA6\u64CD\u4F5C\u7684\u53EF\u9009\u63CF\u8FF0 (e.g. \u6BCF\u591C\u7EF4\u62A4\u5E94\u7528\u670D\u52A1\u91CD\u542F)
+view_operationScheduleDetails_fieldHelp_timeout = \u64CD\u4F5C\u6301\u7EED\u65F6\u95F4 - \u5982\u679C\u6307\u5B9A, \u5E76\u4E14\u8D85\u8FC7\u4E86\u6307\u5B9A\u7684\u65F6\u95F4\u64CD\u4F5C\u6CA1\u6709\u5B8C\u6210, RHQ \u670D\u52A1\u5224\u5B9A\u6B64\u64CD\u4F5C\u8D85\u65F6\u5E76\u4E14\u6807\u4E3A\u5931\u8D25; \u63D0\u793A, \u901A\u5E38 \u4E0D\u53EF\u80FD\u7EC8\u6B62\u5DF2\u7ECF\u5F00\u59CB\u8FD0\u884C\u7684\u540E\u53F0\u8D44\u6E90\u7BA1\u7406\u7684\u64CD\u4F5C.
+view_operationScheduleDetails_field_description = \u63CF\u8FF0
+view_operationScheduleDetails_field_parameters = \u53C2\u6570
+view_operationScheduleDetails_field_timeout = \u8D85\u65F6
+view_operationScheduleDetails_noParameters = \u6B64\u64CD\u4F5C\u4E0D\u9700\u8981\u4EFB\u4F55\u53C2\u6570.
+view_operationScheduleDetails_operationSchedule = \u64CD\u4F5C\u8BA1\u5212
+view_portlet_autodiscovery_setting_platforms = \u5E73\u53F0\u7ED3\u679C\u96C6
+view_portlet_configure_definitionDesc = portlet\u914D\u7F6E\u8BBE\u7F6E\u63CF\u8FF0.
+view_portlet_configure_definitionTitle = Portlet\u914D\u7F6E
+view_portlet_configure_needed = \u70B9\u51FB\u8BBE\u7F6E\u6309\u94AE\u914D\u7F6Eportlet.
+view_portlet_configure_notNeeded = \u6B64 portlet\u65E0\u9700\u914D\u7F6E.
+view_portlet_defaultName_autodiscovery = \u63A2\u7D22\u961F\u5217
+view_portlet_defaultName_favoriteResources = \u5E38\u7528\u8D44\u6E90
+view_portlet_defaultName_groupMetric = \u516C\u7528\u8D44\u6E90\u7EC4\u56FE\u6807
+view_portlet_defaultName_group_alerts = \u7EC4: \u544A\u8B66
+view_portlet_defaultName_group_bundles = \u7EC4: \u7C7B\u53D1\u5E03
+view_portlet_defaultName_group_config_updates = \u7EC4: \u914D\u7F6E\u66F4\u65B0
+view_portlet_defaultName_group_events = \u7EC4: \u4E8B\u4EF6\u7EDF\u8BA1
+view_portlet_defaultName_group_metrics = \u7EC4: Metrics
+view_portlet_defaultName_group_oobs = \u7EC4: OOB\u72B6\u6001
+view_portlet_defaultName_group_operations = \u7EC4: \u64CD\u4F5C\u96C6
+view_portlet_defaultName_group_pkg_hisory = \u7EC4: \u5386\u53F2\u6570\u636E\u5305
+view_portlet_defaultName_inventorySummary = \u6E05\u5355\u6982\u8981
+view_portlet_defaultName_mashup = Mashup
+view_portlet_defaultName_message = \u4FE1\u606F
+view_portlet_defaultName_operations = \u8FD1\u671F\u64CD\u4F5C
+view_portlet_defaultName_platformSummary = \u5E73\u53F0\u5229\u7528\u7387
+view_portlet_defaultName_problemResources = \u544A\u8B66\u6216\u8005\u4E0D\u53EF\u7528\u7684\u8D44\u6E90
+view_portlet_defaultName_recentAlerts = \u65B0\u544A\u8B66
+view_portlet_defaultName_recentlyAddedResources = \u65B0\u6DFB\u52A0\u8D44\u6E90
+view_portlet_defaultName_resourceMetric = \u516C\u7528\u8D44\u6E90\u56FE\u6807
+view_portlet_defaultName_resource_alerts = \u8D44\u6E90: \u544A\u8B66
+view_portlet_defaultName_resource_bundles = \u8D44\u6E90: \u7C7B\u53D1\u5E03
+view_portlet_defaultName_resource_config_updates = \u8D44\u6E90: \u914D\u7F6E\u66F4\u65B0
+view_portlet_defaultName_resource_events = \u8D44\u6E90: \u4E8B\u4EF6\u7EDF\u8BA1
+view_portlet_defaultName_resource_metrics = \u8D44\u6E90: \u5C5E\u6027
+view_portlet_defaultName_resource_oobs = \u8D44\u6E90: OOB Metrics
+view_portlet_defaultName_resource_operations = \u8D44\u6E90: \u64CD\u4F5C
+view_portlet_defaultName_resource_pkg_hisory = \u8D44\u6E90: \u5386\u53F2\u6570\u636E\u5305
+view_portlet_defaultName_tagCloud = \u6807\u7B7E\u4E91
+view_portlet_factory_invalidPortlet = \u8FD9\u662F\u4E00\u4E2A\u9648\u65E7\u5E76\u4E14\u5DF2\u7ECF\u5931\u6548\u7684portlet. \u8BF7\u5220\u9664.
+view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
+view_portlet_graph_configure_resource_graph = The resource to graph
+view_portlet_help_autodiscovery = \u6B64portlet\u5141\u8BB8\u5BFC\u5165 \u6216\u8005\u5931\u6548\u65B0\u53D1\u73B0\u7684\u8D44\u6E90. \u5BFC\u5165\u7684\u8D44\u6E90\u5C06\u4F1A\u6DFB\u52A0\u81F3\u76D1\u63A7\u548C\u7BA1\u7406\u6E05\u5355\u4E2D\uFF0C\u5931\u6548\u7684\u8D44\u6E90\u5C06\u4E0D\u4F1A\u88AB\u5BFC\u5165\u5E76\u4E14 \u662F\u4E0D\u53EF\u89C1\u7684\uFF0C\u9664\u975E\u660E\u786E\u6307\u5B9A\u4E0D\u53EF\u5931\u6548.
+view_portlet_help_bundle_deps = \u6B64portlet\u5C55\u793A\u57FA\u4E8E\u6807\u51C6\u914D\u7F6E\u663E\u793A\u7684\u76F8\u5173\u53D1\u5E03\u7C7B.
+view_portlet_help_config_updates = \u6B64portlet\u5C55\u793A\u4E0E\u914D\u7F6E\u8BBE\u7F6E\u517C\u5BB9\u7684\u6700\u65B0\u7684\u914D\u7F6E\u4FEE\u6539.
+view_portlet_help_eventcounts = This portlet displays Event counts consistent with display criteria configured.
+view_portlet_help_favoriteResources = This portlet displays the current user''s favorite resources.
+view_portlet_help_graph = This portlet displays the resource metric graph.
+view_portlet_help_inventorySummary = This portlet displays a short summary of the current user''s viewable inventory and metric collection rate.
+view_portlet_help_mashup = This portlet displays the returned content of a remote HTTP request (via an iframe).
+view_portlet_help_message = This portlet displays a static HTML message. The <i>message</i> property must be configured.
+view_portlet_help_metrics = This portlet graphs relevant recent metric data based on display criteria configured.
+view_portlet_help_none = \u8FD9\u4E2Aportlet\u6CA1\u6709\u5E2E\u52A9.
+view_portlet_help_oobs = This portlet displays OOB(Out of Bound) metric conditions.
+view_portlet_help_operations = This portlet displays the most recently executed operations for the current user''s inventory.
+view_portlet_help_operations_criteria = This portlet displays Operations consistent with display criteria configured.
+view_portlet_help_pkg_history = This portlet shows relevant package history based on display criteria configured.
+view_portlet_help_platformSummary = This portlet displays utilization data (such as current CPU and memory usage) for platform resources that are accessible by the current user.
+view_portlet_help_problemResources = This portlet displays the current user''s alerted or unavailable resources.
+view_portlet_help_recentAlerts = This portlet displays alerts recently fired on the current user''s viewable inventory.
+view_portlet_help_recentlyAdded = This portlet displays resources that have recently been imported into inventory.
+view_portlet_help_scheduledOperations = This portlet displays the next scheduled operations for the current user''s inventory.
+view_portlet_help_tagCloud = This portlet displays the relative tag counts for the current user''s inventory.
+view_portlet_inventory_error1 = Failed to retrieve inventory summary
+view_portlet_inventory_tooltip_collapse = Click to hide details for this resource.
+view_portlet_inventory_tooltip_expand = Click to show more details for this resource.
+view_portlet_message_title = \u663E\u793A\u4FE1\u606F.
+view_portlet_operations_config_completed = \u5DF2\u5B8C\u6210\u7684\u64CD\u4F5C
+view_portlet_operations_config_completed_enable = \u662F\u5426\u5BF9\u7EDF\u8BA1\u8868\u76D8\u7684\u5DF2\u5B8C\u6210\u64CD\u4F5C\u7684\u7ED3\u679C\u5206\u7EC4.
+view_portlet_operations_config_completed_maximum = \u80FD\u5C55\u793A\u7684\u5DF2\u5B8C\u6210\u64CD\u4F5C\u7684\u6700\u5927\u6570.
+view_portlet_operations_config_scheduled_enable = \u662F\u5426\u5BF9\u7EDF\u8BA1\u8868\u76D8\u7684\u8C03\u5EA6\u4E2D\u64CD\u4F5C\u7684\u7ED3\u679C\u5206\u7EC4.
+view_portlet_operations_config_scheduled_maximum = \u80FD\u5C55\u793A\u7684\u8C03\u5EA6\u64CD\u4F5C\u7684\u6700\u5927\u6570.
+view_portlet_operations_config_show_last = show last
+view_portlet_operations_config_show_next = show next
+view_portlet_operations_disabled = (\u76EE\u524D\u7ED3\u679C\u96C6\u7981\u7528.\u4FEE\u6539\u8BBE\u7F6E\u4F7F\u5176\u751F\u6548.
+view_portlet_platform_platform_error_1 = \u52A0\u8F7D\u5E73\u53F0\u6307\u6807\u5931\u8D25
+view_portlet_platform_type_error_1 = \u65E0\u6CD5\u52A0\u8F7D\u7C7B\u578B\u6570\u636E
+view_portlet_problemResources_config_display_maximum = \u80FD\u5C55\u793A\u7684\u95EE\u9898\u8D44\u6E90\u7684\u6700\u5927\u6570.
+view_portlet_problemResources_config_display_range = \u663E\u793A\u6570\u5C0F\u65F6\u5185\u6062\u590D\u6B63\u5E38\u7684\u95EE\u9898\u8D44\u6E90.
+view_portlet_problemResources_config_display_range2 = \u4ECE {0} \u5230 {1}
+view_portlet_problemResources_maxDisplaySetting = \u8D44\u6E90\u6700\u5927\u6570.
+view_portlet_recentAlerts_config_members = \u9009\u62E9\u6210\u5458
+view_portlet_recentAlerts_config_priority_label = \u4E4B\u524D\u7684\u544A\u8B66,
+view_portlet_recentAlerts_config_when = \u5728\u8FC7\u53BB
+view_portlet_recentAlerts_fail_msg = \u52A0\u8F7D\u544A\u8B66\u8FC7\u6EE4\u7684\u6307\u5B9A\u8D44\u6E90\u5931\u8D25.
+view_portlet_recentlyAdded_error1 = \u52A0\u8F7D\u6700\u65B0\u6DFB\u52A0\u7684\u8D44\u6E90\u5931\u8D25
+view_portlet_recentlyAdded_setting_addedPlatforms = \u65B0\u6DFB\u52A0\u5E73\u53F0
+view_portlet_results_empty = \u4F7F\u7528\u6307\u5B9A\u7684\u6807\u51C6\u65E0\u7ED3\u679C\u8FD4\u56DE.
+view_remoteAgentInstall_agentStatus = \u4EE3\u7406\u72B6\u6001
+view_remoteAgentInstall_agentStatusDefault = -\u5355\u51FB\u66F4\u65B0\u72B6\u6001\u6309\u94AE-
+view_remoteAgentInstall_buttonFindAgent = \u67E5\u627E\u4EE3\u7406
+view_remoteAgentInstall_connInfo = \u8FDE\u63A5\u4FE1\u606F
+view_remoteAgentInstall_error_1 = \u67E5\u627E\u4EE3\u7406\u5B89\u88C5\u8DEF\u5F84\u65F6\u53D1\u751F\u9519\u8BEF
+view_remoteAgentInstall_error_2 = \u65E0\u6CD5\u5728\u901A\u5E38\u4F4D\u7F6E\u53D1\u73B0\u5B89\u88C5\u7684\u4EE3\u7406
+view_remoteAgentInstall_error_3 = \u65E0\u6CD5\u770B\u5230\u5728[{0}]\u4E2D\u5B89\u88C5\u4E86\u4EE3\u7406
+view_remoteAgentInstall_error_4 = \u5B89\u88C5\u4EE3\u7406\u5931\u8D25
+view_remoteAgentInstall_error_5 = \u542F\u52A8\u4EE3\u7406\u5931\u8D25
+view_remoteAgentInstall_error_6 = \u505C\u6B62\u4EE3\u7406\u5931\u8D25
+view_remoteAgentInstall_installAgent = \u5B89\u88C5\u4EE3\u7406
+view_remoteAgentInstall_installInfo = \u4EE3\u7406\u5B89\u88C5\u4FE1\u606F
+view_remoteAgentInstall_installPath = \u4EE3\u7406\u5B89\u88C5\u8DEF\u5F84
+view_remoteAgentInstall_owner = \u6240\u6709\u8005
+view_remoteAgentInstall_promptHost = The host where the agent is or will be installed
+view_remoteAgentInstall_promptInstallPath = Where the agent is or will be installed. If you aren''t sure where an agent is installed, enter a parent directory and click the ''Find Agent'' button to scan that directory and below. If you enter an empty path, common locations are searched on the host for an agent install.
+view_remoteAgentInstall_promptPassword = The credentials that are used to authenticate the user on the host via SSH
+view_remoteAgentInstall_promptPort = The port the SSH server is listening to. If not specified, the default is 22
+view_remoteAgentInstall_promptUser = The name of the user whose credentials are passed to the host via SSH
+view_remoteAgentInstall_result = \u7ED3\u679C
+view_remoteAgentInstall_resultCode = ResultCode
+view_remoteAgentInstall_startAgent = \u542F\u52A8\u4EE3\u7406
+view_remoteAgentInstall_startAgentResults = \u4EE3\u7406\u542F\u52A8\u7ED3\u679C: [{0}]
+view_remoteAgentInstall_step = Step
+view_remoteAgentInstall_stopAgent = \u505C\u6B62\u4EE3\u7406
+view_remoteAgentInstall_stopAgentResults = \u4EE3\u7406\u505C\u6B62\u7ED3\u679C: [{0}]
+view_remoteAgentInstall_success = \u4EE3\u7406\u5B89\u88C5\u5B8C\u6210
+view_remoteAgentInstall_updateStatus = \u66F4\u65B0\u72B6\u6001
+view_reportsTop_description = \u8BE5\u90E8\u5206\u5185\u5BB9\u63D0\u4F9B\u4E86\u5168\u5C40\u62A5\u8868\u7684\u5165\u53E3.
+view_reportsTop_title = \u62A5\u8868
+view_reports_alertDefinitions = \u544A\u8B66\u5B9A\u4E49
+view_reports_alertDefinitions_parentHover = \u70B9\u51FB\u5230\u7236\u7EA7\u544A\u8B66\u83DC\u5355
+view_reports_alertDefinitions_resTypeLoadError = \u65E0\u6CD5\u83B7\u53D6\u8D44\u6E90\u6A21\u677F\u7C7B\u578B - \u65E0\u6CD5\u67E5\u770B\u544A\u8B66\u6A21\u677F.
+view_reports_inventorySummary_failFetch = \u83B7\u53D6\u7EDF\u8BA1\u6E05\u5355\u5931\u8D25
+view_reports_platforms = \u5E73\u53F0\u4F7F\u7528\u7387\u62A5\u8868
+view_reports_subsystems = \u5B50\u7CFB\u7EDF\u62A5\u8868
+view_resourceResourceGroupList_error_fetchFailure = \u83B7\u53D6\u8D44\u6E90\u7EC4\u4FE1\u606F\u5931\u8D25.
+view_resourceResourceGroupList_error_updateFailure = \u66F4\u65B0\u6307\u5B9A\u7684\u8D44\u6E90\u7EC4\u5931\u8D25.
+view_resourceResourceGroupList_message_updateSuccess = [{0}]\u7684\u7EC4\u6210\u5458\u5DF2\u7ECF\u66F4\u65B0.
+view_resource_inventory_activity_changed_by = Changed by
+view_resource_inventory_activity_criteria_no_recent_events = No event counts based off display criteria.
+view_resource_inventory_activity_no_recent_alerts = \u65E0\u6700\u65B0\u544A\u8B66
+view_resource_inventory_activity_no_recent_bundle_deploy = No recent bundle deployments
+view_resource_inventory_activity_no_recent_config_history = No configuration change history
+view_resource_inventory_activity_no_recent_events = No events in the last 24 hours
+view_resource_inventory_activity_no_recent_metrics = This resource has no recent metrics
+view_resource_inventory_activity_no_recent_oob = No OOB conditions found
+view_resource_inventory_activity_no_recent_operations = \u6CA1\u6709\u6700\u65B0\u64CD\u4F5C\u5386\u53F2
+view_resource_inventory_activity_no_recent_pkg_history = \u6CA1\u6709\u6700\u65B0\u5305\u5386\u53F2
+view_resource_inventory_childhistory_createdChild = Created Child
+view_resource_inventory_childhistory_deletedChild = Deleted Child
+view_resource_inventory_childhistory_filterTitle = Past N Days
+view_resource_inventory_childhistory_status_invalidArtifact = Invalid Artifact
+view_resource_inventory_childhistory_status_invalidConfig = \u65E0\u6548\u914D\u7F6E
+view_resource_monitor_availability_loadFailed = \u52A0\u8F7D\u53EF\u7528\u6027\u5386\u53F2\u8BB0\u5F55\u5931\u8D25
+view_resource_monitor_calltime_average = Average
+view_resource_monitor_calltime_count = Count
+view_resource_monitor_calltime_destination = Call Destination
+view_resource_monitor_calltime_editFailed = Call time data can not be edited
+view_resource_monitor_calltime_loadFailed = Could not load call time data
+view_resource_monitor_calltime_lookupFailed = Could not load resource for call time
+view_resource_monitor_calltime_maximum = Maximum
+view_resource_monitor_calltime_minimum = Minimum
+view_resource_monitor_calltime_title = Call Time Data
+view_resource_monitor_calltime_total = Total
+view_resource_monitor_detailed_graph_label = Detailed Graph
+view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
+view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
+view_resource_monitor_graphs_loadFailed = \u52A0\u8F7D\u7ED8\u56FE\u6570\u636E\u5931\u8D25
+view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
+view_resource_monitor_graphs_noneAvailable = No graphs available
+view_resource_monitor_schedules_title = Resource Metric Collection Schedules
+view_resource_monitor_table_alerts = Alerts
+view_resource_monitor_table_avg = Average
+view_resource_monitor_table_last = Last
+view_resource_monitor_table_max = Maximum
+view_resource_monitor_table_min = Minimum
+view_resource_title_component_errors_tooltip = Shows managed component errors. Click for details
+view_resource_title_tagUpdateFailed = Failed to update resource tags
+view_searchBar_defaultPattern = \u5B9A\u4E49\u81EA\u5DF1\u7684\u6837\u5F0F
+view_searchBar_error_selectSavedSearch = ''\u9009\u62E9\u4FDD\u5B58\u7684\u641C\u7D22\u65F6\u51FA\u9519''
+view_searchBar_query = \u67E5\u8BE2
+view_searchBar_resourceGroups = \u8D44\u6E90\u7EC4
+view_searchBar_resources = \u8D44\u6E90
+view_searchBar_welcomeMessage = \u641C\u7D22\u4E86{0}\u79D2
+view_searchGUI_loginStatus = \u65E0\u6CD5\u786E\u5B9A\u767B\u5F55\u72B6\u6001\uFF0C\u8BF7\u68C0\u67E5\u670D\u52A1
+view_selector_assigned = \u6307\u5B9A\u7684 {0}
+view_selector_available = \u53EF\u7528\u7684 {0}
+view_subTab_error_disabled = \u65E0\u6CD5\u9009\u4E2D\u7981\u7528\u7684\u5B50\u8868 [{0}].
+view_summaryDashboard_resetConfirm = \u6062\u590D\u5230\u9ED8\u8BA4\u7684\u7EDF\u8BA1\u56FE\u8868 (\u653E\u5F03\u4E4B\u524D\u4FDD\u5B58\u7684\u4FE1\u606F)?
+view_summaryOverviewForm_error_descriptionChangeFailure = Failed to change description of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_nameChangeFailure = Failed to change name of Resource with id {0} from [{1}] to [{2}].
+view_summaryOverviewForm_error_traitsLoadFailure = \u52A0\u8F7D {0}\u7684\u5C5E\u6027\u4FE1\u606F\u5931\u8D25.
+view_summaryOverviewForm_field_description = \u63CF\u8FF0
+view_summaryOverviewForm_field_location = \u4F4D\u7F6E
+view_summaryOverviewForm_field_name = \u5B57\u6BB5\u540D
+view_summaryOverviewForm_field_type = \u7C7B\u578B
+view_summaryOverviewForm_field_version = \u7248\u672C\u53F7
+view_summaryOverviewForm_header_summary = \u7EDF\u8BA1
+view_summaryOverviewForm_label_plugin = \u63D2\u4EF6\u6807\u7B7E:
+view_summaryOverviewForm_label_type = \u6807\u7B7E\u7C7B\u578B:
+view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
+view_summaryOverview_header_detectedErrors = \u5DF2\u68C0\u6D4B\u5230\u7684\u9519\u8BEF
+view_summaryOverview_title_errorDetailsWindow = \u9519\u8BEF\u8BE6\u7EC6
+view_summaryOverview_tooltip_detectedErrors = \u70B9\u51FB\u5BF9\u5E94\u7684\u884C\u67E5\u770B\u9519\u8BEF\u4FE1\u606F.
+view_tableSection_backButton = \u8FD4\u56DE\u5217\u8868
+view_tableSection_error_badId = \u65E0\u6CD5\u5C55\u793A [{0}]\u7684\u8BE6\u7EC6\u4FE1\u606F. \u65E0\u6548\u7684 'id': [{1}]. \u8BF7\u62A5\u544A\u6B64BUG
+view_tableSection_error_noId = \u8868\u5355 [{0}] \u8BB0\u5F55\u7F3A\u5C11'id'\u5C5E\u6027 - \u8BF7\u62A5\u544A\u6B64BUG.
+view_table_drawFail = \u751F\u6210\u8868\u683C[{0}]\u5931\u8D25.
+view_table_matchingRows = \u5339\u914D\u7684\u884C: {0} (\u9009\u4E2D: {1})
+view_table_totalRows = \u6240\u6709\u7684\u884C: {0} (\u9009\u4E2D: {1})
+view_tabs_common_activity = \u6D3B\u52A8
+view_tabs_common_agent = \u4EE3\u7406
+view_tabs_common_alerts = \u544A\u8B66
+view_tabs_common_availability = \u53EF\u7528\u6027
+view_tabs_common_calltime = Calltime
+view_tabs_common_child_history = \u5B50\u5386\u53F2
+view_tabs_common_child_resources = \u5B50\u8D44\u6E90
+view_tabs_common_configuration = \u914D\u7F6E
+view_tabs_common_connectionSettings = \u8FDE\u63A5\u8BBE\u7F6E
+view_tabs_common_connectionSettingsHistory = \u5386\u53F2\u8FDE\u63A5\u8BBE\u7F6E
+view_tabs_common_content = \u5185\u5BB9
+view_tabs_common_current = \u5F53\u524D
+view_tabs_common_dashboard = \u7EDF\u8BA1\u8868\u76D8
+view_tabs_common_definitions = \u5B9A\u4E49
+view_tabs_common_deployed = \u5DF2\u53D1\u5E03
+view_tabs_common_events = \u4E8B\u4EF6
+view_tabs_common_graphs = Graphs
+view_tabs_common_group_members = \u7EC4\u5458
+view_tabs_common_group_membership = \u7EC4\u6210\u5458\u5173\u7CFB
+view_tabs_common_groups = Groups
+view_tabs_common_history = \u5386\u53F2
+view_tabs_common_inventory = \u6E05\u5355
+view_tabs_common_members = Members
+view_tabs_common_monitoring = \u76D1\u63A7
+view_tabs_common_new = new
+view_tabs_common_operations = \u64CD\u4F5C
+view_tabs_common_overview = \u6982\u89C8
+view_tabs_common_schedule = \u8C03\u5EA6
+view_tabs_common_schedules = Schedules
+view_tabs_common_subscriptions = \u8FD0\u884C\u673A\u5236
+view_tabs_common_summary = \u6982\u8981
+view_tabs_common_tables = Tables
+view_tabs_common_timeline = \u65F6\u95F4\u8F74
+view_tabs_common_traits = Traits
+view_tabs_invalidSubTab = \u65E0\u6548\u7684\u5B50\u8868: {0}
+view_tabs_invalidTab = \u65E0\u6548\u7684\u8868: {0}
+view_tagCloud_deleteTag = \u5220\u9664\u6807\u7B7E
+view_tagCloud_deleteTagFailure = \u5220\u9664\u6807\u7B7E [{0}] \u5931\u8D25
+view_tagCloud_deleteTagSuccess = \u6210\u529F\u7684\u5220\u9664\u4E86\u6807\u7B7E [{0}]
+view_tagCloud_error_fetchFailure = \u52A0\u8F7D\u6807\u7B7E\u5931\u8D25.
+view_tagCloud_error_tagUsedCount = \u6807\u7B7E\u4F7F\u7528 {0} \u6B21.
+view_tagCloud_title = \u6807\u7B7E\u96C6
+view_taggedResources_title = \u8D44\u6E90
+view_tags_error_1 = \u52A0\u8F7D\u6807\u7B7E\u5931\u8D25
+view_tags_tags = \u6807\u7B7E
+view_tags_tooltip_1 = \u5220\u9664\u6807\u7B7E
+view_tags_tooltip_2 = \u7F16\u8F91\u6807\u7B7E
+view_tags_tooltip_3 = \u8F93\u5165\u6309\u7167\u4EE5\u4E0B\u683C\u5F0F\u7684\u6807\u7B7E: (namespace:)(semantic=)tagname (e.g. it:env=QA, or owner=John)
+view_testTop_description = \u8FD9\u90E8\u5206\u9875\u9762\u7528\u4E8E\u6D4B\u8BD5\u5404\u79CDGUI\u7EC4\u4EF6.
+view_testTop_title = \u6D4B\u8BD5
+view_titleBar_common_addedFav = \u6DFB\u52A0 [{0}]\u5230\u5E38\u7528\u83DC\u5355
+view_titleBar_common_addedFavFailure = \u6DFB\u52A0[{0}]\u5230\u6536\u85CF\u5939\u5931\u8D25
+view_titleBar_common_clickToAddFav = \u6DFB\u52A0\u5230\u6536\u85CF\u5939
+view_titleBar_common_clickToRemoveFav = \u5355\u51FB\u79FB\u51FA\u6536\u85CF\u5939
+view_titleBar_common_loadTagsFailure = \u4E3A[{0}]\u52A0\u8F7D\u6807\u7B7E\u5931\u8D25
+view_titleBar_common_removedFav = \u79FB\u52A8[{0}]\u5230\u5E38\u7528\u83DC\u5355
+view_titleBar_common_removedFavFailure = \u79FB\u52A8[{0}]\u5230\u5E38\u7528\u83DC\u5355\u5931\u8D25
+view_titleBar_common_updateTagsFailure = \u4E3A[{0}]\u66F4\u65B0\u6807\u7B7E\u5931\u8D25
+view_titleBar_common_updateTagsSuccessful = [{0}]\u7684\u6807\u7B7E\u5DF2\u7ECF\u66F4\u65B0
+view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
+view_titleBar_group_summary_collapsedTooltip = \u70B9\u51FB\u67E5\u770B\u6B64\u7EC4\u7684\u66F4\u591A\u4FE1\u606F
+view_titleBar_group_summary_expandedTooltip = \u70B9\u51FB\u9690\u85CF\u6B64\u7EC4\u7684\u66F4\u591A\u4FE1\u606F
+view_tree_common_contextMenu_addChartToDashboard = \u6DFB\u52A0\u56FE\u5230\u7EDF\u8BA1\u8868\u76D8[{0}]
+view_tree_common_contextMenu_editPluginConfiguration = \u7F16\u8F91[{0}]\u63D2\u4EF6\u914D\u7F6E
+view_tree_common_contextMenu_editResourceConfiguration = \u7F16\u8F91[{0}]\u8D44\u6E90\u914D\u7F6E
+view_tree_common_contextMenu_groupGraph = Group Metric Graph
+view_tree_common_contextMenu_loadFail_children = Failed to load platform manual add children
+view_tree_common_contextMenu_loadFail_dashboards = \u52A0\u8F7D\u7528\u6237\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
+view_tree_common_contextMenu_loadFail_group = \u52A0\u8F7Dgroup for context menu\u5931\u8D25
+view_tree_common_contextMenu_loadFailed_dashboard = \u52A0\u8F7D\u7528\u6237\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
+view_tree_common_contextMenu_loadFailed_manualAddChildren = \u52A0\u8F7Dplatform manual add children\u5931\u8D25
+view_tree_common_contextMenu_measurements = Measurements
+view_tree_common_contextMenu_operations = \u64CD\u4F5C
+view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
+view_tree_common_contextMenu_resourceConfiguration = \u8D44\u6E90\u914D\u7F6E
+view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
+view_tree_common_contextMenu_saveChartToDashboardFailure = \u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8\u5931\u8D25
+view_tree_common_contextMenu_saveChartToDashboardSuccessful = \u6210\u529F\u4FDD\u5B58\u7EDF\u8BA1\u8868\u76D8 [{0}]
+view_tree_common_contextMenu_type_name_label = Type: {0}
+view_tree_common_createFailed_autoCluster = Failed to create or update autocluster backing group
+view_tree_common_loadFailed_children = \u52A0\u8F7D\u5B50\u8282\u70B9\u5931\u8D25
+view_tree_common_loadFailed_create = Failed to create view for this node
+view_tree_common_loadFailed_descendants = Failed to load descendants for tree
+view_tree_common_loadFailed_generic = \u52A0\u8F7D\u6811\u5931\u8D25
+view_tree_common_loadFailed_group = \u52A0\u8F7Did\u4E3A[{0}]\u7684\u7EC4\u5931\u8D25
+view_tree_common_loadFailed_groupTree = \u52A0\u8F7D\u7EC4\u6811\u5931\u8D25
+view_tree_common_loadFailed_node = \u52A0\u8F7D\u8FD9\u4E2A\u8282\u70B9\u6570\u636E\u5931\u8D25
+view_tree_common_loadFailed_root = \u52A0\u8F7D\u6811\u6839\u8282\u70B9\u5931\u8D25
+view_tree_common_loadFailed_selection = Failed to select this node
+view_tree_common_loadFailed_update = Failed to update view for this node
+view_tree_group_error_updateAutoCluster = Failed to create or update autocluster backing group. key: [{0}]
+view_type_parentId = \u7236ID
+view_type_resourceTypes = \u8D44\u6E90\u7C7B\u578B
+view_type_typeTreeLoadFailure = \u52A0\u8F7D\u8D44\u6E90\u7C7B\u578B\u6811\u5931\u8D25
+view_upload_alreadyUploaded = \u6587\u4EF6\u5DF2\u7ECF\u4E0A\u4F20
+view_upload_bundleDistFile = \u5206\u7C7B\u6587\u4EF6
+view_upload_error_bundleDistFile = \u4E0A\u4F20\u5206\u7C7B\u6587\u4EF6\u5931\u8D25
+view_upload_error_file = \u4E0A\u4F20\u6587\u4EF6\u51FA\u73B0\u9519\u8BEF
+view_upload_error_fileName = \u4E0A\u4F20\u6587\u4EF6 [{0}]\u51FA\u73B0\u9519\u8BEF
+view_upload_error_fileName_2 = \u4E0A\u4F20\u6587\u4EF6 [{0}]\u51FA\u73B0\u9519\u8BEF, \u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84.
+view_upload_error_packageVersionFile = \u4E0A\u4F20\u5305\u7248\u672C\u6587\u4EF6\u51FA\u73B0\u9519\u8BEF
+view_upload_error_results = \u4E0A\u4F20\u6587\u4EF6\u5931\u8D25, \u65E0\u6CD5\u9884\u6599\u7684\u7ED3\u679C: [{0}]
+view_upload_inProgress = \u65E0\u6CD5\u63D0\u4EA4, \u6587\u4EF6\u4E0A\u4F20\u6B63\u5728\u8FDB\u884C
+view_upload_prompt_1 = \u8BF7\u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\u4E0A\u4F20[{0}]
+view_upload_prompt_2 = \u8981\u4E0A\u4F20\u7684\u6587\u4EF6
+view_upload_success = \u6587\u4EF6\u4E0A\u4F20\u6210\u529F
+view_upload_tooltip_1a = \u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\u4E0A\u4F20,\u7136\u540E\u70B9\u51FBUpload\u6216\u8005Next
+view_upload_tooltip_1b = \u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\u4E0A\u4F20, \u7136\u540E\u70B9\u51FB Next
+view_upload_tooltip_2 = \u6587\u4EF6\u4E0A\u4F20 \u524D\u53D1\u751F\u9519\u8BEF
+view_upload_upload = \u4E0A\u4F20
+view_upload_uploadFile = \u4E0A\u4F20\u6587\u4EF6
+widget_colorPicker_tooltip = \u9009\u62E9\u989C\u8272
+widget_durationItem_inputUnitLessThanTargetUnit = \u8F93\u5165\u5355\u4F4D\u662F\u5C0F\u4E8E\u76EE\u6807\u5355\u4F4D.
+widget_durationItem_unitTypeNotSupported = \u5355\u4F4D\u7C7B\u578B[{0}]\u4E0D\u88ABDurationItem\u652F\u6301.
+widget_jobTriggerEditor_fieldHelp_repeatDuration = keep running this operation this many times or until this amount of time has elapsed
+widget_jobTriggerEditor_fieldHelp_repeatInterval = \u591A\u4E45\u6267\u884C\u64CD\u4F5C
+widget_jobTriggerEditor_fieldHelp_startDelay = \u6267\u884C\u64CD\u4F5C\u5EF6\u65F6
+widget_jobTriggerEditor_field_cronExpression = Cron\u8868\u8FBE\u5F0F
+widget_jobTriggerEditor_field_mode = Schedule using
+widget_jobTriggerEditor_field_repeatInterval_later = \u91CD\u590D\u6BCF
+widget_jobTriggerEditor_field_repeatInterval_now = Run now and every
+widget_jobTriggerEditor_field_startType = Run
+widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = \u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65F6\u95F4.
+widget_jobTriggerEditor_message_endTimeMustBeInFuture = \u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u662F\u672A\u6765\u65F6\u95F4.
+widget_jobTriggerEditor_message_startTimeMustBeInFuture = \u5F00\u59CB\u65F6\u95F4\u5FC5\u987B\u662F\u672A\u6765\u65F6\u95F4.
+widget_jobTriggerEditor_tab_examples = \u4F8B\u5B50
+widget_jobTriggerEditor_tab_format = \u683C\u5F0F
+widget_jobTriggerEditor_value_calendar = \u65E5\u5386
+widget_jobTriggerEditor_value_cronExpression = Cron\u8868\u8FBE\u5F0F
+widget_jobTriggerEditor_value_for = For
+widget_jobTriggerEditor_value_in = in
+widget_jobTriggerEditor_value_indefinitely = Indefinitely
+widget_jobTriggerEditor_value_later = Later
+widget_jobTriggerEditor_value_laterAndRepeat = Later & Repeat
+widget_jobTriggerEditor_value_now = Now
+widget_jobTriggerEditor_value_nowAndRepeat = Now & Repeat
+widget_jobTriggerEditor_value_on = on
+widget_jobTriggerEditor_value_until = \u76F4\u5230
+widget_recordEditor_error_invalidViewPath = \u67E5\u770B\u8DEF\u5F84\u65E0\u6548: [{0}]
+widget_recordEditor_error_multipleRecords = \u591A\u6761\u8BB0\u5F55\u8FD4\u56DE- \u9884\u671F\u53EA\u6709\u4E00\u4E2A.
+widget_recordEditor_error_noRecords = \u65E0\u8BB0\u5F55\u8FD4\u56DE - \u9884\u671F\u6709\u4E00\u6761.
+widget_recordEditor_error_operation = \u64CD\u4F5C\u5931\u8D25.\u6709\u9519\u8BEF\u53D1\u751F
+widget_recordEditor_error_operationInvalidValues = \u64CD\u4F5C\u5931\u8D25-\u4E00\u4E2A\u6216\u591A\u4E2A\u5B57\u6BB5\u7684\u503C\u65E0\u6548
+widget_recordEditor_error_permissionCreate = \u4F60\u6CA1\u6709\u521B\u5EFA\u65B0[{0}]\u7684\u6743\u9650
+widget_recordEditor_error_unsupportedOperationType = \u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7C7B\u578B: [{0}]
+widget_recordEditor_info_recordCreatedConcise = {0} created.
+widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created.
+widget_recordEditor_info_recordUpdatedConcise = {0} updated.
+widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
+widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
+widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
+widget_recordEditor_label_loading = \u52A0\u8F7D\u4E2D...
+widget_recordEditor_title_edit = \u7F16\u8F91{0} [{1}]
+widget_recordEditor_title_new = \u65B0\u5EFA{0}
+widget_recordEditor_title_view = \u67E5\u770B{0} [{1}]
+widget_recordEditor_warn_validation = \u4E00\u4E2A\u6216\u591A\u4E2A\u5B57\u6BB5\u7684\u503C\u65E0\u6548. \u53EA\u6709\u5B57\u6BB5\u6709\u6548\u65F6\uFF0C[{0}]\u624D\u80FD\u4FDD\u5B58
+widget_resourceFactoryWizard_archPrompt = \u5305\u67B6\u6784
+widget_resourceFactoryWizard_configTemplatePrompt = \u8D44\u6E90\u914D\u7F6E\u6A21\u677F
+widget_resourceFactoryWizard_contentTemplatePrompt = \u53D1\u5E03\u65F6\u95F4\u914D\u7F6E\u6A21\u677F
+widget_resourceFactoryWizard_createSubmit = \u521B\u5EFA\u8D44\u6E90[{0}]\u6210\u529F.
+widget_resourceFactoryWizard_createSubmitType = \u521B\u5EFA\u7C7B\u578B[{0}]\u7684\u8D44\u6E90\u8BF7\u6C42\u63D0\u4EA4\u6210\u529F.
+widget_resourceFactoryWizard_createWizardTitle = \u521B\u5EFA\u7C7B\u578B[{0}]\u7684\u65B0\u8D44\u6E90
+widget_resourceFactoryWizard_createWizardWindowTitle = \u8D44\u6E90\u521B\u5EFA\u5411\u5BFC
+##widget_resourceFactoryWizard_editConfigStepName = Deployment Options
+widget_resourceFactoryWizard_execute1 = \u521B\u5EFA\u8D44\u6E90\u5931\u8D25 - \u6CA1\u6709\u5305\u7248\u672C
+widget_resourceFactoryWizard_execute2 = \u521B\u5EFA\u8D44\u6E90\u5931\u8D25
+widget_resourceFactoryWizard_failedToDeleteVersion = \u53D6\u6D88\u521B\u5EFA\u8D44\u6E90\u65F6\u65E0\u6CD5\u5220\u9664\u5305\u7684\u7248\u672C
+widget_resourceFactoryWizard_failedToGetType = Failed to get backing package type for new resource
+widget_resourceFactoryWizard_importFailure = \u624B\u5DE5\u5BFC\u5165\u8D44\u6E90\u5931\u8D25
+widget_resourceFactoryWizard_importSubmitted = \u5BFC\u5165\u7C7B\u578B[{0}]\u7684\u65B0\u8D44\u6E90\u8BF7\u6C42\u5DF2\u88AB\u63D0\u4EA4
+widget_resourceFactoryWizard_importWizardTitle = \u5BFC\u5165\u7C7B\u578B[{0}]\u7684\u8D44\u6E90
+widget_resourceFactoryWizard_importWizardWindowTitle = \u5BFC\u5165\u8D44\u6E90\u5411\u5BFC
+widget_resourceFactoryWizard_infoStepName = \u8D44\u6E90\u6D88\u606F
+widget_resourceFactoryWizard_infoStep_loadFail = \u65E0\u6CD5\u53D6\u5F97\u67B6\u6784
+widget_resourceFactoryWizard_namePrompt = \u65B0\u8D44\u6E90\u540D
+widget_resourceFactoryWizard_templatePrompt = \u8FDE\u63A5\u8BBE\u7F6E\u6A21\u677F
+##widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the RHQ Agent). Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure.
+widget_resourceFactoryWizard_uploadFailure = \u4E0A\u4F20\u6587\u4EF6\u5931\u8D25
+widget_resourceFactoryWizard_uploadFileStepName = \u4E0A\u4F20\u8D44\u6E90Content\u6587\u4EF6
+widget_resourceFactoryWizard_uploadInProgress = \u6B63\u5728\u4E0A\u4F20\u4E2D... \u5927\u7684\u53D1\u5E03\u6587\u4EF6\u9700\u8981\u6D88\u8017\u6570\u5206\u949F\u5B8C\u6210.
+widget_resourceFactoryWizard_versionPrompt = \u5305\u7248\u672C
+widget_resourceSelector_groupCategory = \u7EC4\u7C7B\u522B
+widget_resourceSelector_pleaseSelectMultipleResource = \u8BF7\u9009\u62E9\u4E00\u4E2A\u6216\u591A\u4E2A\u8D44\u6E90
+widget_resourceSelector_pleaseSelectResource = \u8BF7\u9009\u62E9\u8D44\u6E90
+widget_resourceSelector_selectMultipleResources = \u9009\u62E9\u8D44\u6E90
+widget_resourceSelector_selectResource = \u9009\u62E9\u8D44\u6E90
+widget_typeCache_loadFail = \u65E0\u6CD5\u52A0\u8F7D\u8D44\u6E90\u7C7B\u578B\u7684\u5143\u6570\u636E
+widget_typeTree_badTemplateType = \u65E0\u6548\u7684URL. \u672A\u77E5\u6A21\u677F\u7C7B\u578B[{0}]
+widget_typeTree_badTypeId = \u65E0\u6548URL. \u9519\u8BEF\u8D44\u6E90\u7C7B\u578BID [{0}]
+widget_typeTree_loadFail = \u52A0\u8F7D\u8D44\u6E90\u7C7B\u578B\u5931\u8D25
commit 1a35c4bfd48fb7bd1c60831af44a08e74d5009ce
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jun 7 11:18:20 2011 -0400
a recent commit disabled the compilation of webservice module's test classes. tell eclipse to ignore all webservice test classes now.
diff --git a/.classpath b/.classpath
index 2ca408f..566c57d 100644
--- a/.classpath
+++ b/.classpath
@@ -163,7 +163,6 @@
<classpathentry kind="src" path="modules/enterprise/server/client-api/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/remoting/client-api/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/remoting/webservices/src/main/java"/>
- <classpathentry kind="src" path="modules/enterprise/remoting/webservices/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/remoting/cli/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/remoting/cli/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/server/sars/agent-sar/src/main/java"/>
commit 0c4b48b4531511ecd73309ed966b823164d0252b
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Mon Jun 6 16:23:40 2011 -0500
Added more items to git ignore to prevent massive list of changes after building GUI projects.
diff --git a/.gitignore b/.gitignore
index b10fd3d..92d8d5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,6 @@ dev-container
dev-agent
antlr-generated/
*.tokens
+modules/enterprise/gui/portal-war/build/classes/*
+modules/enterprise/gui/coregui/build/classes/*
+modules/enterprise/gui/content_http-war/build/classes/*
commit 7ec84d637cb242713cfdefebbaa0100b92357057
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Jun 7 21:01:52 2011 +0200
Runtime name is optional for now.
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 81b702f..7851d73 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -239,7 +239,7 @@
<content name="file" category="deployable" isCreationType="true" description="Deployments on this domain">
<configuration>
<c:group name="deployment" displayName="Deployment Options">
- <c:simple-property name="runtimeName" required="true"/>
+ <c:simple-property name="runtimeName" required="false"/>
</c:group>
</configuration>
</content>
commit 37f293f248ebd6a3e9c09ea7b7658902444826a0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Jun 7 13:37:28 2011 +0200
BZ 708327 Deploy a domain deployment to a server group.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 779e733..a51a96a 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.domain.measurement.AvailabilityType;
@@ -361,11 +362,13 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
else {
+/*
List<PROPERTY_VALUE> address = step1.getAddress();
Operation step3 = new Operation("deploy",address);
cop.addStep(step3);
+*/
- resourceKey = addressToPath(address);
+ resourceKey = addressToPath(step1.getAddress());
}
JsonNode result = connection.executeRaw(cop);
@@ -465,6 +468,20 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
operation = new Operation(op,address,props);
} else if (what.equals("domain")) {
operation = new Operation(op,Collections.<PROPERTY_VALUE>emptyList());
+ } else if (what.equals("domain-deployment")) {
+ if (op.equals("promote")) {
+ String serverGroup = parameters.getSimpleValue("server-group","-not set-");
+ PropertySimple simple = parameters.getSimple("enabled");
+ Boolean enabled = false;
+ if (simple!=null && simple.getBooleanValue()!=null)
+ enabled= simple.getBooleanValue();
+ address.add(new PROPERTY_VALUE("server-group",serverGroup));
+ String resourceKey = context.getResourceKey();
+ resourceKey = resourceKey.substring(resourceKey.indexOf("=")+1);
+ address.add(new PROPERTY_VALUE("deployment", resourceKey));
+ operation = new Operation("add",address,"enabled",enabled);
+
+ }
}
OperationResult operationResult = new OperationResult();
@@ -479,7 +496,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
}
else {
- operationResult.setErrorMessage("No valid operation was given");
+ operationResult.setErrorMessage("No valid operation was given for input [" + name + "]");
}
// TODO throw an exception if the operation failed?
return operationResult;
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 6aa6dd5..81b702f 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -226,6 +226,16 @@
<c:simple-property name="path" default="deployment" readOnly="true"/>
</plugin-configuration>
+ <operation name="domain-deployment:promote" displayName="Deploy to Server-Group" description="Deploy this deployment to a server group">
+ <parameters>
+ <c:simple-property name="server-group" required="true" description="Server group to deploy to" type="string"/>
+ <c:simple-property name="enabled" required="true" default="true" description="Should the deployment be enabled on the server group?" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="result" description="Outcome of the delete server operation"/>
+ </results>
+ </operation>
+
<content name="file" category="deployable" isCreationType="true" description="Deployments on this domain">
<configuration>
<c:group name="deployment" displayName="Deployment Options">
commit 0d7b698a5ecf597aef64044513069916f3792c3c
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Jun 7 13:33:50 2011 +0200
Improve the help message
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/standaloneContainer/Command.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/standaloneContainer/Command.java
index aa91e22..c992000 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/standaloneContainer/Command.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/standaloneContainer/Command.java
@@ -36,7 +36,7 @@ public enum Command {
FIND("find", "r | t | rt <name>", 2,
"Searches a (r)esource, resource (t)ype or resources of (rt)ype. Use * as wildcard.\n"
+ " Will set $r for the last resource shown."), HELP("h", "", 0, "Shows this help"), //
- INVOKE("i", "operation [params]", 1, "Triggers running an operation. If operation is '-list' it shows available operations"), //
+ INVOKE("i", "operation [params]", 1, "Triggers running an operation. If operation is '-list' it shows available operations.\n Parameters are given as key=value; key-value-pairs are separated by ||"), //
MEASURE("m", "datatype property+", 1, "Triggers getting metric values. All need to be of the same data type. If datatype is '-list' it shows the defined metrics"), //
NATIVE("n", "e | d | s", 1, "Enables/disables native system or shows native status"), //
QUIT("quit", "", 0, "Terminates the application"), //
commit c307a316af845e110627703f7952a4fd048ea41c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 6 21:30:22 2011 -0400
BZ 644328 - add unit tests to show resource type bundle config upgrades work
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
index 0d70634..246ca59 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
@@ -19,22 +19,23 @@
package org.rhq.enterprise.server.resource.metadata.test;
import java.util.Set;
-import java.util.UUID;
import javax.persistence.EntityManager;
import javax.transaction.Status;
-import org.jetbrains.annotations.NotNull;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.resource.InventoryStatus;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.enterprise.server.util.LookupUtil;
import org.testng.annotations.Test;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory.Context;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.measurement.DisplayType;
import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.server.util.LookupUtil;
/**
* Note, plugins are registered in new transactions. For tests, this means
@@ -48,6 +49,86 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
}
/**
+ * Tests updating bundle-target config
+ */
+ @Test
+ public void testResourceTypeBundleTarget() throws Exception {
+ try {
+ // register the plugin - it has a platform with child server that is a bundle target
+ registerPlugin("updateResourceTypeBundleTarget-v1.xml");
+ ResourceType platform1 = getResourceType("myPlatform1");
+ getTransactionManager().begin();
+ EntityManager em = getEntityManager();
+ platform1 = em.find(ResourceType.class, platform1.getId());
+
+ assert platform1.getResourceTypeBundleConfiguration() == null : "platform should not be a bundle target";
+ Set<ResourceType> servers1 = platform1.getChildResourceTypes();
+
+ assert servers1.size() == 1 : "must only have one child server under the test platform";
+ ResourceType server1 = servers1.iterator().next();
+ ResourceTypeBundleConfiguration bundleConfig1 = server1.getResourceTypeBundleConfiguration();
+ assert bundleConfig1 != null : "server should have been a bundle target";
+
+ Set<BundleDestinationBaseDirectory> baseDirs1 = bundleConfig1.getBundleDestinationBaseDirectory();
+ assert baseDirs1.size() == 2 : "should have been 2 bundle dest base dirs: " + baseDirs1;
+
+ for (BundleDestinationBaseDirectory baseDir : baseDirs1) {
+ if (baseDir.getName().equals("firstDestBaseDir")) {
+ assert baseDir.getValueContext() == Context.pluginConfiguration : "bad context: " + baseDir;
+ assert baseDir.getValueName().equals("prop1") : "bad value" + baseDir;
+ } else if (baseDir.getName().equals("secondDestBaseDir")) {
+ assert baseDir.getValueContext() == Context.fileSystem : "bad context: " + baseDir;
+ assert baseDir.getValueName().equals("/") : "bad value" + baseDir;
+ } else {
+ assert false : "wrong dest base dir was retrieved: " + baseDir;
+ }
+ }
+
+ getTransactionManager().rollback();
+
+ // now upgrade the plugin - the bundle config will have changed in the server
+ registerPlugin("updateResourceTypeBundleTarget-v2.xml");
+ ResourceType platform2 = getResourceType("myPlatform1");
+ getTransactionManager().begin();
+ em = getEntityManager();
+ platform2 = em.find(ResourceType.class, platform2.getId());
+
+ assert platform1.getResourceTypeBundleConfiguration() == null : "platform should not be a bundle target";
+ Set<ResourceType> servers2 = platform2.getChildResourceTypes();
+
+ assert servers2.size() == 1 : "Expected to find 1 server";
+ ResourceType server2 = servers2.iterator().next();
+ ResourceTypeBundleConfiguration bundleConfig2 = server2.getResourceTypeBundleConfiguration();
+ assert bundleConfig2 != null : "server should have been a bundle target";
+
+ Set<BundleDestinationBaseDirectory> baseDirs2 = bundleConfig2.getBundleDestinationBaseDirectory();
+ assert baseDirs2.size() == 1 : "should have been 1 bundle dest base dir: " + baseDirs2;
+
+ BundleDestinationBaseDirectory baseDir = baseDirs2.iterator().next();
+ assert baseDir.getName().equals("thirdDestBaseDir");
+ assert baseDir.getValueContext() == Context.resourceConfiguration : "bad context: " + baseDir;
+ assert baseDir.getValueName().equals("resourceProp1") : "bad value" + baseDir;
+
+ // make sure the old bundle config was deleted when we upgraded and overwrite it with the new config
+ assert null == em.find(Configuration.class, bundleConfig1.getBundleConfiguration().getId()) : "The configuration "
+ + bundleConfig1 + " should have been deleted";
+
+ getTransactionManager().rollback();
+
+ } finally {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().rollback();
+ }
+ try {
+ cleanupTest();
+ } catch (Exception e) {
+ System.out.println("CANNOT CLEAN UP TEST: " + this.getClass().getSimpleName()
+ + ".testResourceTypeBundleTarget");
+ }
+ }
+ }
+
+ /**
* See if deletion of a resource type just works
*
* @throws Exception on error
@@ -146,7 +227,7 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
resourceManager.createResource(overlord, platformResource, -1);
getTransactionManager().begin();
- EntityManager em = getEntityManager();
+ EntityManager em = getEntityManager();
platform1 = em.find(ResourceType.class, platform1.getId());
assert platform1 != null : "I did not find myPlatform";
@@ -199,7 +280,8 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
assert platform2ChildResources.size() == 2 : "Expected 2 direct child services of platform in v2";
boolean foundMovedResource = false;
for (Resource childResource : platform2ChildResources) {
- assert childResource.getChildResources().isEmpty() : "Expected child Resource " + childResource + " to have no children";
+ assert childResource.getChildResources().isEmpty() : "Expected child Resource " + childResource
+ + " to have no children";
if (childResource.getResourceKey().equals("foo-nestedOne")) {
foundMovedResource = true;
}
@@ -214,7 +296,7 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
Set<MeasurementDefinition> defs3 = type.getMetricDefinitions();
MeasurementDefinition three = defs3.iterator().next();
assert three.getDisplayName().equals("Three") : "Expected the nestedOne to have a metric withDisplayName Three in v2, but it was "
- + three.getDisplayName();
+ + three.getDisplayName();
assert three.getDisplayType() == DisplayType.SUMMARY : "Expected three to be SUMMARY in v2";
/*
@@ -223,12 +305,12 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
* latter is a different story. We probably should cascade that anyway.
*/
assert three.getId() == definitionId : "Expected the id of 'Three' to be " + definitionId
- + ", but it was " + three.getId() + " in v2";
+ + ", but it was " + three.getId() + " in v2";
} else if (typeName.equals("service1")) {
// check that the nested service is gone
Set<ResourceType> childrenOfService = type.getChildResourceTypes();
assert childrenOfService.size() == 0 : "No children of 'service1' expected in v2, but found: "
- + childrenOfService.size();
+ + childrenOfService.size();
} else {
assert true == false : "We found an unknown type with name " + typeName;
}
diff --git a/modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v1.xml b/modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v1.xml
new file mode 100644
index 0000000..aa29ffd
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v1.xml
@@ -0,0 +1,27 @@
+<plugin name="ResourceMetaDataManagerBeanTest" displayName="Mock" package="org.rhq.plugins.mock.jboss"
+ version="1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <platform name="myPlatform1">
+ <server name="myTestServer1">
+ <plugin-configuration>
+ <c:simple-property name="prop1" />
+ </plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="resourceProp1" />
+ </resource-configuration>
+ <bundle-target>
+ <destination-base-dir name="firstDestBaseDir">
+ <value-context>pluginConfiguration</value-context>
+ <value-name>prop1</value-name>
+ </destination-base-dir>
+ <destination-base-dir name="secondDestBaseDir">
+ <value-context>fileSystem</value-context>
+ <value-name>/</value-name>
+ </destination-base-dir>
+ </bundle-target>
+ </server>
+ </platform>
+</plugin>
diff --git a/modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v2.xml b/modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v2.xml
new file mode 100644
index 0000000..c4f11ad
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/test/metadata/resource-type/updateResourceTypeBundleTarget-v2.xml
@@ -0,0 +1,23 @@
+<plugin name="ResourceMetaDataManagerBeanTest" displayName="Mock" package="org.rhq.plugins.mock.jboss"
+ version="1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <platform name="myPlatform1">
+ <server name="myTestServer1">
+ <plugin-configuration>
+ <c:simple-property name="prop1" />
+ </plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="resourceProp1" />
+ </resource-configuration>
+ <bundle-target>
+ <destination-base-dir name="thirdDestBaseDir">
+ <value-context>resourceConfiguration</value-context>
+ <value-name>resourceProp1</value-name>
+ </destination-base-dir>
+ </bundle-target>
+ </server>
+ </platform>
+</plugin>
commit d888bfe2a211a21a4eeeb2730fa5821044fcfb58
Merge: e89ac0c 718ebd7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 6 17:20:36 2011 -0400
Merge commit 'origin/master' into nonplatform-bundles2
commit e89ac0c42707a22f1ae1a171936ac7077d29082c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 6 17:20:23 2011 -0400
BZ 644328 - add bundle configuration to agent plugin descriptor, and server-side processing to persist it
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
index 686b16b..c75111b 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
@@ -34,6 +34,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.descriptor.plugin.Bundle;
+import org.rhq.core.clientapi.descriptor.plugin.BundleTargetDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.ContentDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.EventDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.MetricDescriptor;
@@ -49,7 +50,10 @@ import org.rhq.core.clientapi.descriptor.plugin.RunsInsideType;
import org.rhq.core.clientapi.descriptor.plugin.ServerDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.ServiceDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.SubCategoryDescriptor;
+import org.rhq.core.clientapi.descriptor.plugin.BundleTargetDescriptor.DestinationBaseDir;
import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.event.EventDefinition;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.resource.ClassLoaderType;
@@ -442,6 +446,7 @@ public class PluginMetadataParser {
// 8) Artifacts
// 9) Child subcategories
// 10) Bundle Type
+ // 11) Bundle Configuration (for types that are targets for bundle deployments)
String classLoaderTypeString = resourceDescriptor.getClassLoader();
if (classLoaderTypeString == null) {
@@ -527,6 +532,22 @@ public class PluginMetadataParser {
resourceType.setBundleType(new BundleType(typeName, resourceType));
}
+ BundleTargetDescriptor bundleTarget = resourceDescriptor.getBundleTarget();
+ if (bundleTarget != null) {
+ List<DestinationBaseDir> destBaseDirs = bundleTarget.getDestinationBaseDir();
+ if (destBaseDirs != null && destBaseDirs.size() > 0) {
+ Configuration c = new Configuration();
+ ResourceTypeBundleConfiguration bundleConfiguration = new ResourceTypeBundleConfiguration(c);
+ for (DestinationBaseDir destBaseDir : destBaseDirs) {
+ String name = destBaseDir.getName();
+ String valueContext = destBaseDir.getValueContext();
+ String valueName = destBaseDir.getValueName();
+ bundleConfiguration.addBundleDestinationBaseDirectory(name, valueContext, valueName);
+ }
+ resourceType.setResourceTypeBundleConfiguration(bundleConfiguration);
+ }
+ }
+
} catch (InvalidPluginDescriptorException e) {
// TODO: Should we be storing these for viewing in server? Breaking deployment? What?
throw e;
diff --git a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java
index 2df1e43..488d673 100644
--- a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java
+++ b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/MetadataManagerTest.java
@@ -36,6 +36,9 @@ import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.metadata.PluginMetadataManager;
import org.rhq.core.clientapi.descriptor.DescriptorPackages;
import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory.Context;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
@@ -213,7 +216,8 @@ public class MetadataManagerTest {
assert bravo.getEnumeratedValues().size() == 4;
assert bravo.getEnumeratedValues().get(0).getName().equals("First Option Name");
assert bravo.getEnumeratedValues().get(0).getValue().equals("FirstOptionValue");
- assert bravo.getEnumeratedValues().get(0).getValue().equals(def.getDefaultTemplate().getConfiguration().getSimpleValue("bravo", null));
+ assert bravo.getEnumeratedValues().get(0).getValue().equals(
+ def.getDefaultTemplate().getConfiguration().getSimpleValue("bravo", null));
assert def.getPropertyDefinitionSimple("charlie").getType() == PropertySimpleType.BOOLEAN;
assert def.getPropertyDefinitionSimple("delta").getType() == PropertySimpleType.INTEGER;
@@ -253,6 +257,25 @@ public class MetadataManagerTest {
assert t.getConfiguration().getSimple("delta").getIntegerValue() == 42;
assert serverType.getBundleType() == null : "bundle should not be defined for type: " + serverType;
+
+ // ensure the bundle target metadata is correct
+ ResourceTypeBundleConfiguration bundleTargetConfig = serverType.getResourceTypeBundleConfiguration();
+ assert bundleTargetConfig != null;
+ Set<ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory> set = bundleTargetConfig
+ .getBundleDestinationBaseDirectory();
+ assert set.size() == 2;
+ for (BundleDestinationBaseDirectory bdbd : set) {
+ if (bdbd.getName().equals("basedir1")) {
+ assert bdbd.getValueContext() == Context.pluginConfiguration : bdbd;
+ assert bdbd.getValueName().equals("alpha") : bdbd;
+ } else if (bdbd.getName().equals("basedir2")) {
+ assert bdbd.getValueContext() == Context.resourceConfiguration : bdbd;
+ assert bdbd.getValueName().equals("resourceAlpha") : bdbd;
+ } else {
+ assert false : "Bad bundle target name: " + bdbd;
+ }
+ }
+
}
private void outputType(ResourceType type, int depth) {
diff --git a/modules/core/client-api/src/test/resources/metadata-manager-test-1.xml b/modules/core/client-api/src/test/resources/metadata-manager-test-1.xml
index bcdf81d..fbb1afd 100644
--- a/modules/core/client-api/src/test/resources/metadata-manager-test-1.xml
+++ b/modules/core/client-api/src/test/resources/metadata-manager-test-1.xml
@@ -77,6 +77,16 @@
</c:group>
</resource-configuration>
+ <bundle-target>
+ <destination-base-dir name="basedir1">
+ <value-context>pluginConfiguration</value-context>
+ <value-name>alpha</value-name>
+ </destination-base-dir>
+ <destination-base-dir name="basedir2">
+ <value-context>resourceConfiguration</value-context>
+ <value-name>resourceAlpha</value-name>
+ </destination-base-dir>
+ </bundle-target>
<service name="Service B" description="Service B Description" class="ServiceBClass" discovery="ServiceBDiscoveryClass">
<metric property="foo" displayName="Foo"/>
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/inventory-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/inventory-schema.xml
index 7b85143..81882af 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/inventory-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/inventory-schema.xml
@@ -25,6 +25,7 @@
-->
<column name="PLUGIN_CONFIG_DEF_ID" type="INTEGER" references="RHQ_CONFIG_DEF(ID)"/>
<column name="RES_CONFIG_DEF_ID" type="INTEGER" references="RHQ_CONFIG_DEF(ID)"/>
+ <column name="BUNDLE_CONFIG_ID" type="INTEGER" references="RHQ_CONFIG"/>
<index name="RHQ_RES_TYPE_IDX_PLG_NAME" unique="true">
<field ref="NAME"/>
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..c7aa1a6 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3389,6 +3389,19 @@
<schemaSpec version="2.107">
<schema-createSequence name="RHQ_OPERATION_SCHEDULE_ID_SEQ" initial="10001"/>
</schemaSpec>
+
+ <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>
+
</dbupgrade>
</target>
</project>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
new file mode 100644
index 0000000..dba31e7
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/ResourceTypeBundleConfiguration.java
@@ -0,0 +1,261 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.bundle;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+
+/**
+ * If a resource type can be a target for bundle deployment, it will define some metadata values inside this configuration object.
+ * We store these in a Configuration to support extensibility in the future. Stored in this configuration object will be things like
+ * the bundle destination base directory definitions (the base locations where bundles can be deployed for resources that
+ * are of the given type). Rather than expect users of this object to know the internal properties stored in the config, this
+ * object has strongly-typed methods to extract the properties into more easily consumable POJOs, such as
+ * {@link #getBundleDestinationBaseDirectory()} and {@link #addBundleDestinationBaseDirectory(String, String)}.
+ *
+ * @author John Mazzitelli
+ */
+public class ResourceTypeBundleConfiguration implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private static final String BUNDLE_DEST_BASE_DIR_LIST_NAME = "bundleDestBaseDirsList";
+ private static final String BUNDLE_DEST_BASE_DIR_LIST_ITEM_NAME = "bundleDestBaseDirsListItem";
+ private static final String BUNDLE_DEST_BASE_DIR_NAME_NAME = "name";
+ private static final String BUNDLE_DEST_BASE_DIR_VALUE_CONTEXT_NAME = "valueContext";
+ private static final String BUNDLE_DEST_BASE_DIR_VALUE_NAME_NAME = "valueName";
+
+ // this is the actual bundle configuration - see ResourceType.bundleConfiguration
+ private Configuration bundleConfiguration;
+
+ public ResourceTypeBundleConfiguration() {
+ this.bundleConfiguration = null;
+ }
+
+ public ResourceTypeBundleConfiguration(Configuration bundleConfiguration) {
+ this.bundleConfiguration = bundleConfiguration;
+ }
+
+ /**
+ * Returns the actual, raw configuration. Callers should rarely want to use this - use the more
+ * strongly typed methods such as {@link #getBundleDestinationBaseDirectory()}.
+ *
+ * @return the raw bundle configuration object
+ */
+ public Configuration getBundleConfiguration() {
+ return this.bundleConfiguration;
+ }
+
+ public void setBundleConfiguration(Configuration bundleConfiguration) {
+ this.bundleConfiguration = bundleConfiguration;
+ }
+
+ /**
+ * Returns the different destination base directories that can be the target for a bundle deployment.
+ * If this bundle configuration doesn't have any base directories, null is returned (though this
+ * should never happen if the bundle configuration has been fully prepared for a resource type).
+ *
+ * @return the set of destination base directories that can be targets for bundle deployments
+ */
+ public Set<BundleDestinationBaseDirectory> getBundleDestinationBaseDirectory() {
+ if (this.bundleConfiguration == null) {
+ return null;
+ }
+
+ PropertyList propertyList = this.bundleConfiguration.getList(BUNDLE_DEST_BASE_DIR_LIST_NAME);
+ if (propertyList == null) {
+ return null;
+ }
+
+ List<Property> list = propertyList.getList();
+ if (list.size() == 0) {
+ return null;
+ }
+
+ Set<BundleDestinationBaseDirectory> retVal = new HashSet<BundleDestinationBaseDirectory>(list.size());
+ for (Property listItem : list) {
+ PropertyMap map = (PropertyMap) listItem;
+ String name = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_NAME_NAME, null);
+ String valueContext = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_VALUE_CONTEXT_NAME, null);
+ String valueName = map.getSimpleValue(BUNDLE_DEST_BASE_DIR_VALUE_NAME_NAME, null);
+ BundleDestinationBaseDirectory bdbd = new BundleDestinationBaseDirectory(name, valueContext, valueName);
+ retVal.add(bdbd);
+ }
+
+ return retVal;
+ }
+
+ /**
+ * Adds a destination base directory that can be used as a target for a bundle deployment.
+ *
+ * @param name the name of this bundle destination base directory (must not be <code>null</code>)
+ * @param valueContext indicates where the value's name can be looked up and found. This
+ * must be the string form of one of the enums found
+ * in {@link BundleDestinationBaseDirectory.Context}
+ * @param valueName the name of the property found in the given context where the value
+ * of the base directory is
+ */
+ public void addBundleDestinationBaseDirectory(String name, String valueContext, String valueName) {
+ if (this.bundleConfiguration == null) {
+ throw new NullPointerException("bundleConfiguration == null");
+ }
+
+ // we create this just to make sure the context and value are valid. An exception will be thrown if they are not.
+ BundleDestinationBaseDirectory destBaseDir = new BundleDestinationBaseDirectory(name, valueContext, valueName);
+
+ PropertyList propertyList = this.bundleConfiguration.getList(BUNDLE_DEST_BASE_DIR_LIST_NAME);
+ if (propertyList == null) {
+ propertyList = new PropertyList(BUNDLE_DEST_BASE_DIR_LIST_NAME);
+ this.bundleConfiguration.put(propertyList);
+ }
+
+ PropertySimple nameProp = new PropertySimple(BUNDLE_DEST_BASE_DIR_NAME_NAME, destBaseDir.getName());
+ PropertySimple valueContextProp = new PropertySimple(BUNDLE_DEST_BASE_DIR_VALUE_CONTEXT_NAME, destBaseDir
+ .getValueContext().name());
+ PropertySimple valueNameProp = new PropertySimple(BUNDLE_DEST_BASE_DIR_VALUE_NAME_NAME, destBaseDir
+ .getValueName());
+ PropertyMap map = new PropertyMap(BUNDLE_DEST_BASE_DIR_LIST_ITEM_NAME);
+ map.put(nameProp);
+ map.put(valueContextProp);
+ map.put(valueNameProp);
+ propertyList.add(map);
+ return;
+ }
+
+ @Override
+ public int hashCode() {
+ return ((bundleConfiguration == null) ? 0 : bundleConfiguration.hashCode());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ResourceTypeBundleConfiguration)) {
+ return false;
+ }
+ ResourceTypeBundleConfiguration other = (ResourceTypeBundleConfiguration) obj;
+ if (this.bundleConfiguration == null) {
+ if (other.bundleConfiguration != null) {
+ return false;
+ }
+ } else if (!this.bundleConfiguration.equals(other.bundleConfiguration)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Defines where bundles can be deployed on a resource that is of our resource type.
+ */
+ public static class BundleDestinationBaseDirectory implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Defines the different places where we can lookup the named value that contains
+ * the actual location of the destination base directory.
+ * The names of these enum constants match the valid values that the agent
+ * plugin XML schema accepts, to allow for easy translation from the XML
+ * to this Java representation.
+ */
+ public enum Context {
+ /** the value is to be found in the resource's plugin configuration */
+ pluginConfiguration,
+
+ /** the value is to be found in the resource's resource configuration */
+ resourceConfiguration,
+
+ /** the value is to be found as a measurement trait */
+ measurementTrait,
+
+ /** the value is a hardcoded location on the file system - usually the root "/" directory */
+ fileSystem
+ };
+
+ private final String name;
+ private final Context valueContext;
+ private final String valueName;
+
+ public BundleDestinationBaseDirectory(String name, String valueContext, String valueName) {
+ if (name == null) {
+ throw new NullPointerException("name == null");
+ }
+ this.name = name;
+ this.valueContext = Context.valueOf(valueContext); // will throw an exception if its not valid, which is what we want
+ this.valueName = valueName;
+ }
+
+ /**
+ * @return the name of this bundle destination base directory (will not be <code>null</code>)
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return indicates where the {@link #getValueName() value's name} can be looked up
+ * and found. This must be one of the enums found in {@link BundleDestinationBaseDirectory.Context}
+ */
+ public Context getValueContext() {
+ return valueContext;
+ }
+
+ /**
+ * @return the name of the property found in the given {@link #getValueContext() context}
+ * where the value of the base directory is
+ */
+ public String getValueName() {
+ return valueName;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("BundleDestinationBaseDirectory [name=").append(name).append(", valueContext=").append(
+ valueContext).append(", valueName=").append(valueName).append("]");
+ return builder.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ return this.name.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof BundleDestinationBaseDirectory)) {
+ return false;
+ }
+ BundleDestinationBaseDirectory other = (BundleDestinationBaseDirectory) obj;
+ return this.name.equals(other.name);
+ }
+ }
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index 0562890..288be78 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@ -59,6 +59,8 @@ import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlTransient;
import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
+import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.event.EventDefinition;
@@ -391,6 +393,13 @@ public class ResourceType implements Serializable, Comparable<ResourceType> {
@OneToOne(mappedBy = "resourceType", fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true)
private BundleType bundleType;
+ // note that this is mapped to a Configuration entity, which is what it really is. However, our getter/setter
+ // only provides access to this via ResourceTypeBundleConfiguration to encapsulate the innards of this implementation
+ // detail, exposing only the more strongly typed methods to obtain bundle-related config properties
+ @JoinColumn(name = "BUNDLE_CONFIG_ID", nullable = true)
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
+ private Configuration bundleConfiguration;
+
@Transient
private transient String helpText;
@@ -650,6 +659,22 @@ public class ResourceType implements Serializable, Comparable<ResourceType> {
this.resourceConfigurationDefinition = resourceConfigurationDefinition;
}
+ public ResourceTypeBundleConfiguration getResourceTypeBundleConfiguration() {
+ if (this.bundleConfiguration == null) {
+ return null;
+ } else {
+ return new ResourceTypeBundleConfiguration(bundleConfiguration);
+ }
+ }
+
+ public void setResourceTypeBundleConfiguration(ResourceTypeBundleConfiguration rtbc) {
+ if (rtbc == null) {
+ this.bundleConfiguration = null;
+ } else {
+ this.bundleConfiguration = rtbc.getBundleConfiguration();
+ }
+ }
+
@XmlTransient
public Set<MeasurementDefinition> getMetricDefinitions() {
return metricDefinitions;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
index f153c81..877c831 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
@@ -393,9 +393,10 @@ public class ResourceTypeManagerBean implements ResourceTypeManagerLocal, Resour
public Map<Integer, ResourceTypeTemplateCountComposite> getTemplateCountCompositeMap() {
Query templateCountQuery = entityManager.createNamedQuery(ResourceType.FIND_ALL_TEMPLATE_COUNT_COMPOSITES);
-
+
@SuppressWarnings("unchecked")
- List<ResourceTypeTemplateCountComposite> results = (List<ResourceTypeTemplateCountComposite>) templateCountQuery.getResultList();
+ List<ResourceTypeTemplateCountComposite> results = (List<ResourceTypeTemplateCountComposite>) templateCountQuery
+ .getResultList();
for (ResourceTypeTemplateCountComposite result : results) {
ResourceType type = result.getType();
@@ -425,6 +426,7 @@ public class ResourceTypeManagerBean implements ResourceTypeManagerLocal, Resour
}
private void scrubType(ResourceType type) {
+ type.setResourceTypeBundleConfiguration(null);
type.setBundleType(null);
type.setChildResourceTypes(null);
type.setChildSubCategories(null);
@@ -455,16 +457,14 @@ public class ResourceTypeManagerBean implements ResourceTypeManagerLocal, Resour
@SuppressWarnings("unchecked")
public List<Integer> getResourceTypeIdsByPlugin(String plugin) {
- return entityManager.createNamedQuery(ResourceType.QUERY_FIND_IDS_BY_PLUGIN)
- .setParameter("plugin", plugin)
+ return entityManager.createNamedQuery(ResourceType.QUERY_FIND_IDS_BY_PLUGIN).setParameter("plugin", plugin)
.getResultList();
}
@Override
public Integer getResourceTypeCountByPlugin(String plugin) {
- return (Integer) entityManager.createNamedQuery(ResourceType.QUERY_FIND_COUNT_BY_PLUGIN)
- .setParameter("plugin", plugin)
- .getSingleResult();
+ return (Integer) entityManager.createNamedQuery(ResourceType.QUERY_FIND_COUNT_BY_PLUGIN).setParameter("plugin",
+ plugin).getSingleResult();
}
@SuppressWarnings("unchecked")
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBean.java
index d264bd8..e4f0ef5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBean.java
@@ -17,6 +17,7 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.criteria.BundleCriteria;
@@ -69,6 +70,29 @@ public class ContentMetadataManagerBean implements ContentMetadataManagerLocal {
existingType.setBundleType(null);
}
+ // set the bundle configuration if the new type is a potential bundle deployment target
+ ResourceTypeBundleConfiguration newBundleConfiguration = newType.getResourceTypeBundleConfiguration();
+ if (newBundleConfiguration != null) {
+ ResourceTypeBundleConfiguration existingBundleConfiguration = existingType
+ .getResourceTypeBundleConfiguration();
+ if (existingBundleConfiguration == null) {
+ // the new type has now become a bundle target where the old type was not
+ existingType.setResourceTypeBundleConfiguration(newBundleConfiguration);
+ } else {
+ // the old type was already a bundle target, we need to merge the new bundle config with the existing old one
+ if (!existingBundleConfiguration.equals(newBundleConfiguration)) {
+ entityMgr.remove(existingBundleConfiguration.getBundleConfiguration());
+ entityMgr.persist(newBundleConfiguration.getBundleConfiguration());
+ existingType.setResourceTypeBundleConfiguration(newBundleConfiguration);
+ }
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Removing bundle configuration");
+ }
+ existingType.setResourceTypeBundleConfiguration(null);
+ }
+
// Easy case: If there are no package definitions in the new type, null out any in the existing and return
if (newType.getPackageTypes().isEmpty()) {
if (log.isDebugEnabled()) {
@@ -86,8 +110,8 @@ public class ContentMetadataManagerBean implements ContentMetadataManagerLocal {
// Easy case: If the existing type did not have any package definitions, simply use the new type defs and return
if (existingType.getPackageTypes().isEmpty()) {
if (log.isDebugEnabled()) {
- log.debug(existingType + " previously did not define any package types. Adding " +
- newType.getPackageTypes());
+ log.debug(existingType + " previously did not define any package types. Adding "
+ + newType.getPackageTypes());
}
for (PackageType newPackageType : newType.getPackageTypes()) {
newPackageType.setResourceType(existingType);
@@ -123,8 +147,7 @@ public class ContentMetadataManagerBean implements ContentMetadataManagerLocal {
}
for (PackageType mergedPackageType : mergedPackageTypes) {
- updatePackageConfigurations(mergedPackageType,
- newPackageTypeDefinitions.get(mergedPackageType.getName()));
+ updatePackageConfigurations(mergedPackageType, newPackageTypeDefinitions.get(mergedPackageType.getName()));
mergedPackageType.update(newPackageTypeDefinitions.get(mergedPackageType.getName()));
entityMgr.merge(mergedPackageType);
}
@@ -154,8 +177,7 @@ public class ContentMetadataManagerBean implements ContentMetadataManagerLocal {
} else {
// update existing
ConfigurationDefinition existingDefinition = existingType.getDeploymentConfigurationDefinition();
- configurationMetadataMgr.updateConfigurationDefinition(newConfigurationDefinition,
- existingDefinition);
+ configurationMetadataMgr.updateConfigurationDefinition(newConfigurationDefinition, existingDefinition);
}
} else {
// newDefinition == null
@@ -170,24 +192,24 @@ public class ContentMetadataManagerBean implements ContentMetadataManagerLocal {
// altogether removed from the code base?
//
// jsanda - 11/3/2010
-// newConfigurationDefinition = newType.getPackageExtraPropertiesDefinition();
-// if (newConfigurationDefinition != null) {
-// if (existingType.getPackageExtraPropertiesDefinition() == null) {
-// // everything new
-// entityMgr.persist(newConfigurationDefinition);
-// existingType.setPackageExtraPropertiesDefinition(newConfigurationDefinition);
-// } else {
-// // update existing
-// ConfigurationDefinition existingDefinition = existingType.getPackageExtraPropertiesDefinition();
-// configurationMetadataMgr.updateConfigurationDefinition(newConfigurationDefinition,
-// existingDefinition);
-// }
-// } else {
-// // newDefinition == null
-// if (existingType.getPackageExtraPropertiesDefinition() != null) {
-// existingType.setPackageExtraPropertiesDefinition(null);
-// }
-// }
+ // newConfigurationDefinition = newType.getPackageExtraPropertiesDefinition();
+ // if (newConfigurationDefinition != null) {
+ // if (existingType.getPackageExtraPropertiesDefinition() == null) {
+ // // everything new
+ // entityMgr.persist(newConfigurationDefinition);
+ // existingType.setPackageExtraPropertiesDefinition(newConfigurationDefinition);
+ // } else {
+ // // update existing
+ // ConfigurationDefinition existingDefinition = existingType.getPackageExtraPropertiesDefinition();
+ // configurationMetadataMgr.updateConfigurationDefinition(newConfigurationDefinition,
+ // existingDefinition);
+ // }
+ // } else {
+ // // newDefinition == null
+ // if (existingType.getPackageExtraPropertiesDefinition() != null) {
+ // existingType.setPackageExtraPropertiesDefinition(null);
+ // }
+ // }
}
@Override
commit 5e45e16a5e7d2ce42c38b9389127da558dc68fcb
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 2 10:33:11 2011 -0400
BZ 644328 - support agent plugin metadata for bundle-target
diff --git a/modules/core/client-api/src/main/resources/rhq-plugin.xsd b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
index 79c519e..c06b949 100644
--- a/modules/core/client-api/src/main/resources/rhq-plugin.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
@@ -440,7 +440,6 @@
</xs:restriction>
</xs:simpleType>
-
<!-- == Operation ================================================== -->
<xs:element name="operation">
@@ -488,6 +487,60 @@
</xs:complexType>
</xs:element>
+ <!-- == Bundle Target ================================================== -->
+
+ <xs:element name="bundle-target">
+ <xs:annotation>
+ <xs:appinfo>
+ <jaxb:class name="BundleTargetDescriptor"/>
+ </xs:appinfo>
+ <xs:documentation>
+ If defined, the resource can be used as a target for bundle deployment.
+ The child elements describe where, under the resource, bundles can be deployed.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="destination-base-dir" maxOccurs="unbounded" minOccurs="1">
+ <xs:complexType>
+ <xs:annotation>
+ <xs:documentation>
+ Defines where a bundle can be deployed under the resource.
+ You must define one destination base directory, but may define more.
+ Each destination base directory's value is obtained from a particular context
+ (e.g. in the resource's plugin configuration or its resource configuration).
+ Within that context, the base directory value is obtained by looking up the named value in the given context.
+ For example, if the value-name is "install.dir" and the value-context is "pluginConfiguration",
+ then the destination base directory value is obtained by getting the "install.dir" property value
+ found in the resource's plugin configuration.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:sequence>
+ <xs:element name="value-context">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="pluginConfiguration"></xs:enumeration>
+ <xs:enumeration value="resourceConfiguration"></xs:enumeration>
+ <xs:enumeration value="measurementTrait"></xs:enumeration>
+ <xs:enumeration value="fileSystem"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="value-name" type="xs:string"></xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required">
+ <xs:annotation>
+ <xs:documentation>
+ The name given to identify this particular destination base directory.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
<!-- BASE RESOURCE -->
<xs:element name="resource" type="rhq:resource">
@@ -500,7 +553,6 @@
</xs:keyref>
</xs:element>
-
<xs:complexType name="resource" abstract="true">
<xs:annotation>
<xs:appinfo>
@@ -561,6 +613,7 @@
<xs:element ref="rhq:event" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="rhq:content" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="resource-configuration" type="config:configuration" minOccurs="0"/>
+ <xs:element ref="rhq:bundle-target" minOccurs="0" maxOccurs="1"/>
<xs:element ref="rhq:help" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string"/>
@@ -643,7 +696,6 @@
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
-
<!-- PLATFORM -->
<xs:element name="platform" type="rhq:platform">
@@ -835,7 +887,6 @@
<xs:attribute name="description" type="xs:string"/>
</xs:complexType>
-
<xs:element name="help">
<xs:complexType mixed="true">
<xs:sequence>
@@ -844,7 +895,6 @@
</xs:complexType>
</xs:element>
-
<xs:element name="version">
<xs:annotation>
<xs:documentation>Tags an model element as applicable to a specific set of version ranges.</xs:documentation>
@@ -863,7 +913,6 @@
</xs:complexType>
</xs:element>
-
<xs:complexType name="processScan">
<xs:annotation>
<xs:appinfo>
@@ -889,7 +938,6 @@
</xs:attribute>
</xs:complexType>
-
<xs:simpleType name="classNameType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
@@ -900,8 +948,6 @@
</xs:restriction>
</xs:simpleType>
-
-
<xs:complexType name="runsInsideType">
<xs:sequence>
<xs:element name="parent-resource-type" type="rhq:parentResourceType" minOccurs="1" maxOccurs="unbounded">
@@ -909,7 +955,6 @@
</xs:sequence>
</xs:complexType>
-
<xs:complexType name="parentResourceType">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="plugin" type="xs:string" use="required"/>
@@ -960,5 +1005,5 @@
</xs:annotation>
</xs:attribute>
</xs:attributeGroup>
-
+
</xs:schema>
diff --git a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
index abe6cc7..3c56aa4 100644
--- a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
@@ -31,6 +31,14 @@
</results>
</operation>
'>
+ <!ENTITY bundleTarget '
+ <bundle-target>
+ <destination-base-dir name="Root File System">
+ <value-context>fileSystem</value-context>
+ <value-name>/</value-name>
+ </destination-base-dir>
+ </bundle-target>
+'>
<!ENTITY metrics '
<metric displayName="Hostname"
property="Trait.hostname"
@@ -248,6 +256,8 @@
<c:simple-property name="EstimatedSize" units="kilobytes"/>
</configuration>
</content>
+
+ &bundleTarget;
</platform>
@@ -343,6 +353,8 @@
</content>
-->
+ &bundleTarget;
+
</platform>
<platform name="Solaris"
@@ -360,6 +372,7 @@
&platformCpu;
&metrics;
&syslogEventDefinition;
+ &bundleTarget;
</platform>
@@ -372,6 +385,7 @@
&nativeMetrics;
&platformCpu;
&metrics;
+ &bundleTarget;
</platform>
<platform name="AIX"
@@ -383,6 +397,7 @@
&nativeMetrics;
&platformCpu;
&metrics;
+ &bundleTarget;
</platform>
<platform name="FreeBSD"
@@ -394,6 +409,7 @@
&nativeMetrics;
&platformCpu;
&metrics;
+ &bundleTarget;
</platform>
<platform name="Mac OS X"
@@ -410,6 +426,7 @@
&platformCpu;
&metrics;
&syslogEventDefinition;
+ &bundleTarget;
</platform>
<platform name="Java"
@@ -419,6 +436,7 @@
&platformSubcategories;
&platformOperations;
&metrics;
+ &bundleTarget;
</platform>
<service name="Network Adapter" discovery="NetworkAdapterDiscoveryComponent" class="NetworkAdapterComponent">
commit f89377c912c1e18beaf1972e1b356dfeea6d2e01
Merge: 8c3c91b 3c3dae0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Jun 1 14:16:41 2011 +0200
Merge branch 'master' into as7plugin
commit 8c3c91b3f8ec9bf187f77dd2ba1e5e67d6572eaa
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Jun 1 14:13:49 2011 +0200
BZ 708956 - (re)implement configuration reading
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
index 93f4c6e..f66cefd 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
@@ -18,6 +18,8 @@
*/
package org.rhq.modules.plugins.jbossas7;
+import java.io.IOException;
+import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -27,6 +29,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
+import org.omg.CORBA.portable.ValueInputStream;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
@@ -39,247 +42,265 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.ReadAttribute;
+import org.rhq.modules.plugins.jbossas7.json.ReadChildrenResources;
import org.rhq.modules.plugins.jbossas7.json.ReadResource;
+import org.rhq.modules.plugins.jbossas7.json.Result;
public class ConfigurationDelegate implements ConfigurationFacet {
+ private static final String SUB_PATH = "_subPath";
+
final Log log = LogFactory.getLog(this.getClass());
+
private List<PROPERTY_VALUE> address;
private ASConnection connection;
private ConfigurationDefinition configurationDefinition;
+ /**
+ * Create a new configuration delegate, that reads the attributes for the resource at address.
+ * @param configDef Configuration definition for the configuration
+ * @param connection asConnection to use
+ * @param address address of the resource.
+ */
public ConfigurationDelegate(ConfigurationDefinition configDef,ASConnection connection, List<PROPERTY_VALUE> address) {
this.configurationDefinition = configDef;
this.connection = connection;
this.address = address;
}
+ /**
+ * Trigger loading of a configuration by talking to the remote resource.
+ * @return The initialized configuration
+ * @throws Exception If anything goes wrong.
+ */
public Configuration loadResourceConfiguration() throws Exception {
+ Configuration config = new Configuration();
- Operation op = new ReadResource(address); // TODO set recursive flag? --> try to narrow it down
+ /*
+ * Grouped definitions get a special treatment, as they may have a special property
+ * that will be evaluated to look at a child resource or a special attribute or such
+ */
+ List<PropertyGroupDefinition> gdef = configurationDefinition.getGroupDefinitions();
+ for (PropertyGroupDefinition pgDef : gdef) {
+ handleGroup(config,pgDef);
+ }
+ /*
+ * Now handle the non-grouped properties
+ */
+ List<PropertyDefinition> nonGroupdedDefs = configurationDefinition.getNonGroupedProperties();
+ Operation op = new ReadResource(address);
op.addAdditionalProperty("recursive", "true");
- JsonNode json = connection.executeRaw(op);
+ handleProperties(config,nonGroupdedDefs,op);
+
+ return config;
+ }
+
+ /**
+ * Handle a set of grouped properties. The name of the group tells us how to deal with it:
+ * <ul>
+ * <li>attribute: read the passed attribute of the resource</li>
+ * <li>children: read the children of the given child-type</li>
+ * </ul>
+ * @param config Configuration to return
+ * @param groupDefinition Definition of this group
+ * @throws Exception If anything goes wrong
+ */
+ private void handleGroup(Configuration config, PropertyGroupDefinition groupDefinition) throws Exception{
+ Operation operation = null;
+ String groupName = groupDefinition.getName();
+ if (groupName.startsWith("attribute:")) {
+ String attr = groupName.substring("attribute:".length());
+ operation = new ReadAttribute(address,attr);
+ }
+ else if (groupName.startsWith("children:")) {
+ String type = groupName.substring("children:".length());
+ operation = new ReadChildrenResources(address,type);
+ operation.addAdditionalProperty("recursive", "true");
+ }
+ else {
+ throw new IllegalArgumentException("Unknown operation in group name [" + groupName + "]");
+ }
+ List<PropertyDefinition> listedDefs = configurationDefinition.getPropertiesInGroup(groupName);
+ handleProperties(config,listedDefs,operation);
+
+ }
- Configuration ret = new Configuration();
- ObjectMapper mapper = new ObjectMapper();
- Set<Map.Entry<String, PropertyDefinition>> entrySet = configurationDefinition.getPropertyDefinitions().entrySet();
- for (Map.Entry<String, PropertyDefinition> propDefEntry : entrySet) {
- PropertyDefinition propDef = propDefEntry.getValue();
- JsonNode sub = json.findValue(propDef.getName());
- if (sub == null) {
+ private void handleProperties(Configuration config, List<PropertyDefinition> definitions, Operation op) throws Exception {
+ if (definitions.size()==0)
+ return;
+
+ Result operationResult = connection.execute(op);
+ if (!operationResult.isSuccess()) {
+ throw new IOException("Operation " + op + " failed: " + operationResult.getFailureDescription());
+ }
+
+
+ if (operationResult.getResult() instanceof List) {
+ PropertyList propertyList = handlePropertyList((PropertyDefinitionList) definitions.get(0),operationResult.getResult());
+
+ if (propertyList!=null)
+ config.put(propertyList);
+ return;
+ }
+
+ Map<String,Object> results = (Map<String, Object>) operationResult.getResult();
+
+
+ for (PropertyDefinition propDef :definitions ) {
+ String propertyName = propDef.getName();
+/*
+ if (!results.containsKey(propertyName)) {
log.warn(
- "No value for property [" + propDef.getName() + "] found - check the descriptor (may be valid, \n"+
+ "No value for property [" + propertyName + "] found - check the descriptor (may be valid, \n"+
"as some attributes are different in domain vs standalone mode");
continue;
}
+*/
+ Object valueObject = results.get(propertyName);
+
if (propDef instanceof PropertyDefinitionSimple) {
- PropertySimple propertySimple;
-
- if (sub != null) {
- // Property is non-null -> return it.
- propertySimple = new PropertySimple(propDef.getName(), sub.getValueAsText());
- ret.put(propertySimple);
- } else {
- // property is null? Check if it is required
- if (propDef.isRequired()) {
- String defaultValue = ((PropertyDefinitionSimple) propDef).getDefaultValue();
- propertySimple = new PropertySimple(propDef.getName(), defaultValue);
- ret.put(propertySimple);
- }
- }
- } else if (propDef instanceof PropertyDefinitionList) {
- PropertyList propertyList = new PropertyList(propDef.getName());
- PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
- if (memberDefinition == null) {
- if (sub.isObject()) {
- Iterator<String> fields = sub.getFieldNames();
- while (fields.hasNext()) {
- String fieldName = fields.next();
- JsonNode subNode = sub.get(fieldName);
- PropertySimple propertySimple = new PropertySimple(propDef.getName(), fieldName);
- propertyList.add(propertySimple);
- }
- } else {
- System.out.println("===Sub not object==="); // TODO evaluate this branch again
- Iterator<JsonNode> values = sub.getElements();
- while (values.hasNext()) {
- JsonNode node = values.next();
- String value = node.getTextValue();
- PropertySimple propertySimple = new PropertySimple(propDef.getName(), value);
- propertyList.add(propertySimple);
- }
- }
- } else if (memberDefinition instanceof PropertyDefinitionMap) {
- PropertySimple propertySimple;
-
- if (sub.isArray()) {
- Iterator<JsonNode> entries = sub.getElements();
- while (entries.hasNext()) {
- JsonNode entry = entries.next(); // -> one row in the list i.e. one map
-
- // Distinguish here?
-
- PropertyMap map = new PropertyMap(
- memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
- Iterator<JsonNode> fields = entry.getElements(); // TODO loop over fields from map and not from json
- while (fields.hasNext()) {
- JsonNode field = fields.next();
- if (field.isObject()) {
- // TODO only works for tuples at the moment - migrate to some different kind of parsing!
- PROPERTY_VALUE prop = mapper.readValue(field, PROPERTY_VALUE.class);
- // now need to find the names of the properties
- List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
- if (defList.isEmpty())
- throw new IllegalArgumentException(
- "Map " + memberDefinition.getName() + " has no members");
- String key = defList.get(0).getName();
- String value = prop.getKey();
- propertySimple = new PropertySimple(key, value);
- map.put(propertySimple);
- if (defList.size() > 1) {
- key = defList.get(1).getName();
- value = prop.getValue();
- propertySimple = new PropertySimple(key, value);
- map.put(propertySimple);
-
- }
- } else { // TODO reached?
- String key = field.getValueAsText();
- if (key.equals(
- "PROPERTY_VALUE")) { // TODO this may change in the future in the AS implementation
- JsonNode pv = entry.findValue(key);
- String k = pv.toString();
- String v = pv.getValueAsText();
- propertySimple = new PropertySimple(k, v);
- map.put(propertySimple);
-
- } else {
- JsonNode value = entry.findValue(key);
- if (value != null) {
- propertySimple = new PropertySimple(key, value.getValueAsText());
- map.put(propertySimple);
- }
-
- }
- }
- }
- propertyList.add(map);
- }
- } else if (sub.isObject()) {
- Iterator<String> keys = sub.getFieldNames();
- while (keys.hasNext()) {
- String entryKey = keys.next();
-
- JsonNode node = sub.findPath(entryKey);
- PropertyMap map = new PropertyMap(
- memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
- if (node.isObject()) {
- Iterator<String> fields = node.getFieldNames(); // TODO loop over fields from map and not from json
- while (fields.hasNext()) {
- String key = fields.next();
-
- propertySimple = new PropertySimple(key, node.findValue(key).getValueAsText());
- map.put(propertySimple);
- }
- propertyList.add(map);
- } else if (sub.isNull()) {
- List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
- String key = defList.get(0).getName();
- propertySimple = new PropertySimple(key, entryKey);
- map.put(propertySimple);
- }
- }
-
- }
- } else if (memberDefinition instanceof PropertyDefinitionSimple) {
- String name = memberDefinition.getName();
- Iterator<JsonNode> keys = sub.getElements();
- while (keys.hasNext()) {
- JsonNode entry = keys.next();
-
- PropertySimple propertySimple = new PropertySimple(name, entry.getTextValue());
- propertyList.add(propertySimple);
- }
- }
- ret.put(propertyList);
- } // end List of ..
+
+ PropertySimple value = handlePropertySimple((PropertyDefinitionSimple) propDef, valueObject);
+ if (value!=null)
+ config.put(value);
+ }
+
+ else if (propDef instanceof PropertyDefinitionList) {
+ PropertyList propertyList = handlePropertyList((PropertyDefinitionList) propDef,valueObject);
+
+ if (propertyList!=null)
+ config.put(propertyList);
+ }
else if (propDef instanceof PropertyDefinitionMap) {
- PropertyDefinitionMap mapDef = (PropertyDefinitionMap) propDef;
- PropertyMap pm = new PropertyMap(mapDef.getName());
-
- Map<String, PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
- for (Map.Entry<String, PropertyDefinition> maEntry : memberDefMap.entrySet()) {
- JsonNode valueNode = json.findValue(maEntry.getKey());
- Property p;
- if (maEntry.getValue() instanceof PropertyDefinitionSimple) {
- p = putProperty(valueNode, maEntry.getValue());
- pm.put(p);
- } else if (maEntry.getValue() instanceof PropertyDefinitionMap) { // TODO make this recursive?
-
- PropertyDefinitionMap pdm = (PropertyDefinitionMap) maEntry.getValue();
- Map<String, PropertyDefinition> mmDefMap = pdm.getPropertyDefinitions();
- for (Map.Entry<String, PropertyDefinition> mmDefEntry : mmDefMap.entrySet()) {
- if (valueNode != null) {
- JsonNode node2 = valueNode.findValue(mmDefEntry.getKey());
- System.err.println("Map not yet implemented " + node2.toString());
- } else
- System.err.println("Value node was null ");
- }
- } else { // PropDefList
- System.err.println("List not yet implemented");
- }
-
-// pm.put(p);
- }
- ret.put(pm);
+ PropertyMap propertyMap = handlePropertyMap((PropertyDefinitionMap) propDef,valueObject);
+
+ if (propertyMap!=null)
+ config.put(propertyMap);
+ }
+ }
+ }
+
+ PropertySimple handlePropertySimple(PropertyDefinitionSimple propDef, Object valueObject) {
+ PropertySimple propertySimple;
+
+ String name = propDef.getName();
+ if (valueObject != null) {
+ // Property is non-null -> return it.
+ propertySimple = new PropertySimple(name, valueObject);
+ } else {
+ // property is null? Check if it is required
+ if (propDef.isRequired()) {
+ String defaultValue = ((PropertyDefinitionSimple) propDef).getDefaultValue();
+ propertySimple = new PropertySimple(name, defaultValue);
+ }
+ else { // Not required and null -> return null
+ propertySimple = new PropertySimple(name,null);
}
}
+ return propertySimple;
- return ret;
}
- PropertySimple putProperty(JsonNode value, PropertyDefinition def) {
- String name = def.getName();
- PropertySimple ps;
+ /**
+ * Handle a Map of ...
+ * @param propDef Definition of the map
+ * @param valueObject the objects to put into the map
+ * @return the populated map
+ */
+ PropertyMap handlePropertyMap(PropertyDefinitionMap propDef, Object valueObject) {
+ PropertyMap propertyMap = new PropertyMap(propDef.getName());
+
+ Map<String, PropertyDefinition> memberDefMap = propDef.getPropertyDefinitions();
+ Map<String,Object> objects = (Map<String, Object>) valueObject;
+ for (Map.Entry<String, PropertyDefinition> maEntry : memberDefMap.entrySet()) {
+ String key = maEntry.getKey();
+ // special case: if the key is "*", we just pick the first element
+ Object o ;
+ if (key.equals("*"))
+ o = objects.entrySet().iterator().next().getValue();
+ else
+ o = objects.get(key);
+ Property property;
+ PropertyDefinition value = maEntry.getValue();
+ if (value instanceof PropertyDefinitionSimple)
+ property = handlePropertySimple((PropertyDefinitionSimple) value,o);
+ else if (value instanceof PropertyDefinitionList)
+ property = handlePropertyList((PropertyDefinitionList) value,o);
+ else if (value instanceof PropertyDefinitionMap)
+ property = handlePropertyMap((PropertyDefinitionMap) value,o);
+ else
+ throw new IllegalArgumentException("Unknown property type in map property [" + propDef.getName() +"]");
+
+ if (property!=null)
+ propertyMap.put(property);
+ else
+ System.out.println("Property " + key + " was null");
- if (value == null) {
- if (def instanceof PropertyDefinitionSimple) {
- PropertyDefinitionSimple pds = (PropertyDefinitionSimple) def;
- return new PropertySimple(name, pds.getDefaultValue());
- } else
- return new PropertySimple(name, null);
}
- PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
-
- switch (type) {
- case BOOLEAN:
- ps = new PropertySimple(name, value.getBooleanValue());
- break;
- case FLOAT:
- case DOUBLE:
- ps = new PropertySimple(name, value.getDoubleValue());
- break;
- case INTEGER:
- ps = new PropertySimple(name, value.getIntValue());
- break;
- case LONG:
- ps = new PropertySimple(name, value.getLongValue());
- break;
- default:
- ps = new PropertySimple(name, value.getTextValue());
+
+ return propertyMap;
+ }
+
+ /**
+ * Handle a List of ...
+ * @param propDef Definition of this list
+ * @param valueObject The objects to put into the list
+ * @return the property that describes the list.
+ */
+ PropertyList handlePropertyList(PropertyDefinitionList propDef,Object valueObject) {
+ String propertyName = propDef.getName();
+ PropertyList propertyList = new PropertyList(propertyName);
+ PropertyDefinition memberDefinition = propDef.getMemberDefinition();
+ if (memberDefinition==null)
+ throw new IllegalArgumentException("Member definition for property [" + propertyName + "] was null");
+
+ if (valueObject==null) {
+// System.out.println("vo null");
+ return null;
}
- return ps;
+ Collection<Object> objects;
+ if (valueObject instanceof List)
+ objects = (List<Object>) valueObject;
+ else /*if (valueObject instanceof Map)*/ {
+ objects = ((Map)valueObject).values();
+ }
+
+ if (memberDefinition instanceof PropertyDefinitionSimple) {
+ for (Object obj : objects) {
+ PropertySimple property = handlePropertySimple((PropertyDefinitionSimple) memberDefinition,
+ obj);
+ if (property!=null)
+ propertyList.add(property);
+ }
+ }
+ else if (memberDefinition instanceof PropertyDefinitionMap) {
+ for (Object obj : objects) {
+ Map<String,Object> map = (Map<String, Object>) obj;
+
+ PropertyMap propertyMap = handlePropertyMap(
+ (PropertyDefinitionMap) propDef.getMemberDefinition(),map);
+ if (propertyMap!=null)
+ propertyList.add(propertyMap);
+ }
+ }
+ // TODO List of lists ?
+ return propertyList;
}
+
+
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
Configuration conf = report.getConfiguration();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
index 23d10bb..e521e83 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
@@ -21,7 +21,7 @@ package org.rhq.modules.plugins.jbossas7.json;
import java.util.List;
/**
- * Operation that reads children of a given type from an address
+ * Operation that reads names of children of a given type from an address
* @author Heiko W. Rupp
*/
public class ReadChildrenNames extends Operation {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenResources.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenResources.java
new file mode 100644
index 0000000..543c15b
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenResources.java
@@ -0,0 +1,37 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.List;
+
+/**
+ * Operation that reads children of a given type from an address
+ * @author Heiko W. Rupp
+ */
+public class ReadChildrenResources extends Operation {
+
+ /**
+ * Read children names of a given type below a given address
+ * @param address Address to look at e.g. /profile/default/subsystem/messaging
+ * @param childType e.g. queue
+ */
+ public ReadChildrenResources(List<PROPERTY_VALUE> address, String childType) {
+ super("read-children-resources",address,"child-type",childType);
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 45fa342..6aa6dd5 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -274,15 +274,24 @@
<resource-configuration>
- <c:list-property name="schema-locations" displayName="Schema locations">
- <c:map-property name="location">
- <c:simple-property name="urn" readOnly="true"/>
- <c:simple-property name="location" readOnly="true"/>
- </c:map-property>
- </c:list-property>
- <c:list-property name="extension" displayName="Installed extensions">
- <c:simple-property name="name" readOnly="true"/>
- </c:list-property>
+
+ <c:group name="attribute:schema-locations">
+
+ <c:list-property name="schema-locations" displayName="Schema locations">
+ <c:map-property name="*">
+ <c:simple-property name="*" readOnly="true" displayName="Schema name"/>
+ </c:map-property>
+ </c:list-property>
+ </c:group>
+
+ <c:group name="children:extension" displayName="Installed extensions">
+
+ <c:list-property name="extension" displayName="Installed extensions">
+ <c:map-property name="*" displayName="Name">
+ <c:simple-property name="module" displayName="Module name"/>
+ </c:map-property>
+ </c:list-property>
+ </c:group>
</resource-configuration>
@@ -649,13 +658,13 @@
<c:simple-property name="bean-validation-enabled" required="true" type="boolean" readOnly="true"
description="Specify whether bean validation is enabled"/>
<c:simple-property name="archive-validation-enabled" type="boolean" readOnly="true" description="Enabling the validation"/>
- <c:simple-property name="archive-validation-fail-on-error" type="boolean" readOnly="true" default="true"
+ <c:simple-property name="archive-validation-fail-on-error" type="boolean" readOnly="true" defaultValue="true"
description="Should an archive validation error report fail the deployment. Default: true"/>
- <c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true" default="false"
+ <c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true" defaultValue="false"
description="Should an archive validation warning report fail the deployment. Default: false"/>
- <c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true" default="false"
+ <c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true" defaultValue="false"
description="enable/disable debug information logging for cached connection manager"/>
- <c:simple-property name="cached-connection-manager-error" type="boolean" readOnly="true" default="false"
+ <c:simple-property name="cached-connection-manager-error" type="boolean" readOnly="true" defaultValue="false"
description="enable/disable error information logging for cached connection manager"/>
</resource-configuration>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java
index afd6a7f..6f3a260 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java
@@ -18,6 +18,9 @@
*/
package org.rhq.modules.plugins.jbossas7;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import java.util.Map;
@@ -51,6 +54,7 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.Result;
/**
* Tests loading and writing configurations
@@ -76,7 +80,7 @@ public class ConfigurationTest {
definition.put(new PropertyDefinitionSimple("access-log", "Access-Log", false,
PropertySimpleType.STRING));
definition.put(new PropertyDefinitionSimple("rewrite", "Rewrite", false,
- PropertySimpleType.STRING));
+ PropertySimpleType.BOOLEAN));
definition.put(new PropertyDefinitionSimple("notThere", "NotThere", false,
PropertySimpleType.STRING));
@@ -86,7 +90,7 @@ public class ConfigurationTest {
String resultString = " {\"outcome\" : \"success\", \"result\" : {\"alias\" : [\"example.com\",\"example2.com\"],"+
- " \"access-log\" : null, \"rewrite\" : null}, \"compensating-operation\" : null}";
+ " \"access-log\" : \"my.log\", \"rewrite\" : true}, \"compensating-operation\" : null}";
ObjectMapper mapper = new ObjectMapper();
ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
@@ -102,7 +106,27 @@ public class ConfigurationTest {
PropertyList aliases = (PropertyList) config.get("alias");
List<Property> list = aliases.getList();
assert list.size()==2;
- assert config.get("notThere")==null;
+ int count=2;
+ for (Property p: list) {
+ PropertySimple ps = (PropertySimple) p;
+ if (ps.getStringValue().equals("example.com"))
+ count--;
+ if (ps.getStringValue().equals("example2.com"))
+ count--;
+ }
+ assert count==0 : "Did not find all needed aliases";
+
+ Property notThere = config.get("notThere");
+ assert notThere !=null;
+ assert ((PropertySimple)notThere).getStringValue()==null;
+
+ PropertySimple property = (PropertySimple) config.get("rewrite");
+ assert property!=null;
+ assert property.getBooleanValue();
+
+ property = (PropertySimple) config.get("access-log");
+ assert property!=null && property.getStringValue()!=null;
+ assert property.getStringValue().equals("my.log");
}
public void test2() throws Exception {
@@ -247,10 +271,165 @@ public class ConfigurationTest {
assert ((PropertySimple)map2.get("multicast-port")).getIntegerValue()==18447;
}
}
+ }
+
+
+ public void test4() throws Exception {
+
+ String resultString = loadJsonFromFile("extensions.json");
+
+ ConfigurationDefinition definition = loadDescriptor("test4");
+
+ ObjectMapper mapper = new ObjectMapper();
+ Result result = mapper.readValue(resultString,Result.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ FakeConnection connection = new FakeConnection();
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+ assert config != null;
+ PropertyList extensions = (PropertyList) config.get("extension");
+ assert extensions !=null;
+ List<Property> extensionList = extensions.getList();
+ assert extensionList.size()==22 : "Expected 22 extensions, got " + extensionList.size();
+ PropertyMap propertyMap = (PropertyMap) extensionList.get(0);
+ assert propertyMap != null;
+ PropertyMap starMap = (PropertyMap) propertyMap.get("*");
+ assert starMap!=null;
+ PropertySimple module = (PropertySimple) starMap.get("module");
+ assert module!=null : "Module was null, but should not";
+ String stringValue = module.getStringValue();
+ assert stringValue!=null : "module property has no value";
+ assert stringValue.equals("org.jboss.as.arquillian.service");
+
}
+ public void test5() throws Exception {
+
+ String resultString = loadJsonFromFile("schema-locations.json");
+
+ ConfigurationDefinition definition = loadDescriptor("test5");
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ FakeConnection connection = new FakeConnection();
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+ assert config != null;
+ PropertyList locations = (PropertyList) config.get("schema-locations");
+ assert locations!=null;
+ List<Property> list = locations.getList();
+ assert list.size()==21 : "List does not contain 21 entries, but " + list.size();
+ PropertyMap propertyMap = (PropertyMap) list.get(0);
+ assert propertyMap !=null;
+ Map<String,Property> map = propertyMap.getMap();
+ assert map.size()==1;
+ PropertySimple urnProp = (PropertySimple) map.get("*");
+ String stringValue = urnProp.getStringValue();
+ assert stringValue!=null : "Location property has no value";
+ assert stringValue.endsWith(".xsd");
+
+ }
+
+ public void test6() throws Exception {
+
+ String resultString = loadJsonFromFile("loopback.json");
+
+ ConfigurationDefinition definition = loadDescriptor("test6and7");
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ FakeConnection connection = new FakeConnection();
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+ assert config != null;
+ PropertySimple nameProperty = (PropertySimple) config.get("name");
+ assert nameProperty !=null;
+ String stringValue = nameProperty.getStringValue();
+ assert stringValue!=null;
+ assert stringValue.equals("default");
+
+ Property criteria = config.get("criteria");
+ assert criteria !=null;
+ PropertySimple critProp = (PropertySimple) criteria;
+ stringValue = critProp.getStringValue();
+ assert stringValue!=null;
+
+ }
+
+ public void test7() throws Exception {
+
+ String resultString = loadJsonFromFile("interfaces.json");
+
+ ConfigurationDefinition definition = loadDescriptor("test6and7");
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ FakeConnection connection = new FakeConnection();
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+ assert config != null;
+ PropertySimple nameProperty = (PropertySimple) config.get("name");
+ assert nameProperty !=null;
+ String stringValue = nameProperty.getStringValue();
+ assert stringValue!=null;
+ assert stringValue.equals("public");
+
+ Property criteria = config.get("criteria");
+ assert criteria !=null;
+ PropertySimple critProp = (PropertySimple) criteria;
+ stringValue = critProp.getStringValue();
+ assert stringValue!=null;
+ assert stringValue.equals("any-ipv4-address");
+
+ }
+
+ public void test8() throws Exception {
+
+ String resultString = loadJsonFromFile("connector.json");
+
+ ConfigurationDefinition definition = loadDescriptor("test8");
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ FakeConnection connection = new FakeConnection();
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+ assert config!=null;
+ assert config.getAllProperties().size()==8 : "Did not find 8 properties, but " + config.getAllProperties().size();
+ Property prop = config.get("bean-validation-enabled");
+ assert prop != null;
+ PropertySimple ps = (PropertySimple) prop;
+ assert ps.getBooleanValue();
+ prop = config.get("cached-connection-manager-error");
+ assert prop!=null;
+ ps = (PropertySimple) prop;
+ assert ps.getBooleanValue()==false;
+
+ }
@BeforeSuite
private void loadPluginDescriptor() throws Exception {
@@ -291,6 +470,22 @@ public class ConfigurationTest {
return null;
}
+ private String loadJsonFromFile(String fileName) throws Exception {
+ InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ try {
+ StringBuilder builder = new StringBuilder();
+ String line;
+ while ((line = reader.readLine()) != null) {
+ builder.append(line);
+ }
+ return builder.toString();
+ }
+ finally {
+ reader.close();
+ }
+ }
+
/**
diff --git a/modules/plugins/jboss-as-7/src/test/resources/complexInterface.json b/modules/plugins/jboss-as-7/src/test/resources/complexInterface.json
new file mode 100644
index 0000000..bd048db
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/complexInterface.json
@@ -0,0 +1,14 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "name" : "complex",
+ "criteria" : [ {
+ "any" : [ {
+ "subnet-match" : "192.168.0.0/16"
+ }, "public-address" ]
+ }, {
+ "not" : [ "site-local-address" ]
+ }, "up", "multicast" ]
+ },
+ "compensating-operation" : null
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/connector.json b/modules/plugins/jboss-as-7/src/test/resources/connector.json
new file mode 100644
index 0000000..78d6850
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/connector.json
@@ -0,0 +1,10 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "default-workmanager-short-running-thread-pool" : "jca-short-running",
+ "default-workmanager-long-running-thread-pool" : "jca-long-running",
+ "bean-validation-enabled" : true,
+ "archive-validation-enabled" : true
+ },
+ "compensating-operation" : null
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/domain-result.json b/modules/plugins/jboss-as-7/src/test/resources/domain-result.json
new file mode 100644
index 0000000..9312a97
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/domain-result.json
@@ -0,0 +1,2113 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "host" : {
+ "local" : {
+ "name" : "local",
+ "namespaces" : [ {
+ "xsi" : "http://www.w3.org/2001/XMLSchema-instance"
+ } ],
+ "schema-locations" : [ {
+ "urn:jboss:domain:1.0" : "jboss_7_0.xsd"
+ } ],
+ "extension" : null,
+ "system-property" : null,
+ "path" : null,
+ "management" : {
+ "security-realms" : {
+ "security-realm" : null
+ },
+ "connections" : {
+ "connection" : null
+ }
+ },
+ "management-interface" : {
+ "native-interface" : {
+ "interface" : "public",
+ "port" : 9999
+ },
+ "http-interface" : {
+ "interface" : "public",
+ "port" : 9990
+ }
+ },
+ "server-config" : {
+ "server-one" : {
+ "path" : null,
+ "system-property" : null,
+ "interface" : null,
+ "jvm" : {
+ "default" : {
+ "type" : null,
+ "agent-lib" : null,
+ "agent-path" : null,
+ "env-classpath-ignored" : null,
+ "environment-variables" : null,
+ "heap-size" : null,
+ "max-heap-size" : null,
+ "java-agent" : null,
+ "java-home" : null,
+ "jvm-options" : null,
+ "permgen-size" : null,
+ "max-permgen-size" : null,
+ "stack-size" : null
+ }
+ },
+ "socket-binding-group" : null,
+ "socket-binding-port-offset" : null,
+ "name" : "server-one",
+ "group" : "main-server-group",
+ "auto-start" : true
+ },
+ "server-two" : {
+ "path" : null,
+ "system-property" : null,
+ "interface" : null,
+ "jvm" : {
+ "default" : {
+ "type" : null,
+ "agent-lib" : null,
+ "agent-path" : null,
+ "env-classpath-ignored" : null,
+ "environment-variables" : null,
+ "heap-size" : "64m",
+ "max-heap-size" : "256m",
+ "java-agent" : null,
+ "java-home" : null,
+ "jvm-options" : null,
+ "permgen-size" : null,
+ "max-permgen-size" : null,
+ "stack-size" : null
+ }
+ },
+ "socket-binding-group" : "standard-sockets",
+ "socket-binding-port-offset" : 150,
+ "name" : "server-two",
+ "group" : "main-server-group",
+ "auto-start" : true
+ },
+ "server-three" : {
+ "path" : null,
+ "system-property" : null,
+ "interface" : null,
+ "jvm" : null,
+ "socket-binding-group" : "standard-sockets",
+ "socket-binding-port-offset" : 250,
+ "name" : "server-three",
+ "group" : "other-server-group",
+ "auto-start" : false
+ }
+ },
+ "domain-controller" : {
+ "local" : {
+ }
+ },
+ "interface" : {
+ "loopback" : {
+ "name" : "loopback",
+ "criteria" : [ {
+ "inet-address" : "127.0.0.1"
+ } ]
+ },
+ "public" : {
+ "name" : "public",
+ "criteria" : "any-ipv4-address"
+ }
+ },
+ "jvm" : {
+ "default" : {
+ "type" : null,
+ "agent-lib" : null,
+ "agent-path" : null,
+ "env-classpath-ignored" : null,
+ "environment-variables" : null,
+ "heap-size" : "64m",
+ "max-heap-size" : "128m",
+ "java-agent" : null,
+ "java-home" : null,
+ "jvm-options" : null,
+ "permgen-size" : null,
+ "max-permgen-size" : null,
+ "stack-size" : null
+ }
+ },
+ "server" : {
+ "server-one" : {
+ "namespaces" : [ {
+ "xsi" : "http://www.w3.org/2001/XMLSchema-instance"
+ } ],
+ "schema-locations" : [ {
+ "urn:jboss:domain:1.0" : "jboss_7_0.xsd"
+ }, {
+ "urn:jboss:domain:arquillian:1.0" : "jboss-arquillian.xsd"
+ }, {
+ "urn:jboss:domain:connector:1.0" : "jboss-connector.xsd"
+ }, {
+ "urn:jboss:domain:datasources:1.0" : "jboss-datasources.xsd"
+ }, {
+ "urn:jboss:domain:ejb3:1.0" : "jboss-ejb3.xsd"
+ }, {
+ "urn:jboss:domain:ee:1.0" : "jboss-ee.xsd"
+ }, {
+ "urn:jboss:domain:jaxrs:1.0" : "jboss-jaxrs.xsd"
+ }, {
+ "urn:jboss:domain:jmx:1.0" : "jboss-jmx.xsd"
+ }, {
+ "urn:jboss:domain:jpa:1.0" : "jboss-jpa.xsd"
+ }, {
+ "urn:jboss:domain:messaging:1.0" : "jboss-messaging.xsd"
+ }, {
+ "urn:jboss:domain:naming:1.0" : "jboss-naming.xsd"
+ }, {
+ "urn:jboss:domain:osgi:1.0" : "jboss-osgi.xsd"
+ }, {
+ "urn:jboss:domain:remoting:1.0" : "jboss-remoting.xsd"
+ }, {
+ "urn:jboss:domain:resourceadapters:1.0" : "jboss-resource-adapters.xsd"
+ }, {
+ "urn:jboss:domain:sar:1.0" : "jboss-sar.xsd"
+ }, {
+ "urn:jboss:domain:threads:1.0" : "jboss-threads.xsd"
+ }, {
+ "urn:jboss:domain:transactions:1.0" : "jboss-txn.xsd"
+ }, {
+ "urn:jboss:domain:web:1.0" : "jboss-web.xsd"
+ }, {
+ "urn:jboss:domain:security:1.0" : "jboss-security.xsd"
+ }, {
+ "urn:jboss:domain:webservices:1.0" : "jboss-webservices.xsd"
+ }, {
+ "urn:jboss:domain:weld:1.0" : "jboss-weld.xsd"
+ } ],
+ "name" : "server-one",
+ "management" : {
+ "security-realms" : {
+ "security-realm" : null
+ },
+ "connections" : {
+ "connection" : null
+ }
+ },
+ "management-interface" : null,
+ "profile-name" : null,
+ "extension" : {
+ "org.jboss.as.arquillian.service" : {
+ "module" : "org.jboss.as.arquillian.service"
+ },
+ "org.jboss.as.connector" : {
+ "module" : "org.jboss.as.connector"
+ },
+ "org.jboss.as.jmx" : {
+ "module" : "org.jboss.as.jmx"
+ },
+ "org.jboss.as.jpa" : {
+ "module" : "org.jboss.as.jpa"
+ },
+ "org.jboss.as.logging" : {
+ "module" : "org.jboss.as.logging"
+ },
+ "org.jboss.as.ee" : {
+ "module" : "org.jboss.as.ee"
+ },
+ "org.jboss.as.ejb3" : {
+ "module" : "org.jboss.as.ejb3"
+ },
+ "org.jboss.as.jaxrs" : {
+ "module" : "org.jboss.as.jaxrs"
+ },
+ "org.jboss.as.messaging" : {
+ "module" : "org.jboss.as.messaging"
+ },
+ "org.jboss.as.naming" : {
+ "module" : "org.jboss.as.naming"
+ },
+ "org.jboss.as.osgi" : {
+ "module" : "org.jboss.as.osgi"
+ },
+ "org.jboss.as.remoting" : {
+ "module" : "org.jboss.as.remoting"
+ },
+ "org.jboss.as.sar" : {
+ "module" : "org.jboss.as.sar"
+ },
+ "org.jboss.as.security" : {
+ "module" : "org.jboss.as.security"
+ },
+ "org.jboss.as.threads" : {
+ "module" : "org.jboss.as.threads"
+ },
+ "org.jboss.as.transactions" : {
+ "module" : "org.jboss.as.transactions"
+ },
+ "org.jboss.as.web" : {
+ "module" : "org.jboss.as.web"
+ },
+ "org.jboss.as.weld" : {
+ "module" : "org.jboss.as.weld"
+ },
+ "org.jboss.as.webservices" : {
+ "module" : "org.jboss.as.webservices"
+ }
+ },
+ "system-property" : {
+ "java.net.preferIPv4Stack" : {
+ "value" : "true"
+ }
+ },
+ "path" : null,
+ "subsystem" : {
+ "logging" : {
+ "logger" : {
+ },
+ "async-handler" : {
+ },
+ "console-handler" : {
+ "CONSOLE" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "queue-length" : null
+ }
+ },
+ "file-handler" : {
+ },
+ "periodic-rotating-file-handler" : {
+ "FILE" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "file" : {
+ "path" : "server.log",
+ "relative-to" : "jboss.server.log.dir"
+ },
+ "suffix" : ".yyyy-MM-dd"
+ }
+ },
+ "size-rotating-file-handler" : {
+ },
+ "root-logger" : {
+ "level" : "INFO",
+ "handlers" : [ "CONSOLE", "FILE" ]
+ }
+ },
+ "threads" : {
+ "bounded-queue-thread-pool" : {
+ "jca-short-running" : {
+ "name" : "jca-short-running",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "jca-long-running" : {
+ "name" : "jca-long-running",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "ejb3-async" : {
+ "name" : "ejb3-async",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ }
+ },
+ "queueless-thread-pool" : {
+ },
+ "scheduled-thread-pool" : {
+ "remoting" : {
+ "name" : "remoting",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ }
+ }
+ },
+ "thread-factory" : {
+ },
+ "unbounded-queue-thread-pool" : {
+ }
+ },
+ "arquillian" : {
+ },
+ "ee" : null,
+ "ejb3" : {
+ },
+ "naming" : {
+ },
+ "security" : {
+ "security-domain" : {
+ "other" : {
+ "authentication" : [ {
+ "code" : "UsersRoles",
+ "flag" : "required"
+ } ]
+ }
+ }
+ },
+ "transactions" : {
+ "core-environment" : {
+ "process-id" : {
+ "uuid" : "uuid"
+ },
+ "node-identifier" : null,
+ "relative-to" : null,
+ "path" : null
+ },
+ "recovery-environment" : {
+ "socket-binding" : "txn-recovery-environment",
+ "status-socket-binding" : "txn-status-manager"
+ },
+ "coordinator-environment" : {
+ "enable-statistics" : null,
+ "default-timeout" : null
+ },
+ "object-store" : {
+ "relative-to" : null,
+ "path" : null
+ }
+ },
+ "remoting" : {
+ "thread-pool" : "remoting",
+ "connector" : {
+ }
+ },
+ "jmx" : {
+ "server-binding" : "jmx-connector-server",
+ "registry-binding" : "jmx-connector-registry"
+ },
+ "jpa" : {
+ "default-datasource" : ""
+ },
+ "sar" : {
+ },
+ "weld" : {
+ },
+ "connector" : {
+ "default-workmanager-short-running-thread-pool" : "jca-short-running",
+ "default-workmanager-long-running-thread-pool" : "jca-long-running",
+ "bean-validation-enabled" : true,
+ "archive-validation-enabled" : true
+ },
+ "datasources" : {
+ "data-source" : {
+ "java:/H2DS" : {
+ "connection-url" : "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
+ "jndi-name" : "java:/H2DS",
+ "driver-name" : "h2",
+ "pool-name" : "H2DS",
+ "use-java-context" : true,
+ "enabled" : true,
+ "pool-prefill" : false,
+ "pool-use-strict-min" : false,
+ "user-name" : "sa",
+ "password" : "sa",
+ "background-validation" : false,
+ "use-fast-fail" : false,
+ "validate-on-match" : false
+ }
+ },
+ "xa-data-source" : null,
+ "jdbc-driver" : {
+ "h2" : {
+ "driver-name" : "h2",
+ "driver-module-name" : "com.h2database.h2",
+ "driver-xa-datasource-class-name" : "org.h2.jdbcx.JdbcDataSource"
+ }
+ }
+ },
+ "resource-adapters" : {
+ "resource-adapter" : null
+ },
+ "osgi" : {
+ "activation" : "lazy",
+ "configuration" : {
+ "pid" : "org.apache.felix.webconsole.internal.servlet.OsgiManager",
+ "configuration_properties" : {
+ "manager.root" : "jboss-osgi"
+ }
+ },
+ "properties" : {
+ "org.jboss.osgi.system.modules" : "org.apache.commons.logging,\n org.apache.log4j,\n org.jboss.as.osgi,\n org.slf4j,",
+ "org.osgi.framework.system.packages.extra" : "org.apache.commons.logging;version=1.1.1,\n org.apache.log4j;version=1.2,\n org.jboss.as.osgi.service;version=7.0,\n org.jboss.osgi.deployment.interceptor;version=1.0,\n org.jboss.osgi.spi.capability;version=1.0,\n org.jboss.osgi.spi.util;version=1.0,\n org.jboss.osgi.testing;version=1.0,\n org.jboss.osgi.vfs;version=1.0,\n org.slf4j;version=1.5.10,",
+ "org.osgi.framework.startlevel.beginning" : "1"
+ },
+ "modules" : {
+ "javaee.api" : null,
+ "org.jboss.as.arquillian.aggregate" : null,
+ "org.jboss.logging" : null,
+ "org.apache.aries.util" : null,
+ "org.jboss.osgi.webconsole" : null,
+ "org.osgi.compendium" : null,
+ "org.apache.felix.log" : {
+ "start" : "1"
+ },
+ "org.jboss.osgi.logging" : {
+ "start" : "1"
+ },
+ "org.apache.aries.jmx" : {
+ "start" : "2"
+ },
+ "org.apache.felix.configadmin" : {
+ "start" : "2"
+ },
+ "org.apache.felix.eventadmin" : {
+ "start" : "2"
+ },
+ "org.apache.felix.metatype" : {
+ "start" : "2"
+ },
+ "org.apache.felix.webconsole" : {
+ "start" : "2"
+ },
+ "org.jboss.as.osgi.configadmin" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.jmx" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.http" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.blueprint" : {
+ "start" : "3"
+ },
+ "org.jboss.osgi.webapp" : {
+ "start" : "3"
+ },
+ "org.jboss.osgi.xerces" : {
+ "start" : "3"
+ }
+ }
+ },
+ "messaging" : {
+ "acceptor" : {
+ "in-vm" : {
+ "type" : "InVM",
+ "server-id" : 0,
+ "param" : null
+ },
+ "netty" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging",
+ "param" : null
+ },
+ "netty-throughput" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging-throughput",
+ "param" : [ {
+ "batch-delay" : "50"
+ }, {
+ "direct-deliver" : "false"
+ } ]
+ }
+ },
+ "address-setting" : {
+ "#" : {
+ "dead-letter-address" : "jms.queue.DLQ",
+ "expiry-address" : "jms.queue.ExpiryQueue",
+ "redelivery-delay" : "0",
+ "max-size-bytes" : "10485760",
+ "message-counter-history-day-limit" : "10",
+ "address-full-policy" : "BLOCK"
+ }
+ },
+ "connector" : {
+ "in-vm" : {
+ "type" : "InVM",
+ "server-id" : 0,
+ "param" : null
+ },
+ "netty" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging",
+ "param" : null
+ },
+ "netty-throughput" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging-throughput",
+ "param" : [ {
+ "batch-delay" : "50"
+ } ]
+ }
+ },
+ "journal-min-files" : "2",
+ "journal-type" : "NIO",
+ "journal-file-size" : "102400",
+ "persistence-enabled" : false,
+ "security-setting" : {
+ "#" : {
+ "guest" : {
+ "send" : true,
+ "consume" : true,
+ "createDurableQueue" : false,
+ "deleteDurableQueue" : false,
+ "createNonDurableQueue" : true,
+ "deleteNonDurableQueue" : true,
+ "manage" : false
+ }
+ }
+ },
+ "queue" : null
+ },
+ "jaxrs" : {
+ },
+ "jms" : {
+ "connection-factory" : {
+ "InVmConnectionFactory" : {
+ "connector" : {
+ "in-vm" : {
+ "backup-connector-name" : "netty"
+ }
+ },
+ "entries" : [ "java:/ConnectionFactory" ]
+ },
+ "RemoteConnectionFactory" : {
+ "connector" : {
+ "netty" : {
+ "backup-connector-name" : "in-vm"
+ }
+ },
+ "entries" : [ "RemoteConnectionFactory" ]
+ }
+ },
+ "queue" : {
+ "testQueue" : {
+ "entries" : [ "queue/test" ]
+ }
+ },
+ "topic" : {
+ "testTopic" : {
+ "entries" : [ "topic/test" ]
+ }
+ }
+ },
+ "web" : {
+ "configuration" : null,
+ "connector" : {
+ "http" : {
+ "protocol" : "HTTP/1.1",
+ "socket-binding" : "http",
+ "scheme" : "http",
+ "virtual-server" : null,
+ "ssl" : null
+ }
+ },
+ "virtual-server" : {
+ "localhost" : {
+ "alias" : [ "example.com" ],
+ "access-log" : null,
+ "rewrite" : null,
+ "default-web-module" : null,
+ "enable-welcome-root" : false
+ }
+ }
+ },
+ "webservices" : {
+ "modify-wsdl-address" : true,
+ "wsdl-host" : "localhost",
+ "endpoint" : {
+ }
+ }
+ },
+ "interface" : {
+ "loopback" : {
+ "name" : "loopback",
+ "criteria" : [ {
+ "inet-address" : "127.0.0.1"
+ } ]
+ },
+ "external" : {
+ "name" : "external",
+ "criteria" : "any-ipv4-address"
+ },
+ "public" : {
+ "name" : "public",
+ "criteria" : "any-ipv4-address"
+ }
+ },
+ "socket-binding-group" : {
+ "standard-sockets" : {
+ "name" : "standard-sockets",
+ "default-interface" : "external",
+ "port-offset" : 0,
+ "socket-binding" : {
+ "jmx-connector-registry" : {
+ "name" : "jmx-connector-registry",
+ "interface" : null,
+ "port" : 1090,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "jmx-connector-server" : {
+ "name" : "jmx-connector-server",
+ "interface" : null,
+ "port" : 1091,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "jndi" : {
+ "name" : "jndi",
+ "interface" : null,
+ "port" : 1099,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "http" : {
+ "name" : "http",
+ "interface" : null,
+ "port" : 8080,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "https" : {
+ "name" : "https",
+ "interface" : null,
+ "port" : 8447,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "osgi-http" : {
+ "name" : "osgi-http",
+ "interface" : null,
+ "port" : 8090,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "remoting" : {
+ "name" : "remoting",
+ "interface" : null,
+ "port" : 4447,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "txn-recovery-environment" : {
+ "name" : "txn-recovery-environment",
+ "interface" : null,
+ "port" : 4712,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "txn-status-manager" : {
+ "name" : "txn-status-manager",
+ "interface" : null,
+ "port" : 4713,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "messaging" : {
+ "name" : "messaging",
+ "interface" : null,
+ "port" : 5445,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "messaging-throughput" : {
+ "name" : "messaging-throughput",
+ "interface" : null,
+ "port" : 5455,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ }
+ }
+ }
+ },
+ "deployment" : null
+ },
+ "server-two" : {
+ "namespaces" : [ {
+ "xsi" : "http://www.w3.org/2001/XMLSchema-instance"
+ } ],
+ "schema-locations" : [ {
+ "urn:jboss:domain:1.0" : "jboss_7_0.xsd"
+ }, {
+ "urn:jboss:domain:arquillian:1.0" : "jboss-arquillian.xsd"
+ }, {
+ "urn:jboss:domain:connector:1.0" : "jboss-connector.xsd"
+ }, {
+ "urn:jboss:domain:datasources:1.0" : "jboss-datasources.xsd"
+ }, {
+ "urn:jboss:domain:ejb3:1.0" : "jboss-ejb3.xsd"
+ }, {
+ "urn:jboss:domain:ee:1.0" : "jboss-ee.xsd"
+ }, {
+ "urn:jboss:domain:jaxrs:1.0" : "jboss-jaxrs.xsd"
+ }, {
+ "urn:jboss:domain:jmx:1.0" : "jboss-jmx.xsd"
+ }, {
+ "urn:jboss:domain:jpa:1.0" : "jboss-jpa.xsd"
+ }, {
+ "urn:jboss:domain:messaging:1.0" : "jboss-messaging.xsd"
+ }, {
+ "urn:jboss:domain:naming:1.0" : "jboss-naming.xsd"
+ }, {
+ "urn:jboss:domain:osgi:1.0" : "jboss-osgi.xsd"
+ }, {
+ "urn:jboss:domain:remoting:1.0" : "jboss-remoting.xsd"
+ }, {
+ "urn:jboss:domain:resourceadapters:1.0" : "jboss-resource-adapters.xsd"
+ }, {
+ "urn:jboss:domain:sar:1.0" : "jboss-sar.xsd"
+ }, {
+ "urn:jboss:domain:threads:1.0" : "jboss-threads.xsd"
+ }, {
+ "urn:jboss:domain:transactions:1.0" : "jboss-txn.xsd"
+ }, {
+ "urn:jboss:domain:web:1.0" : "jboss-web.xsd"
+ }, {
+ "urn:jboss:domain:security:1.0" : "jboss-security.xsd"
+ }, {
+ "urn:jboss:domain:webservices:1.0" : "jboss-webservices.xsd"
+ }, {
+ "urn:jboss:domain:weld:1.0" : "jboss-weld.xsd"
+ } ],
+ "name" : "server-two",
+ "management" : {
+ "security-realms" : {
+ "security-realm" : null
+ },
+ "connections" : {
+ "connection" : null
+ }
+ },
+ "management-interface" : null,
+ "profile-name" : null,
+ "extension" : {
+ "org.jboss.as.arquillian.service" : {
+ "module" : "org.jboss.as.arquillian.service"
+ },
+ "org.jboss.as.connector" : {
+ "module" : "org.jboss.as.connector"
+ },
+ "org.jboss.as.jmx" : {
+ "module" : "org.jboss.as.jmx"
+ },
+ "org.jboss.as.jpa" : {
+ "module" : "org.jboss.as.jpa"
+ },
+ "org.jboss.as.logging" : {
+ "module" : "org.jboss.as.logging"
+ },
+ "org.jboss.as.ee" : {
+ "module" : "org.jboss.as.ee"
+ },
+ "org.jboss.as.ejb3" : {
+ "module" : "org.jboss.as.ejb3"
+ },
+ "org.jboss.as.jaxrs" : {
+ "module" : "org.jboss.as.jaxrs"
+ },
+ "org.jboss.as.messaging" : {
+ "module" : "org.jboss.as.messaging"
+ },
+ "org.jboss.as.naming" : {
+ "module" : "org.jboss.as.naming"
+ },
+ "org.jboss.as.osgi" : {
+ "module" : "org.jboss.as.osgi"
+ },
+ "org.jboss.as.remoting" : {
+ "module" : "org.jboss.as.remoting"
+ },
+ "org.jboss.as.sar" : {
+ "module" : "org.jboss.as.sar"
+ },
+ "org.jboss.as.security" : {
+ "module" : "org.jboss.as.security"
+ },
+ "org.jboss.as.threads" : {
+ "module" : "org.jboss.as.threads"
+ },
+ "org.jboss.as.transactions" : {
+ "module" : "org.jboss.as.transactions"
+ },
+ "org.jboss.as.web" : {
+ "module" : "org.jboss.as.web"
+ },
+ "org.jboss.as.weld" : {
+ "module" : "org.jboss.as.weld"
+ },
+ "org.jboss.as.webservices" : {
+ "module" : "org.jboss.as.webservices"
+ }
+ },
+ "system-property" : {
+ "java.net.preferIPv4Stack" : {
+ "value" : "true"
+ }
+ },
+ "path" : null,
+ "subsystem" : {
+ "logging" : {
+ "logger" : {
+ },
+ "async-handler" : {
+ },
+ "console-handler" : {
+ "CONSOLE" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "queue-length" : null
+ }
+ },
+ "file-handler" : {
+ },
+ "periodic-rotating-file-handler" : {
+ "FILE" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "file" : {
+ "path" : "server.log",
+ "relative-to" : "jboss.server.log.dir"
+ },
+ "suffix" : ".yyyy-MM-dd"
+ }
+ },
+ "size-rotating-file-handler" : {
+ },
+ "root-logger" : {
+ "level" : "INFO",
+ "handlers" : [ "CONSOLE", "FILE" ]
+ }
+ },
+ "threads" : {
+ "bounded-queue-thread-pool" : {
+ "jca-short-running" : {
+ "name" : "jca-short-running",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "jca-long-running" : {
+ "name" : "jca-long-running",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "ejb3-async" : {
+ "name" : "ejb3-async",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ }
+ },
+ "queueless-thread-pool" : {
+ },
+ "scheduled-thread-pool" : {
+ "remoting" : {
+ "name" : "remoting",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ }
+ }
+ },
+ "thread-factory" : {
+ },
+ "unbounded-queue-thread-pool" : {
+ }
+ },
+ "arquillian" : {
+ },
+ "ee" : null,
+ "ejb3" : {
+ },
+ "naming" : {
+ },
+ "security" : {
+ "security-domain" : {
+ "other" : {
+ "authentication" : [ {
+ "code" : "UsersRoles",
+ "flag" : "required"
+ } ]
+ }
+ }
+ },
+ "transactions" : {
+ "core-environment" : {
+ "process-id" : {
+ "uuid" : "uuid"
+ },
+ "node-identifier" : null,
+ "relative-to" : null,
+ "path" : null
+ },
+ "recovery-environment" : {
+ "socket-binding" : "txn-recovery-environment",
+ "status-socket-binding" : "txn-status-manager"
+ },
+ "coordinator-environment" : {
+ "enable-statistics" : null,
+ "default-timeout" : null
+ },
+ "object-store" : {
+ "relative-to" : null,
+ "path" : null
+ }
+ },
+ "remoting" : {
+ "thread-pool" : "remoting",
+ "connector" : {
+ }
+ },
+ "jmx" : {
+ "server-binding" : "jmx-connector-server",
+ "registry-binding" : "jmx-connector-registry"
+ },
+ "jpa" : {
+ "default-datasource" : ""
+ },
+ "sar" : {
+ },
+ "weld" : {
+ },
+ "connector" : {
+ "default-workmanager-short-running-thread-pool" : "jca-short-running",
+ "default-workmanager-long-running-thread-pool" : "jca-long-running",
+ "bean-validation-enabled" : true,
+ "archive-validation-enabled" : true
+ },
+ "datasources" : {
+ "data-source" : {
+ "java:/H2DS" : {
+ "connection-url" : "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
+ "jndi-name" : "java:/H2DS",
+ "driver-name" : "h2",
+ "pool-name" : "H2DS",
+ "use-java-context" : true,
+ "enabled" : true,
+ "pool-prefill" : false,
+ "pool-use-strict-min" : false,
+ "user-name" : "sa",
+ "password" : "sa",
+ "background-validation" : false,
+ "use-fast-fail" : false,
+ "validate-on-match" : false
+ }
+ },
+ "xa-data-source" : null,
+ "jdbc-driver" : {
+ "h2" : {
+ "driver-name" : "h2",
+ "driver-module-name" : "com.h2database.h2",
+ "driver-xa-datasource-class-name" : "org.h2.jdbcx.JdbcDataSource"
+ }
+ }
+ },
+ "resource-adapters" : {
+ "resource-adapter" : null
+ },
+ "osgi" : {
+ "activation" : "lazy",
+ "configuration" : {
+ "pid" : "org.apache.felix.webconsole.internal.servlet.OsgiManager",
+ "configuration_properties" : {
+ "manager.root" : "jboss-osgi"
+ }
+ },
+ "properties" : {
+ "org.jboss.osgi.system.modules" : "org.apache.commons.logging,\n org.apache.log4j,\n org.jboss.as.osgi,\n org.slf4j,",
+ "org.osgi.framework.system.packages.extra" : "org.apache.commons.logging;version=1.1.1,\n org.apache.log4j;version=1.2,\n org.jboss.as.osgi.service;version=7.0,\n org.jboss.osgi.deployment.interceptor;version=1.0,\n org.jboss.osgi.spi.capability;version=1.0,\n org.jboss.osgi.spi.util;version=1.0,\n org.jboss.osgi.testing;version=1.0,\n org.jboss.osgi.vfs;version=1.0,\n org.slf4j;version=1.5.10,",
+ "org.osgi.framework.startlevel.beginning" : "1"
+ },
+ "modules" : {
+ "javaee.api" : null,
+ "org.jboss.as.arquillian.aggregate" : null,
+ "org.jboss.logging" : null,
+ "org.apache.aries.util" : null,
+ "org.jboss.osgi.webconsole" : null,
+ "org.osgi.compendium" : null,
+ "org.apache.felix.log" : {
+ "start" : "1"
+ },
+ "org.jboss.osgi.logging" : {
+ "start" : "1"
+ },
+ "org.apache.aries.jmx" : {
+ "start" : "2"
+ },
+ "org.apache.felix.configadmin" : {
+ "start" : "2"
+ },
+ "org.apache.felix.eventadmin" : {
+ "start" : "2"
+ },
+ "org.apache.felix.metatype" : {
+ "start" : "2"
+ },
+ "org.apache.felix.webconsole" : {
+ "start" : "2"
+ },
+ "org.jboss.as.osgi.configadmin" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.jmx" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.http" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.blueprint" : {
+ "start" : "3"
+ },
+ "org.jboss.osgi.webapp" : {
+ "start" : "3"
+ },
+ "org.jboss.osgi.xerces" : {
+ "start" : "3"
+ }
+ }
+ },
+ "messaging" : {
+ "acceptor" : {
+ "in-vm" : {
+ "type" : "InVM",
+ "server-id" : 0,
+ "param" : null
+ },
+ "netty" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging",
+ "param" : null
+ },
+ "netty-throughput" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging-throughput",
+ "param" : [ {
+ "batch-delay" : "50"
+ }, {
+ "direct-deliver" : "false"
+ } ]
+ }
+ },
+ "address-setting" : {
+ "#" : {
+ "dead-letter-address" : "jms.queue.DLQ",
+ "expiry-address" : "jms.queue.ExpiryQueue",
+ "redelivery-delay" : "0",
+ "max-size-bytes" : "10485760",
+ "message-counter-history-day-limit" : "10",
+ "address-full-policy" : "BLOCK"
+ }
+ },
+ "connector" : {
+ "in-vm" : {
+ "type" : "InVM",
+ "server-id" : 0,
+ "param" : null
+ },
+ "netty" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging",
+ "param" : null
+ },
+ "netty-throughput" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging-throughput",
+ "param" : [ {
+ "batch-delay" : "50"
+ } ]
+ }
+ },
+ "journal-min-files" : "2",
+ "journal-type" : "NIO",
+ "journal-file-size" : "102400",
+ "persistence-enabled" : false,
+ "security-setting" : {
+ "#" : {
+ "guest" : {
+ "send" : true,
+ "consume" : true,
+ "createDurableQueue" : false,
+ "deleteDurableQueue" : false,
+ "createNonDurableQueue" : true,
+ "deleteNonDurableQueue" : true,
+ "manage" : false
+ }
+ }
+ },
+ "queue" : null
+ },
+ "jaxrs" : {
+ },
+ "jms" : {
+ "connection-factory" : {
+ "InVmConnectionFactory" : {
+ "connector" : {
+ "in-vm" : {
+ "backup-connector-name" : "netty"
+ }
+ },
+ "entries" : [ "java:/ConnectionFactory" ]
+ },
+ "RemoteConnectionFactory" : {
+ "connector" : {
+ "netty" : {
+ "backup-connector-name" : "in-vm"
+ }
+ },
+ "entries" : [ "RemoteConnectionFactory" ]
+ }
+ },
+ "queue" : {
+ "testQueue" : {
+ "entries" : [ "queue/test" ]
+ }
+ },
+ "topic" : {
+ "testTopic" : {
+ "entries" : [ "topic/test" ]
+ }
+ }
+ },
+ "web" : {
+ "configuration" : null,
+ "connector" : {
+ "http" : {
+ "protocol" : "HTTP/1.1",
+ "socket-binding" : "http",
+ "scheme" : "http",
+ "virtual-server" : null,
+ "ssl" : null
+ }
+ },
+ "virtual-server" : {
+ "localhost" : {
+ "alias" : [ "example.com" ],
+ "access-log" : null,
+ "rewrite" : null,
+ "default-web-module" : null,
+ "enable-welcome-root" : false
+ }
+ }
+ },
+ "webservices" : {
+ "modify-wsdl-address" : true,
+ "wsdl-host" : "localhost",
+ "endpoint" : {
+ }
+ }
+ },
+ "interface" : {
+ "loopback" : {
+ "name" : "loopback",
+ "criteria" : [ {
+ "inet-address" : "127.0.0.1"
+ } ]
+ },
+ "external" : {
+ "name" : "external",
+ "criteria" : "any-ipv4-address"
+ },
+ "public" : {
+ "name" : "public",
+ "criteria" : "any-ipv4-address"
+ }
+ },
+ "socket-binding-group" : {
+ "standard-sockets" : {
+ "name" : "standard-sockets",
+ "default-interface" : "external",
+ "port-offset" : 150,
+ "socket-binding" : {
+ "jmx-connector-registry" : {
+ "name" : "jmx-connector-registry",
+ "interface" : null,
+ "port" : 1090,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "jmx-connector-server" : {
+ "name" : "jmx-connector-server",
+ "interface" : null,
+ "port" : 1091,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "jndi" : {
+ "name" : "jndi",
+ "interface" : null,
+ "port" : 1099,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "http" : {
+ "name" : "http",
+ "interface" : null,
+ "port" : 8080,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "https" : {
+ "name" : "https",
+ "interface" : null,
+ "port" : 8447,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "osgi-http" : {
+ "name" : "osgi-http",
+ "interface" : null,
+ "port" : 8090,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "remoting" : {
+ "name" : "remoting",
+ "interface" : null,
+ "port" : 4447,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "txn-recovery-environment" : {
+ "name" : "txn-recovery-environment",
+ "interface" : null,
+ "port" : 4712,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "txn-status-manager" : {
+ "name" : "txn-status-manager",
+ "interface" : null,
+ "port" : 4713,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "messaging" : {
+ "name" : "messaging",
+ "interface" : null,
+ "port" : 5445,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "messaging-throughput" : {
+ "name" : "messaging-throughput",
+ "interface" : null,
+ "port" : 5455,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ }
+ }
+ }
+ },
+ "deployment" : null
+ }
+ }
+ }
+ },
+ "namespaces" : [ {
+ "xsi" : "http://www.w3.org/2001/XMLSchema-instance"
+ } ],
+ "schema-locations" : [ {
+ "urn:jboss:domain:1.0" : "jboss_7_0.xsd"
+ }, {
+ "urn:jboss:domain:arquillian:1.0" : "jboss-arquillian.xsd"
+ }, {
+ "urn:jboss:domain:connector:1.0" : "jboss-connector.xsd"
+ }, {
+ "urn:jboss:domain:datasources:1.0" : "jboss-datasources.xsd"
+ }, {
+ "urn:jboss:domain:ejb3:1.0" : "jboss-ejb3.xsd"
+ }, {
+ "urn:jboss:domain:ee:1.0" : "jboss-ee.xsd"
+ }, {
+ "urn:jboss:domain:jaxrs:1.0" : "jboss-jaxrs.xsd"
+ }, {
+ "urn:jboss:domain:jmx:1.0" : "jboss-jmx.xsd"
+ }, {
+ "urn:jboss:domain:jpa:1.0" : "jboss-jpa.xsd"
+ }, {
+ "urn:jboss:domain:messaging:1.0" : "jboss-messaging.xsd"
+ }, {
+ "urn:jboss:domain:naming:1.0" : "jboss-naming.xsd"
+ }, {
+ "urn:jboss:domain:osgi:1.0" : "jboss-osgi.xsd"
+ }, {
+ "urn:jboss:domain:remoting:1.0" : "jboss-remoting.xsd"
+ }, {
+ "urn:jboss:domain:resourceadapters:1.0" : "jboss-resource-adapters.xsd"
+ }, {
+ "urn:jboss:domain:sar:1.0" : "jboss-sar.xsd"
+ }, {
+ "urn:jboss:domain:threads:1.0" : "jboss-threads.xsd"
+ }, {
+ "urn:jboss:domain:transactions:1.0" : "jboss-txn.xsd"
+ }, {
+ "urn:jboss:domain:web:1.0" : "jboss-web.xsd"
+ }, {
+ "urn:jboss:domain:security:1.0" : "jboss-security.xsd"
+ }, {
+ "urn:jboss:domain:webservices:1.0" : "jboss-webservices.xsd"
+ }, {
+ "urn:jboss:domain:weld:1.0" : "jboss-weld.xsd"
+ } ],
+ "extension" : {
+ "org.jboss.as.arquillian.service" : {
+ "module" : "org.jboss.as.arquillian.service"
+ },
+ "org.jboss.as.connector" : {
+ "module" : "org.jboss.as.connector"
+ },
+ "org.jboss.as.jmx" : {
+ "module" : "org.jboss.as.jmx"
+ },
+ "org.jboss.as.jpa" : {
+ "module" : "org.jboss.as.jpa"
+ },
+ "org.jboss.as.logging" : {
+ "module" : "org.jboss.as.logging"
+ },
+ "org.jboss.as.ee" : {
+ "module" : "org.jboss.as.ee"
+ },
+ "org.jboss.as.ejb3" : {
+ "module" : "org.jboss.as.ejb3"
+ },
+ "org.jboss.as.jaxrs" : {
+ "module" : "org.jboss.as.jaxrs"
+ },
+ "org.jboss.as.messaging" : {
+ "module" : "org.jboss.as.messaging"
+ },
+ "org.jboss.as.naming" : {
+ "module" : "org.jboss.as.naming"
+ },
+ "org.jboss.as.osgi" : {
+ "module" : "org.jboss.as.osgi"
+ },
+ "org.jboss.as.remoting" : {
+ "module" : "org.jboss.as.remoting"
+ },
+ "org.jboss.as.sar" : {
+ "module" : "org.jboss.as.sar"
+ },
+ "org.jboss.as.security" : {
+ "module" : "org.jboss.as.security"
+ },
+ "org.jboss.as.threads" : {
+ "module" : "org.jboss.as.threads"
+ },
+ "org.jboss.as.transactions" : {
+ "module" : "org.jboss.as.transactions"
+ },
+ "org.jboss.as.web" : {
+ "module" : "org.jboss.as.web"
+ },
+ "org.jboss.as.weld" : {
+ "module" : "org.jboss.as.weld"
+ },
+ "org.jboss.as.webservices" : {
+ "module" : "org.jboss.as.webservices"
+ }
+ },
+ "path" : null,
+ "system-property" : {
+ "java.net.preferIPv4Stack" : {
+ "value" : "true",
+ "boot-time" : true
+ }
+ },
+ "profile" : {
+ "default" : {
+ "includes" : null,
+ "subsystem" : {
+ "logging" : {
+ "logger" : {
+ },
+ "async-handler" : {
+ },
+ "console-handler" : {
+ "CONSOLE" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "queue-length" : null
+ }
+ },
+ "file-handler" : {
+ },
+ "periodic-rotating-file-handler" : {
+ "FILE" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "file" : {
+ "path" : "server.log",
+ "relative-to" : "jboss.server.log.dir"
+ },
+ "suffix" : ".yyyy-MM-dd"
+ }
+ },
+ "size-rotating-file-handler" : {
+ },
+ "root-logger" : {
+ "level" : "INFO",
+ "handlers" : [ "CONSOLE", "FILE" ]
+ }
+ },
+ "threads" : {
+ "bounded-queue-thread-pool" : {
+ "jca-short-running" : {
+ "name" : "jca-short-running",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "jca-long-running" : {
+ "name" : "jca-long-running",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "ejb3-async" : {
+ "name" : "ejb3-async",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ }
+ },
+ "queueless-thread-pool" : {
+ },
+ "scheduled-thread-pool" : {
+ "remoting" : {
+ "name" : "remoting",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ }
+ }
+ },
+ "thread-factory" : {
+ },
+ "unbounded-queue-thread-pool" : {
+ }
+ },
+ "arquillian" : {
+ },
+ "ee" : null,
+ "ejb3" : {
+ },
+ "naming" : {
+ },
+ "security" : {
+ "security-domain" : {
+ "other" : {
+ "authentication" : [ {
+ "code" : "UsersRoles",
+ "flag" : "required"
+ } ]
+ }
+ }
+ },
+ "transactions" : {
+ "core-environment" : {
+ "process-id" : {
+ "uuid" : "uuid"
+ },
+ "node-identifier" : null,
+ "relative-to" : null,
+ "path" : null
+ },
+ "recovery-environment" : {
+ "socket-binding" : "txn-recovery-environment",
+ "status-socket-binding" : "txn-status-manager"
+ },
+ "coordinator-environment" : {
+ "enable-statistics" : null,
+ "default-timeout" : null
+ },
+ "object-store" : {
+ "relative-to" : null,
+ "path" : null
+ }
+ },
+ "remoting" : {
+ "thread-pool" : "remoting",
+ "connector" : {
+ }
+ },
+ "jmx" : {
+ "server-binding" : "jmx-connector-server",
+ "registry-binding" : "jmx-connector-registry"
+ },
+ "jpa" : {
+ "default-datasource" : ""
+ },
+ "sar" : {
+ },
+ "weld" : {
+ },
+ "connector" : {
+ "default-workmanager-short-running-thread-pool" : "jca-short-running",
+ "default-workmanager-long-running-thread-pool" : "jca-long-running",
+ "bean-validation-enabled" : true,
+ "archive-validation-enabled" : true
+ },
+ "datasources" : {
+ "data-source" : {
+ "java:/H2DS" : {
+ "connection-url" : "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
+ "jndi-name" : "java:/H2DS",
+ "driver-name" : "h2",
+ "pool-name" : "H2DS",
+ "use-java-context" : true,
+ "enabled" : true,
+ "pool-prefill" : false,
+ "pool-use-strict-min" : false,
+ "user-name" : "sa",
+ "password" : "sa",
+ "background-validation" : false,
+ "use-fast-fail" : false,
+ "validate-on-match" : false
+ }
+ },
+ "xa-data-source" : null,
+ "jdbc-driver" : {
+ "h2" : {
+ "driver-name" : "h2",
+ "driver-module-name" : "com.h2database.h2",
+ "driver-xa-datasource-class-name" : "org.h2.jdbcx.JdbcDataSource"
+ }
+ }
+ },
+ "resource-adapters" : {
+ "resource-adapter" : null
+ },
+ "osgi" : {
+ "activation" : "lazy",
+ "configuration" : {
+ "pid" : "org.apache.felix.webconsole.internal.servlet.OsgiManager",
+ "configuration_properties" : {
+ "manager.root" : "jboss-osgi"
+ }
+ },
+ "properties" : {
+ "org.jboss.osgi.system.modules" : "org.apache.commons.logging,\n org.apache.log4j,\n org.jboss.as.osgi,\n org.slf4j,",
+ "org.osgi.framework.system.packages.extra" : "org.apache.commons.logging;version=1.1.1,\n org.apache.log4j;version=1.2,\n org.jboss.as.osgi.service;version=7.0,\n org.jboss.osgi.deployment.interceptor;version=1.0,\n org.jboss.osgi.spi.capability;version=1.0,\n org.jboss.osgi.spi.util;version=1.0,\n org.jboss.osgi.testing;version=1.0,\n org.jboss.osgi.vfs;version=1.0,\n org.slf4j;version=1.5.10,",
+ "org.osgi.framework.startlevel.beginning" : "1"
+ },
+ "modules" : {
+ "javaee.api" : null,
+ "org.jboss.as.arquillian.aggregate" : null,
+ "org.jboss.logging" : null,
+ "org.apache.aries.util" : null,
+ "org.jboss.osgi.webconsole" : null,
+ "org.osgi.compendium" : null,
+ "org.apache.felix.log" : {
+ "start" : "1"
+ },
+ "org.jboss.osgi.logging" : {
+ "start" : "1"
+ },
+ "org.apache.aries.jmx" : {
+ "start" : "2"
+ },
+ "org.apache.felix.configadmin" : {
+ "start" : "2"
+ },
+ "org.apache.felix.eventadmin" : {
+ "start" : "2"
+ },
+ "org.apache.felix.metatype" : {
+ "start" : "2"
+ },
+ "org.apache.felix.webconsole" : {
+ "start" : "2"
+ },
+ "org.jboss.as.osgi.configadmin" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.jmx" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.http" : {
+ "start" : "2"
+ },
+ "org.jboss.osgi.blueprint" : {
+ "start" : "3"
+ },
+ "org.jboss.osgi.webapp" : {
+ "start" : "3"
+ },
+ "org.jboss.osgi.xerces" : {
+ "start" : "3"
+ }
+ }
+ },
+ "messaging" : {
+ "acceptor" : {
+ "in-vm" : {
+ "type" : "InVM",
+ "server-id" : 0,
+ "param" : null
+ },
+ "netty" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging",
+ "param" : null
+ },
+ "netty-throughput" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging-throughput",
+ "param" : [ {
+ "batch-delay" : "50"
+ }, {
+ "direct-deliver" : "false"
+ } ]
+ }
+ },
+ "address-setting" : {
+ "#" : {
+ "dead-letter-address" : "jms.queue.DLQ",
+ "expiry-address" : "jms.queue.ExpiryQueue",
+ "redelivery-delay" : "0",
+ "max-size-bytes" : "10485760",
+ "message-counter-history-day-limit" : "10",
+ "address-full-policy" : "BLOCK"
+ }
+ },
+ "connector" : {
+ "in-vm" : {
+ "type" : "InVM",
+ "server-id" : 0,
+ "param" : null
+ },
+ "netty" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging",
+ "param" : null
+ },
+ "netty-throughput" : {
+ "type" : "Remote",
+ "socket-binding" : "messaging-throughput",
+ "param" : [ {
+ "batch-delay" : "50"
+ } ]
+ }
+ },
+ "journal-min-files" : "2",
+ "journal-type" : "NIO",
+ "journal-file-size" : "102400",
+ "persistence-enabled" : false,
+ "security-setting" : {
+ "#" : {
+ "guest" : {
+ "send" : true,
+ "consume" : true,
+ "createDurableQueue" : false,
+ "deleteDurableQueue" : false,
+ "createNonDurableQueue" : true,
+ "deleteNonDurableQueue" : true,
+ "manage" : false
+ }
+ }
+ },
+ "queue" : null
+ },
+ "jaxrs" : {
+ },
+ "jms" : {
+ "connection-factory" : {
+ "InVmConnectionFactory" : {
+ "connector" : {
+ "in-vm" : {
+ "backup-connector-name" : "netty"
+ }
+ },
+ "entries" : [ "java:/ConnectionFactory" ]
+ },
+ "RemoteConnectionFactory" : {
+ "connector" : {
+ "netty" : {
+ "backup-connector-name" : "in-vm"
+ }
+ },
+ "entries" : [ "RemoteConnectionFactory" ]
+ }
+ },
+ "queue" : {
+ "testQueue" : {
+ "entries" : [ "queue/test" ]
+ }
+ },
+ "topic" : {
+ "testTopic" : {
+ "entries" : [ "topic/test" ]
+ }
+ }
+ },
+ "web" : {
+ "configuration" : null,
+ "connector" : {
+ "http" : {
+ "protocol" : "HTTP/1.1",
+ "socket-binding" : "http",
+ "scheme" : "http",
+ "virtual-server" : null,
+ "ssl" : null
+ }
+ },
+ "virtual-server" : {
+ "localhost" : {
+ "alias" : [ "example.com" ],
+ "access-log" : null,
+ "rewrite" : null,
+ "default-web-module" : null,
+ "enable-welcome-root" : false
+ }
+ }
+ },
+ "webservices" : {
+ "modify-wsdl-address" : true,
+ "wsdl-host" : "localhost",
+ "endpoint" : {
+ }
+ }
+ }
+ }
+ },
+ "interface" : {
+ "loopback" : {
+ "name" : "loopback",
+ "criteria" : [ {
+ "inet-address" : "127.0.0.1"
+ } ]
+ },
+ "external" : {
+ "name" : "external",
+ "criteria" : "any-ipv4-address"
+ }
+ },
+ "socket-binding-group" : {
+ "standard-sockets" : {
+ "name" : "standard-sockets",
+ "default-interface" : "external",
+ "includes" : [ "messaging-sockets" ],
+ "socket-binding" : {
+ "jmx-connector-registry" : {
+ "name" : "jmx-connector-registry",
+ "interface" : null,
+ "port" : 1090,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "jmx-connector-server" : {
+ "name" : "jmx-connector-server",
+ "interface" : null,
+ "port" : 1091,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "jndi" : {
+ "name" : "jndi",
+ "interface" : null,
+ "port" : 1099,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "http" : {
+ "name" : "http",
+ "interface" : null,
+ "port" : 8080,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "https" : {
+ "name" : "https",
+ "interface" : null,
+ "port" : 8447,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "osgi-http" : {
+ "name" : "osgi-http",
+ "interface" : null,
+ "port" : 8090,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "remoting" : {
+ "name" : "remoting",
+ "interface" : null,
+ "port" : 4447,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "txn-recovery-environment" : {
+ "name" : "txn-recovery-environment",
+ "interface" : null,
+ "port" : 4712,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "txn-status-manager" : {
+ "name" : "txn-status-manager",
+ "interface" : null,
+ "port" : 4713,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ }
+ }
+ },
+ "messaging-sockets" : {
+ "name" : "messaging-sockets",
+ "default-interface" : "external",
+ "includes" : [ ],
+ "socket-binding" : {
+ "messaging" : {
+ "name" : "messaging",
+ "interface" : null,
+ "port" : 5445,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ },
+ "messaging-throughput" : {
+ "name" : "messaging-throughput",
+ "interface" : null,
+ "port" : 5455,
+ "fixed-port" : null,
+ "multicast-address" : null,
+ "multicast-port" : null
+ }
+ }
+ }
+ },
+ "deployment" : null,
+ "server-group" : {
+ "main-server-group" : {
+ "profile" : "default",
+ "jvm" : {
+ "default" : {
+ "type" : null,
+ "agent-lib" : null,
+ "agent-path" : null,
+ "env-classpath-ignored" : null,
+ "environment-variables" : null,
+ "heap-size" : "64m",
+ "max-heap-size" : "512m",
+ "java-agent" : null,
+ "java-home" : null,
+ "jvm-options" : null,
+ "permgen-size" : null,
+ "max-permgen-size" : null,
+ "stack-size" : null
+ }
+ },
+ "system-property" : null,
+ "deployment" : null,
+ "socket-binding-group" : "standard-sockets"
+ },
+ "other-server-group" : {
+ "profile" : "default",
+ "jvm" : {
+ "default" : {
+ "type" : null,
+ "agent-lib" : null,
+ "agent-path" : null,
+ "env-classpath-ignored" : null,
+ "environment-variables" : null,
+ "heap-size" : "64m",
+ "max-heap-size" : "512m",
+ "java-agent" : null,
+ "java-home" : null,
+ "jvm-options" : null,
+ "permgen-size" : null,
+ "max-permgen-size" : null,
+ "stack-size" : null
+ }
+ },
+ "system-property" : null,
+ "deployment" : null,
+ "socket-binding-group" : "standard-sockets"
+ }
+ }
+ },
+ "compensating-operation" : null
+}
diff --git a/modules/plugins/jboss-as-7/src/test/resources/extensions.json b/modules/plugins/jboss-as-7/src/test/resources/extensions.json
new file mode 100644
index 0000000..0ba5ccd
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/extensions.json
@@ -0,0 +1,93 @@
+{
+ "outcome" : "success",
+ "result" : [ {
+ "org.jboss.as.arquillian.service" : {
+ "module" : "org.jboss.as.arquillian.service"
+ }
+ }, {
+ "org.jboss.as.clustering" : {
+ "module" : "org.jboss.as.clustering"
+ }
+ }, {
+ "org.jboss.as.connector" : {
+ "module" : "org.jboss.as.connector"
+ }
+ }, {
+ "org.jboss.as.deployment-scanner" : {
+ "module" : "org.jboss.as.deployment-scanner"
+ }
+ }, {
+ "org.jboss.as.ee" : {
+ "module" : "org.jboss.as.ee"
+ }
+ }, {
+ "org.jboss.as.ejb3" : {
+ "module" : "org.jboss.as.ejb3"
+ }
+ }, {
+ "org.jboss.as.jaxrs" : {
+ "module" : "org.jboss.as.jaxrs"
+ }
+ }, {
+ "org.jboss.as.jmx" : {
+ "module" : "org.jboss.as.jmx"
+ }
+ }, {
+ "org.jboss.as.jpa" : {
+ "module" : "org.jboss.as.jpa"
+ }
+ }, {
+ "org.jboss.as.logging" : {
+ "module" : "org.jboss.as.logging"
+ }
+ }, {
+ "org.jboss.as.messaging" : {
+ "module" : "org.jboss.as.messaging"
+ }
+ }, {
+ "org.jboss.as.modcluster" : {
+ "module" : "org.jboss.as.modcluster"
+ }
+ }, {
+ "org.jboss.as.naming" : {
+ "module" : "org.jboss.as.naming"
+ }
+ }, {
+ "org.jboss.as.osgi" : {
+ "module" : "org.jboss.as.osgi"
+ }
+ }, {
+ "org.jboss.as.remoting" : {
+ "module" : "org.jboss.as.remoting"
+ }
+ }, {
+ "org.jboss.as.sar" : {
+ "module" : "org.jboss.as.sar"
+ }
+ }, {
+ "org.jboss.as.security" : {
+ "module" : "org.jboss.as.security"
+ }
+ }, {
+ "org.jboss.as.threads" : {
+ "module" : "org.jboss.as.threads"
+ }
+ }, {
+ "org.jboss.as.transactions" : {
+ "module" : "org.jboss.as.transactions"
+ }
+ }, {
+ "org.jboss.as.web" : {
+ "module" : "org.jboss.as.web"
+ }
+ }, {
+ "org.jboss.as.webservices" : {
+ "module" : "org.jboss.as.webservices"
+ }
+ }, {
+ "org.jboss.as.weld" : {
+ "module" : "org.jboss.as.weld"
+ }
+ } ],
+ "compensating-operation" : null
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/interfaces.json b/modules/plugins/jboss-as-7/src/test/resources/interfaces.json
new file mode 100644
index 0000000..d7d8461
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/interfaces.json
@@ -0,0 +1,8 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "name" : "public",
+ "criteria" : "any-ipv4-address"
+ },
+ "compensating-operation" : null
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/logging.json b/modules/plugins/jboss-as-7/src/test/resources/logging.json
new file mode 100644
index 0000000..aac32df
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/logging.json
@@ -0,0 +1,15 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "autoflush" : true,
+ "encoding" : null,
+ "formatter" : "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
+ "level" : "INFO",
+ "file" : {
+ "path" : "server.log",
+ "relative-to" : "jboss.server.log.dir"
+ },
+ "suffix" : ".yyyy-MM-dd"
+ },
+ "compensating-operation" : null
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/loopback.json b/modules/plugins/jboss-as-7/src/test/resources/loopback.json
new file mode 100644
index 0000000..4aec543
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/loopback.json
@@ -0,0 +1,10 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "name" : "default",
+ "criteria" : [ {
+ "inet-address" : "127.0.0.1"
+ } ]
+ },
+ "compensating-operation" : null
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/schema-locations.json b/modules/plugins/jboss-as-7/src/test/resources/schema-locations.json
new file mode 100644
index 0000000..e9bf229
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/schema-locations.json
@@ -0,0 +1,50 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "schema-locations" : [
+ {
+ "urn:jboss:domain:1.0" : "jboss_7_0.xsd"
+ }, {
+ "urn:jboss:domain:arquillian:1.0" : "jboss-arquillian.xsd"
+ }, {
+ "urn:jboss:domain:connector:1.0" : "jboss-connector.xsd"
+ }, {
+ "urn:jboss:domain:datasources:1.0" : "jboss-datasources.xsd"
+ }, {
+ "urn:jboss:domain:ejb3:1.0" : "jboss-ejb3.xsd"
+ }, {
+ "urn:jboss:domain:ee:1.0" : "jboss-ee.xsd"
+ }, {
+ "urn:jboss:domain:jaxrs:1.0" : "jboss-jaxrs.xsd"
+ }, {
+ "urn:jboss:domain:jmx:1.0" : "jboss-jmx.xsd"
+ }, {
+ "urn:jboss:domain:jpa:1.0" : "jboss-jpa.xsd"
+ }, {
+ "urn:jboss:domain:messaging:1.0" : "jboss-messaging.xsd"
+ }, {
+ "urn:jboss:domain:naming:1.0" : "jboss-naming.xsd"
+ }, {
+ "urn:jboss:domain:osgi:1.0" : "jboss-osgi.xsd"
+ }, {
+ "urn:jboss:domain:remoting:1.0" : "jboss-remoting.xsd"
+ }, {
+ "urn:jboss:domain:resourceadapters:1.0" : "jboss-resource-adapters.xsd"
+ }, {
+ "urn:jboss:domain:sar:1.0" : "jboss-sar.xsd"
+ }, {
+ "urn:jboss:domain:threads:1.0" : "jboss-threads.xsd"
+ }, {
+ "urn:jboss:domain:transactions:1.0" : "jboss-txn.xsd"
+ }, {
+ "urn:jboss:domain:web:1.0" : "jboss-web.xsd"
+ }, {
+ "urn:jboss:domain:security:1.0" : "jboss-security.xsd"
+ }, {
+ "urn:jboss:domain:webservices:1.0" : "jboss-webservices.xsd"
+ }, {
+ "urn:jboss:domain:weld:1.0" : "jboss-weld.xsd"
+ } ]
+ },
+ "compensating-operation" : null
+}
diff --git a/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml b/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
index 4d3a106..fb06f1b 100644
--- a/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
@@ -30,4 +30,63 @@
</server>
+ <server class="foo" discovery="foo" name="test4">
+ <resource-configuration>
+ <c:group name="children:extension" displayName="Installed extensions">
+
+ <c:list-property name="extension" displayName="Installed extensions">
+ <c:map-property name="name">
+ <c:map-property name="*">
+ <c:simple-property name="module"/>
+ </c:map-property>
+ </c:map-property>
+ </c:list-property>
+ </c:group>
+ </resource-configuration>
+ </server>
+
+ <server class="foo" discovery="foo" name="test5">
+ <resource-configuration>
+ <c:group name="attribute:schema-locations" displayName="Schema-locations">
+
+ <c:list-property name="schema-locations" displayName="Schema locations">
+ <c:map-property name="*">
+ <c:simple-property name="*" readOnly="true"/>
+ <!--<c:simple-property name="location" readOnly="true"/>-->
+ </c:map-property>
+ </c:list-property>
+ </c:group>
+ </resource-configuration>
+ </server>
+
+ <server class="foo" discovery="foo" name="test6and7">
+ <resource-configuration>
+
+ <c:simple-property name="name" />
+ <c:simple-property name="criteria"/>
+
+ </resource-configuration>
+ </server>
+
+ <server class="foo" discovery="foo" name="test8">
+ <resource-configuration>
+ <c:simple-property name="default-workmanager-short-running-thread-pool" required="true" type="string" readOnly="true"
+ description="Specify the name of short running thread pool"/>
+ <c:simple-property name="default-workmanager-long-running-thread-pool" required="true" type="string" readOnly="true"
+ description="Specify the name of long running thread pool"/>
+ <c:simple-property name="bean-validation-enabled" required="true" type="boolean" readOnly="true"
+ description="Specify whether bean validation is enabled"/>
+ <c:simple-property name="archive-validation-enabled" type="boolean" readOnly="true" description="Enabling the validation"/>
+ <c:simple-property name="archive-validation-fail-on-error" type="boolean" readOnly="true" defaultValue="true"
+ description="Should an archive validation error report fail the deployment. Default: true"/>
+ <c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true" defaultValue="false"
+ description="Should an archive validation warning report fail the deployment. Default: false"/>
+ <c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true" defaultValue="false"
+ description="enable/disable debug information logging for cached connection manager"/>
+ <c:simple-property name="cached-connection-manager-error" type="boolean" readOnly="true" defaultValue="false"
+ description="enable/disable error information logging for cached connection manager"/>
+ </resource-configuration>
+
+ </server>
+
</plugin>
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/test/resources/threadpool.json b/modules/plugins/jboss-as-7/src/test/resources/threadpool.json
new file mode 100644
index 0000000..8107e9a
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/threadpool.json
@@ -0,0 +1,25 @@
+{
+ "outcome" : "success",
+ "result" : {
+ "name" : "ejb3-async",
+ "max-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "keepalive-time" : {
+ "time" : 10,
+ "unit" : "SECONDS"
+ },
+ "blocking" : true,
+ "allow-core-timeout" : false,
+ "queue-length" : {
+ "count" : 10,
+ "per-cpu" : 20
+ },
+ "core-threads" : {
+ "count" : 10,
+ "per-cpu" : 20
+ }
+ },
+ "compensating-operation" : null
+}
\ No newline at end of file
commit b349cdfe6aae9b8e25a466956d607b9bb901c2b7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 30 13:27:11 2011 +0200
Start adding unit tests for the configuration reading.
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index 7593f18..8611a15 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -218,6 +218,12 @@
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <version>${testng.version}</version>
+ <scope>test</scope>
+ </dependency>
<!-- TODO add your dependencies here -->
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 6cbe91b..c51f275 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -31,6 +31,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
@@ -46,6 +47,7 @@ public class ASConnection {
URL url;
String urlString;
private ObjectMapper mapper;
+ boolean verbose = true; // This is a variable on purpose, so devs can switch it on in the debugger
public ASConnection(String host, int port) {
@@ -74,7 +76,6 @@ public class ASConnection {
JsonNode reasonNode = in.findValue("failure-description");
String reason = reasonNode.getTextValue();
-// log.info(reason);
return true;
}
@@ -105,8 +106,10 @@ public class ASConnection {
OutputStream out = conn.getOutputStream();
String result = mapper.writeValueAsString(operation);
- System.out.println("Json to send: " + result);
- System.out.flush();
+ if (verbose) {
+ System.out.println("Json to send: " + result);
+ System.out.flush();
+ }
mapper.writeValue(out, operation);
out.flush();
@@ -134,6 +137,13 @@ public class ASConnection {
if (builder !=null) {
outcome= builder.toString();
operationResult = mapper.readTree(outcome);
+ if (verbose) {
+ ObjectMapper om2 = new ObjectMapper();
+ om2.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
+ String tmp = om2.writeValueAsString(operationResult);
+ System.out.println(tmp);
+ System.out.flush();
+ }
}
else {
outcome="- no response from server -";
@@ -146,6 +156,8 @@ public class ASConnection {
}
else {
log.error("IS was null and code was " + responseCode);
+ if (verbose)
+ System.err.println("IS was null and code was " + responseCode);
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 2911e85..779e733 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -209,7 +210,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
List<PROPERTY_VALUE> address = pathToAddress(path);
- ConfigurationDelegate delegate = new ConfigurationDelegate(context,connection,address);
+ ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
+ ConfigurationDelegate delegate = new ConfigurationDelegate(configDef,connection,address);
return delegate.loadResourceConfiguration();
}
@@ -217,7 +219,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
List<PROPERTY_VALUE> address = pathToAddress(path);
- ConfigurationDelegate delegate = new ConfigurationDelegate(context,connection,address);
+ ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
+ ConfigurationDelegate delegate = new ConfigurationDelegate(configDef,connection,address);
delegate.updateResourceConfiguration(report);
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
index 832fd11..93f4c6e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
@@ -42,7 +42,6 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
-import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
@@ -51,18 +50,17 @@ import org.rhq.modules.plugins.jbossas7.json.ReadResource;
public class ConfigurationDelegate implements ConfigurationFacet {
final Log log = LogFactory.getLog(this.getClass());
- ResourceContext context;
private List<PROPERTY_VALUE> address;
private ASConnection connection;
+ private ConfigurationDefinition configurationDefinition;
- public ConfigurationDelegate(ResourceContext context,ASConnection connection, List<PROPERTY_VALUE> address) {
- this.context = context;
+ public ConfigurationDelegate(ConfigurationDefinition configDef,ASConnection connection, List<PROPERTY_VALUE> address) {
+ this.configurationDefinition = configDef;
this.connection = connection;
this.address = address;
}
public Configuration loadResourceConfiguration() throws Exception {
- ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
Operation op = new ReadResource(address); // TODO set recursive flag? --> try to narrow it down
@@ -72,13 +70,14 @@ public class ConfigurationDelegate implements ConfigurationFacet {
Configuration ret = new Configuration();
ObjectMapper mapper = new ObjectMapper();
- Set<Map.Entry<String, PropertyDefinition>> entrySet = configDef.getPropertyDefinitions().entrySet();
+ Set<Map.Entry<String, PropertyDefinition>> entrySet = configurationDefinition.getPropertyDefinitions().entrySet();
for (Map.Entry<String, PropertyDefinition> propDefEntry : entrySet) {
PropertyDefinition propDef = propDefEntry.getValue();
JsonNode sub = json.findValue(propDef.getName());
if (sub == null) {
- log.error(
- "No value for property [" + propDef.getName() + "] found - check the descriptor");
+ log.warn(
+ "No value for property [" + propDef.getName() + "] found - check the descriptor (may be valid, \n"+
+ "as some attributes are different in domain vs standalone mode");
continue;
}
if (propDef instanceof PropertyDefinitionSimple) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
index c7a983e..a5583b7 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
@@ -31,6 +31,7 @@ import org.codehaus.jackson.annotate.JsonProperty;
*/
public class Result {
+ public static final String SUCCESS = "success";
private String outcome;
private Object result;
@JsonProperty("compensating-operation")
@@ -50,7 +51,7 @@ public class Result {
public void setOutcome(String outcome) {
this.outcome = outcome;
- if (outcome.equalsIgnoreCase("success"))
+ if (outcome.equalsIgnoreCase(SUCCESS))
success = true;
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java
new file mode 100644
index 0000000..afd6a7f
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/ConfigurationTest.java
@@ -0,0 +1,320 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+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.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+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.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
+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.PropertySimpleType;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+
+/**
+ * Tests loading and writing configurations
+ * @author Heiko W. Rupp
+ */
+@Test
+public class ConfigurationTest {
+
+ private static final String DESCRIPTOR_FILENAME = "test-plugin.xml";
+ private Log log = LogFactory.getLog(getClass());
+
+ private PluginDescriptor pluginDescriptor;
+
+
+
+ public void test1() throws Exception {
+ FakeConnection connection = new FakeConnection();
+
+ ConfigurationDefinition definition = new ConfigurationDefinition("foo","Test1");
+
+
+ definition.setConfigurationFormat(ConfigurationFormat.STRUCTURED);
+ definition.put(new PropertyDefinitionSimple("access-log", "Access-Log", false,
+ PropertySimpleType.STRING));
+ definition.put(new PropertyDefinitionSimple("rewrite", "Rewrite", false,
+ PropertySimpleType.STRING));
+ definition.put(new PropertyDefinitionSimple("notThere", "NotThere", false,
+ PropertySimpleType.STRING));
+
+ definition.put(new PropertyDefinitionList("alias", "Alias", true, new PropertyDefinitionSimple(
+ "alias", "alias", true, PropertySimpleType.STRING)));
+
+
+
+ String resultString = " {\"outcome\" : \"success\", \"result\" : {\"alias\" : [\"example.com\",\"example2.com\"],"+
+ " \"access-log\" : null, \"rewrite\" : null}, \"compensating-operation\" : null}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+ assert config.get("alias")!=null;
+ assert config.get("alias") instanceof PropertyList;
+ PropertyList aliases = (PropertyList) config.get("alias");
+ List<Property> list = aliases.getList();
+ assert list.size()==2;
+ assert config.get("notThere")==null;
+ }
+
+ public void test2() throws Exception {
+ String resultString = "{\n" +
+ " \"outcome\" : \"success\",\n" +
+ " \"result\" : {\n" +
+ " \"autoflush\" : true,\n" +
+ " \"encoding\" : null,\n" +
+ " \"formatter\" : \"%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n\",\n" +
+ " \"level\" : \"INFO\",\n" +
+ " \"file\" : {\n" +
+ " \"path\" : \"server.log\",\n" +
+ " \"relative-to\" : \"jboss.server.log.dir\"\n" +
+ " },\n" +
+ " \"suffix\" : \".yyyy-MM-dd\"\n" +
+ " },\n" +
+ " \"compensating-operation\" : null\n" +
+ "}";
+
+ FakeConnection connection = new FakeConnection();
+
+ ConfigurationDefinition definition = new ConfigurationDefinition("foo","Test1");
+
+ PropertyDefinitionSimple propertyDefinition = new PropertyDefinitionSimple("autoflush", "Autoflush", false,
+ PropertySimpleType.BOOLEAN);
+ propertyDefinition.setDefaultValue("true");
+ definition.put(propertyDefinition);
+ propertyDefinition = new PropertyDefinitionSimple("encoding", "Encoding", false,
+ PropertySimpleType.STRING);
+ propertyDefinition.setDefaultValue("HelloWorld");
+ definition.put(propertyDefinition);
+ PropertyDefinitionSimple pathProperty = new PropertyDefinitionSimple("path","File path",true,PropertySimpleType.STRING);
+ PropertyDefinitionSimple relativeToProperty = new PropertyDefinitionSimple("relative-to","Relative-To",true,PropertySimpleType.STRING);
+ PropertyDefinitionMap fileMapDef = new PropertyDefinitionMap("file","Log file",true,pathProperty,relativeToProperty);
+ definition.put(fileMapDef);
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+ assert config!=null;
+ assert config.get("autoflush")!=null : "Autoflush was null";
+ assert config.getSimple("autoflush").getBooleanValue() : "Autoflush was false";
+ PropertyMap fileMap = (PropertyMap) config.get("file");
+ assert fileMap!=null : "File Map was null";
+ PropertySimple path = (PropertySimple) fileMap.get("path");
+ assert path!=null : "File->path was null";
+ assert path.getStringValue().equals("server.log") : "File->path wrong";
+
+
+ }
+
+
+ public void test3() throws Exception {
+
+ String resultString = "{\n" +
+ " \"outcome\" : \"success\",\n" +
+ " \"result\" : {\n" +
+ " \"name\" : \"standard-sockets\",\n" +
+ " \"default-interface\" : \"default\",\n" +
+ " \"port-offset\" : \"0\",\n" +
+ " \"socket-binding\" : {\n" +
+ " \"jndi\" : {\n" +
+ " \"name\" : \"jndi\",\n" +
+ " \"interface\" : null,\n" +
+ " \"port\" : 1099,\n" +
+ " \"fixed-port\" : null,\n" +
+ " \"multicast-address\" : null,\n" +
+ " \"multicast-port\" : null\n" +
+ " },\n" +
+ " \"jmx-connector-registry\" : {\n" +
+ " \"name\" : \"jmx-connector-registry\",\n" +
+ " \"interface\" : null,\n" +
+ " \"port\" : 1090,\n" +
+ " \"fixed-port\" : null,\n" +
+ " \"multicast-address\" : null,\n" +
+ " \"multicast-port\" : null\n" +
+ " },\n" +
+ " \"jmx-connector-server\" : {\n" +
+ " \"name\" : \"jmx-connector-server\",\n" +
+ " \"interface\" : null,\n" +
+ " \"port\" : 1091,\n" +
+ " \"fixed-port\" : null,\n" +
+ " \"multicast-address\" : null,\n" +
+ " \"multicast-port\" : null\n" +
+ " },\n" +
+ " \"http\" : {\n" +
+ " \"name\" : \"http\",\n" +
+ " \"interface\" : null,\n" +
+ " \"port\" : 8080,\n" +
+ " \"fixed-port\" : null,\n" +
+ " \"multicast-address\" : null,\n" +
+ " \"multicast-port\" : null\n" +
+ " },\n" +
+ " \"https\" : {\n" +
+ " \"name\" : \"https\",\n" +
+ " \"interface\" : null,\n" +
+ " \"port\" : 8447,\n" +
+ " \"fixed-port\" : null,\n" +
+ " \"multicast-address\" : \"224.1.2.3\",\n" +
+ " \"multicast-port\" : 18447\n" +
+ " }"+
+ " }\n" +
+ " },\n" +
+ " \"compensating-operation\" : null\n" +
+ "}";
+
+ ConfigurationDefinition definition = loadDescriptor("socketBinding");
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ JsonNode json = mapper.valueToTree(result);
+
+ FakeConnection connection = new FakeConnection();
+ connection.setContent(json);
+
+ ConfigurationDelegate delegate = new ConfigurationDelegate(definition,connection,null);
+ Configuration config = delegate.loadResourceConfiguration();
+
+
+ assert config != null;
+ PropertyList propertyList = (PropertyList) config.get("socket-binding");
+ assert propertyList!=null;
+ List<Property> list = propertyList.getList();
+ assert list.size()==5;
+ for (Property prop : list) {
+ PropertyMap propMap2 = (PropertyMap) prop;
+ Map<String,Property> map2 = propMap2.getMap();
+ assert map2.size()==6;
+
+ assert map2.containsKey("port");
+ assert map2.containsKey("multicast-port");
+ assert map2.containsKey("multicast-address");
+
+ if (((PropertySimple)map2.get("name")).getStringValue().equals("https")) {
+ assert ((PropertySimple)map2.get("port")).getIntegerValue()==8447;
+ assert ((PropertySimple)map2.get("multicast-port")).getIntegerValue()==18447;
+ }
+ }
+
+ }
+
+
+
+ @BeforeSuite
+ private 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);
+ }
+ }
+
+ 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;
+ }
+
+
+
+ /**
+ * Provide a fake connection, that will return the
+ * content we provide via #setContent
+ *
+ */
+ private class FakeConnection extends ASConnection {
+
+ JsonNode content;
+
+ public FakeConnection() {
+ super("localhost", 1234);
+ }
+
+ public void setContent(JsonNode content) {
+ this.content = content;
+ }
+
+ @Override
+ public JsonNode executeRaw(Operation operation) {
+ if (content==null)
+ throw new IllegalStateException("Content not yet set");
+ return content;
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml b/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
new file mode 100644
index 0000000..4d3a106
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
@@ -0,0 +1,33 @@
+<plugin name="jboss-as-7"
+ displayName="JBoss-AS-7-Plugin"
+ description="Management of JBossAS 7"
+ package="org.rhq.modules.plugins.jbossas7"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration"
+ version="4.0.0-SNAPSHOT"
+ >
+
+ <server class="foo" discovery="foo" name="socketBinding">
+ <resource-configuration>
+ <c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" />
+ <!-- note: at domain level there is no port-offset -->
+ <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" required="false"/>
+ <c:list-property name="includes">
+ <c:simple-property name="includes" displayName="Included bindings" />
+ </c:list-property>
+ <c:list-property name="socket-binding">
+ <c:map-property name="binding">
+ <c:simple-property name="name" />
+ <c:simple-property name="interface" required="false"/>
+ <c:simple-property name="port" type="integer"/>
+ <c:simple-property name="fixed-port" type="boolean"/>
+ <c:simple-property name="multicast-address" />
+ <c:simple-property name="multicast-port" type="integer"/>
+ </c:map-property>
+ </c:list-property>
+ </resource-configuration>
+
+ </server>
+
+</plugin>
\ No newline at end of file
commit 757c9713212073198d9263a929367adf49dfa0eb
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 27 17:28:12 2011 +0200
Forgot the header
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
index f46ee38..832fd11 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
@@ -1,3 +1,21 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.modules.plugins.jbossas7;
import java.util.Iterator;
commit bee42224064975a937672a2bc4b9d3042c6e72bf
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 27 17:27:10 2011 +0200
Factor out configuration handling.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index de53386..2911e85 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -21,20 +21,8 @@ package org.rhq.modules.plugins.jbossas7;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.ObjectMapper;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
-import org.rhq.core.domain.configuration.Property;
-import org.rhq.core.domain.configuration.PropertyList;
-import org.rhq.core.domain.configuration.PropertyMap;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.domain.configuration.definition.PropertyDefinition;
-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.PropertySimpleType;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -58,7 +46,6 @@ import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
-import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import org.rhq.modules.plugins.jbossas7.json.ReadAttribute;
@@ -79,6 +66,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
{
private static final String INTERNAL = "_internal:";
private static final int INTERNAL_SIZE = INTERNAL.length();
+ private static final String LOCALHOST = "localhost";
+ private static final String DEFAULT_HTTP_MANAGEMENT_PORT = "9990";
final Log log = LogFactory.getLog(this.getClass());
ResourceContext context;
@@ -110,20 +99,17 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public void start(ResourceContext context) throws InvalidPluginConfigurationException, Exception {
this.context = context;
conf = context.getPluginConfiguration();
- // TODO add code to start the resource / connection to it
String typeName = context.getResourceType().getName();
- host = conf.getSimpleValue("hostname","localhost");
- String portString = conf.getSimpleValue("port","9990");
+ // TODO can we use parent's connection and only set this up for top level base component?
+ host = conf.getSimpleValue("hostname", LOCALHOST);
+ String portString = conf.getSimpleValue("port", DEFAULT_HTTP_MANAGEMENT_PORT);
port = Integer.parseInt(portString);
connection = new ASConnection(host,port);
path = conf.getSimpleValue("path", null);
key = context.getResourceKey();
-
-
-
myServerName = context.getResourceKey().substring(context.getResourceKey().lastIndexOf("/")+1);
@@ -157,7 +143,6 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
// Metrics from the application server
Operation op = new ReadAttribute(pathToAddress(path),req.getName()); // TODO batching
- //JsonNode obj = connection.executeRaw(op);
Result res = connection.execute(op, false);
if (!res.isSuccess())
continue;
@@ -221,266 +206,19 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
protected String getPath() { return path; }
- // TODO this needs completeion and a big fat refactoring
public Configuration loadResourceConfiguration() throws Exception {
- ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
-// String myPath = getResultingPath();
List<PROPERTY_VALUE> address = pathToAddress(path);
- Operation op = new ReadResource(address); // TOTO set recursive flag?
- op.addAdditionalProperty("recursive","true");
- JsonNode json = connection.executeRaw(op);
-
- Configuration ret = new Configuration();
- ObjectMapper mapper = new ObjectMapper();
-
- Set<Map.Entry<String, PropertyDefinition>> entrySet = configDef.getPropertyDefinitions().entrySet();
- for (Map.Entry<String,PropertyDefinition> propDefEntry: entrySet) {
- PropertyDefinition propDef = propDefEntry.getValue();
- JsonNode sub = json.findValue(propDef.getName());
- if (sub==null) {
- log.error("No value for property [" + propDef.getName() + "] found - check the descriptor");
- continue;
- }
- if (propDef instanceof PropertyDefinitionSimple) {
- PropertySimple propertySimple;
-
- if (sub!=null) {
- // Property is non-null -> return it.
- propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
- ret.put(propertySimple);
- }
- else {
- // property is null? Check if it is required
- if (propDef.isRequired()) {
- String defaultValue = ((PropertyDefinitionSimple) propDef).getDefaultValue();
- propertySimple = new PropertySimple(propDef.getName(),defaultValue);
- ret.put(propertySimple);
- }
- }
- } else if (propDef instanceof PropertyDefinitionList) {
- PropertyList propertyList = new PropertyList(propDef.getName());
- PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
- if (memberDefinition ==null) {
- if (sub.isObject()) {
- Iterator<String> fields = sub.getFieldNames();
- while(fields.hasNext()) {
- String fieldName = fields.next();
- JsonNode subNode = sub.get(fieldName);
- PropertySimple propertySimple = new PropertySimple(propDef.getName(),fieldName);
- propertyList.add(propertySimple);
- }
- } else {
- System.out.println("===Sub not object==="); // TODO evaluate this branch again
- Iterator<JsonNode> values = sub.getElements();
- while (values.hasNext()) {
- JsonNode node = values.next();
- String value = node.getTextValue();
- PropertySimple propertySimple = new PropertySimple(propDef.getName(),value);
- propertyList.add(propertySimple);
- }
- }
- }
- else if (memberDefinition instanceof PropertyDefinitionMap) {
- PropertySimple propertySimple;
-
- if (sub.isArray()) {
- Iterator<JsonNode> entries = sub.getElements();
- while (entries.hasNext()) {
- JsonNode entry = entries.next(); // -> one row in the list i.e. one map
-
- // Distinguish here?
-
- PropertyMap map = new PropertyMap(memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
- Iterator<JsonNode> fields = entry.getElements(); // TODO loop over fields from map and not from json
- while (fields.hasNext()) {
- JsonNode field = fields.next();
- if (field.isObject()) {
- // TODO only works for tuples at the moment - migrate to some different kind of parsing!
- PROPERTY_VALUE prop = mapper.readValue(field,PROPERTY_VALUE.class);
- // now need to find the names of the properties
- List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
- if (defList.isEmpty())
- throw new IllegalArgumentException("Map " + memberDefinition.getName() + " has no members");
- String key = defList.get(0).getName();
- String value = prop.getKey();
- propertySimple = new PropertySimple(key,value);
- map.put(propertySimple);
- if (defList.size()>1) {
- key = defList.get(1).getName();
- value = prop.getValue();
- propertySimple = new PropertySimple(key,value);
- map.put(propertySimple);
-
- }
- } else { // TODO reached?
- String key = field.getValueAsText();
- if (key.equals("PROPERTY_VALUE")) { // TODO this may change in the future in the AS implementation
- JsonNode pv = entry.findValue(key);
- String k = pv.toString();
- String v = pv.getValueAsText();
- propertySimple = new PropertySimple(k,v);
- map.put(propertySimple);
-
- }
- else {
- JsonNode value = entry.findValue(key);
- if (value!=null){
- propertySimple = new PropertySimple(key, value.getValueAsText());
- map.put(propertySimple);
- }
-
- }
- }
- }
- propertyList.add(map);
- }
- }
- else if (sub.isObject()) {
- Iterator<String> keys = sub.getFieldNames();
- while(keys.hasNext()) {
- String entryKey = keys.next();
-
- JsonNode node = sub.findPath(entryKey);
- PropertyMap map = new PropertyMap(memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
- if (node.isObject()) {
- Iterator<String> fields = node.getFieldNames(); // TODO loop over fields from map and not from json
- while (fields.hasNext()) {
- String key = fields.next();
-
- propertySimple = new PropertySimple(key,node.findValue(key).getValueAsText());
- map.put(propertySimple);
- }
- propertyList.add(map);
- } else if (sub.isNull()) {
- List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
- String key = defList.get(0).getName();
- propertySimple = new PropertySimple(key,entryKey);
- map.put(propertySimple);
- }
- }
-
- }
- }
- else if (memberDefinition instanceof PropertyDefinitionSimple) {
- String name = memberDefinition.getName();
- Iterator<JsonNode> keys = sub.getElements();
- while(keys.hasNext()) {
- JsonNode entry = keys.next();
-
- PropertySimple propertySimple = new PropertySimple(name,entry.getTextValue());
- propertyList.add(propertySimple);
- }
- }
- ret.put(propertyList);
- } // end List of ..
- else if (propDef instanceof PropertyDefinitionMap) {
- PropertyDefinitionMap mapDef = (PropertyDefinitionMap) propDef;
- PropertyMap pm = new PropertyMap(mapDef.getName());
-
- Map<String,PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
- for (Map.Entry<String,PropertyDefinition> maEntry : memberDefMap.entrySet()) {
- JsonNode valueNode = json.findValue(maEntry.getKey());
- Property p;
- if (maEntry.getValue() instanceof PropertyDefinitionSimple) {
- p = putProperty(valueNode, maEntry.getValue());
- pm.put(p);
- }
- else if (maEntry.getValue() instanceof PropertyDefinitionMap) { // TODO make this recursive?
-
- PropertyDefinitionMap pdm = (PropertyDefinitionMap) maEntry.getValue();
- Map<String,PropertyDefinition> mmDefMap = pdm.getPropertyDefinitions();
- for (Map.Entry<String,PropertyDefinition> mmDefEntry : mmDefMap.entrySet()) {
- if (valueNode!=null) {
- JsonNode node2 = valueNode.findValue(mmDefEntry.getKey());
- System.err.println("Map not yet implemented " + node2.toString());
- }
- else
- System.err.println("Value node was null " );
- }
- }
- else { // PropDefList
- System.err.println("List not yet implemented");
- }
-
-// pm.put(p);
- }
- ret.put(pm);
- }
- }
-
-
- return ret;
- }
-
-
- PropertySimple putProperty(JsonNode value, PropertyDefinition def) {
- String name = def.getName();
- PropertySimple ps;
-
- if (value==null) {
- if (def instanceof PropertyDefinitionSimple) {
- PropertyDefinitionSimple pds = (PropertyDefinitionSimple) def;
- return new PropertySimple(name,pds.getDefaultValue());
- }
- else
- return new PropertySimple(name,null);
- }
- PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
-
- switch (type) {
- case BOOLEAN:
- ps = new PropertySimple(name,value.getBooleanValue());
- break;
- case FLOAT:
- case DOUBLE:
- ps = new PropertySimple(name,value.getDoubleValue());
- break;
- case INTEGER:
- ps = new PropertySimple(name,value.getIntValue());
- break;
- case LONG:
- ps = new PropertySimple(name,value.getLongValue());
- break;
- default:
- ps = new PropertySimple(name,value.getTextValue());
- }
-
- return ps;
+ ConfigurationDelegate delegate = new ConfigurationDelegate(context,connection,address);
+ return delegate.loadResourceConfiguration();
}
- protected String getResultingPath() {
- ResourceComponent parentResourceComponent = context.getParentResourceComponent();
- String parentPath =null;
- String myPath;
- if (parentResourceComponent instanceof BaseComponent) {
- BaseComponent parentComponent = (BaseComponent) parentResourceComponent;
- parentPath = parentComponent.getPath();
- }
-
- if (parentPath!=null) {
- myPath = parentPath + "," + path;
- }
- else
- myPath = path;
- return myPath;
- }
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
-
- Configuration conf = report.getConfiguration();
- for (Map.Entry<String, PropertySimple> entry : conf.getSimpleProperties().entrySet()) {
-
- NameValuePair nvp = new NameValuePair(entry.getKey(),entry.getValue().getStringValue());
- Operation writeAttribute = new Operation("write-attribute",pathToAddress(getResultingPath()),nvp);
- JsonNode result= connection.executeRaw(writeAttribute);
- if(ASConnection.isErrorReply(result)) {
- report.setStatus(ConfigurationUpdateStatus.FAILURE);
- report.setErrorMessage(ASConnection.getFailureDescription(result));
- }
- }
-
+ List<PROPERTY_VALUE> address = pathToAddress(path);
+ ConfigurationDelegate delegate = new ConfigurationDelegate(context,connection,address);
+ delegate.updateResourceConfiguration(report);
}
/**
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
new file mode 100644
index 0000000..f46ee38
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ConfigurationDelegate.java
@@ -0,0 +1,282 @@
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+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.PropertySimpleType;
+import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.ReadResource;
+
+public class ConfigurationDelegate implements ConfigurationFacet {
+
+ final Log log = LogFactory.getLog(this.getClass());
+ ResourceContext context;
+ private List<PROPERTY_VALUE> address;
+ private ASConnection connection;
+
+ public ConfigurationDelegate(ResourceContext context,ASConnection connection, List<PROPERTY_VALUE> address) {
+ this.context = context;
+ this.connection = connection;
+ this.address = address;
+ }
+
+ public Configuration loadResourceConfiguration() throws Exception {
+ ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
+
+
+ Operation op = new ReadResource(address); // TODO set recursive flag? --> try to narrow it down
+ op.addAdditionalProperty("recursive", "true");
+ JsonNode json = connection.executeRaw(op);
+
+ Configuration ret = new Configuration();
+ ObjectMapper mapper = new ObjectMapper();
+
+ Set<Map.Entry<String, PropertyDefinition>> entrySet = configDef.getPropertyDefinitions().entrySet();
+ for (Map.Entry<String, PropertyDefinition> propDefEntry : entrySet) {
+ PropertyDefinition propDef = propDefEntry.getValue();
+ JsonNode sub = json.findValue(propDef.getName());
+ if (sub == null) {
+ log.error(
+ "No value for property [" + propDef.getName() + "] found - check the descriptor");
+ continue;
+ }
+ if (propDef instanceof PropertyDefinitionSimple) {
+ PropertySimple propertySimple;
+
+ if (sub != null) {
+ // Property is non-null -> return it.
+ propertySimple = new PropertySimple(propDef.getName(), sub.getValueAsText());
+ ret.put(propertySimple);
+ } else {
+ // property is null? Check if it is required
+ if (propDef.isRequired()) {
+ String defaultValue = ((PropertyDefinitionSimple) propDef).getDefaultValue();
+ propertySimple = new PropertySimple(propDef.getName(), defaultValue);
+ ret.put(propertySimple);
+ }
+ }
+ } else if (propDef instanceof PropertyDefinitionList) {
+ PropertyList propertyList = new PropertyList(propDef.getName());
+ PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
+ if (memberDefinition == null) {
+ if (sub.isObject()) {
+ Iterator<String> fields = sub.getFieldNames();
+ while (fields.hasNext()) {
+ String fieldName = fields.next();
+ JsonNode subNode = sub.get(fieldName);
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(), fieldName);
+ propertyList.add(propertySimple);
+ }
+ } else {
+ System.out.println("===Sub not object==="); // TODO evaluate this branch again
+ Iterator<JsonNode> values = sub.getElements();
+ while (values.hasNext()) {
+ JsonNode node = values.next();
+ String value = node.getTextValue();
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(), value);
+ propertyList.add(propertySimple);
+ }
+ }
+ } else if (memberDefinition instanceof PropertyDefinitionMap) {
+ PropertySimple propertySimple;
+
+ if (sub.isArray()) {
+ Iterator<JsonNode> entries = sub.getElements();
+ while (entries.hasNext()) {
+ JsonNode entry = entries.next(); // -> one row in the list i.e. one map
+
+ // Distinguish here?
+
+ PropertyMap map = new PropertyMap(
+ memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
+ Iterator<JsonNode> fields = entry.getElements(); // TODO loop over fields from map and not from json
+ while (fields.hasNext()) {
+ JsonNode field = fields.next();
+ if (field.isObject()) {
+ // TODO only works for tuples at the moment - migrate to some different kind of parsing!
+ PROPERTY_VALUE prop = mapper.readValue(field, PROPERTY_VALUE.class);
+ // now need to find the names of the properties
+ List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
+ if (defList.isEmpty())
+ throw new IllegalArgumentException(
+ "Map " + memberDefinition.getName() + " has no members");
+ String key = defList.get(0).getName();
+ String value = prop.getKey();
+ propertySimple = new PropertySimple(key, value);
+ map.put(propertySimple);
+ if (defList.size() > 1) {
+ key = defList.get(1).getName();
+ value = prop.getValue();
+ propertySimple = new PropertySimple(key, value);
+ map.put(propertySimple);
+
+ }
+ } else { // TODO reached?
+ String key = field.getValueAsText();
+ if (key.equals(
+ "PROPERTY_VALUE")) { // TODO this may change in the future in the AS implementation
+ JsonNode pv = entry.findValue(key);
+ String k = pv.toString();
+ String v = pv.getValueAsText();
+ propertySimple = new PropertySimple(k, v);
+ map.put(propertySimple);
+
+ } else {
+ JsonNode value = entry.findValue(key);
+ if (value != null) {
+ propertySimple = new PropertySimple(key, value.getValueAsText());
+ map.put(propertySimple);
+ }
+
+ }
+ }
+ }
+ propertyList.add(map);
+ }
+ } else if (sub.isObject()) {
+ Iterator<String> keys = sub.getFieldNames();
+ while (keys.hasNext()) {
+ String entryKey = keys.next();
+
+ JsonNode node = sub.findPath(entryKey);
+ PropertyMap map = new PropertyMap(
+ memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
+ if (node.isObject()) {
+ Iterator<String> fields = node.getFieldNames(); // TODO loop over fields from map and not from json
+ while (fields.hasNext()) {
+ String key = fields.next();
+
+ propertySimple = new PropertySimple(key, node.findValue(key).getValueAsText());
+ map.put(propertySimple);
+ }
+ propertyList.add(map);
+ } else if (sub.isNull()) {
+ List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
+ String key = defList.get(0).getName();
+ propertySimple = new PropertySimple(key, entryKey);
+ map.put(propertySimple);
+ }
+ }
+
+ }
+ } else if (memberDefinition instanceof PropertyDefinitionSimple) {
+ String name = memberDefinition.getName();
+ Iterator<JsonNode> keys = sub.getElements();
+ while (keys.hasNext()) {
+ JsonNode entry = keys.next();
+
+ PropertySimple propertySimple = new PropertySimple(name, entry.getTextValue());
+ propertyList.add(propertySimple);
+ }
+ }
+ ret.put(propertyList);
+ } // end List of ..
+ else if (propDef instanceof PropertyDefinitionMap) {
+ PropertyDefinitionMap mapDef = (PropertyDefinitionMap) propDef;
+ PropertyMap pm = new PropertyMap(mapDef.getName());
+
+ Map<String, PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
+ for (Map.Entry<String, PropertyDefinition> maEntry : memberDefMap.entrySet()) {
+ JsonNode valueNode = json.findValue(maEntry.getKey());
+ Property p;
+ if (maEntry.getValue() instanceof PropertyDefinitionSimple) {
+ p = putProperty(valueNode, maEntry.getValue());
+ pm.put(p);
+ } else if (maEntry.getValue() instanceof PropertyDefinitionMap) { // TODO make this recursive?
+
+ PropertyDefinitionMap pdm = (PropertyDefinitionMap) maEntry.getValue();
+ Map<String, PropertyDefinition> mmDefMap = pdm.getPropertyDefinitions();
+ for (Map.Entry<String, PropertyDefinition> mmDefEntry : mmDefMap.entrySet()) {
+ if (valueNode != null) {
+ JsonNode node2 = valueNode.findValue(mmDefEntry.getKey());
+ System.err.println("Map not yet implemented " + node2.toString());
+ } else
+ System.err.println("Value node was null ");
+ }
+ } else { // PropDefList
+ System.err.println("List not yet implemented");
+ }
+
+// pm.put(p);
+ }
+ ret.put(pm);
+ }
+ }
+
+ return ret;
+ }
+
+ PropertySimple putProperty(JsonNode value, PropertyDefinition def) {
+ String name = def.getName();
+ PropertySimple ps;
+
+ if (value == null) {
+ if (def instanceof PropertyDefinitionSimple) {
+ PropertyDefinitionSimple pds = (PropertyDefinitionSimple) def;
+ return new PropertySimple(name, pds.getDefaultValue());
+ } else
+ return new PropertySimple(name, null);
+ }
+ PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
+
+ switch (type) {
+ case BOOLEAN:
+ ps = new PropertySimple(name, value.getBooleanValue());
+ break;
+ case FLOAT:
+ case DOUBLE:
+ ps = new PropertySimple(name, value.getDoubleValue());
+ break;
+ case INTEGER:
+ ps = new PropertySimple(name, value.getIntValue());
+ break;
+ case LONG:
+ ps = new PropertySimple(name, value.getLongValue());
+ break;
+ default:
+ ps = new PropertySimple(name, value.getTextValue());
+ }
+
+ return ps;
+ }
+
+ public void updateResourceConfiguration(ConfigurationUpdateReport report) {
+
+ Configuration conf = report.getConfiguration();
+ for (Map.Entry<String, PropertySimple> entry : conf.getSimpleProperties().entrySet()) {
+
+ NameValuePair nvp = new NameValuePair(entry.getKey(), entry.getValue().getStringValue());
+ Operation writeAttribute = new Operation("write-attribute",
+ address, nvp); // TODO test path
+ JsonNode result = connection.executeRaw(writeAttribute);
+ if (ASConnection.isErrorReply(result)) {
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ report.setErrorMessage(ASConnection.getFailureDescription(result));
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 64251bc..45fa342 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -147,6 +147,19 @@
displayName="Maximum request time"/>
+ <resource-configuration>
+ <c:list-property name="schema-locations" displayName="Schema locations">
+ <c:map-property name="location">
+ <c:simple-property name="urn" readOnly="true"/>
+ <c:simple-property name="location" readOnly="true"/>
+ </c:map-property>
+ </c:list-property>
+ <c:list-property name="extension" displayName="Installed extensions">
+ <c:simple-property name="name" readOnly="true"/>
+ </c:list-property>
+ </resource-configuration>
+
+
<server name="Profile"
description="One profile in a domain"
discovery="SubsystemDiscovery"
@@ -1334,7 +1347,7 @@ working area for individual server instances</li></ul>"/>
<resource-configuration>
<c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
<!-- note: at domain level there is no port-offset -->
- <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
+ <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group (Only relevant in standalone mode)" required="false"/>
<c:list-property name="includes">
<c:simple-property name="includes" displayName="Included bindings" description="Other bindings that are included in this one"/>
</c:list-property>
commit 9f451a121d42096a317bf4b645d740010d811af4
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 27 14:45:01 2011 +0200
Improve connection and (failure) result handling.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 5f350c0..6cbe91b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -87,7 +87,8 @@ public class ASConnection {
}
/**
- * Execute an operation against the domain api
+ * Execute an operation against the domain api. This method is doing the
+ * real work by talking to the remote server.
* @return JsonNode that describes the result
* @param operation an Operation that should be run on the domain controller
*/
@@ -136,6 +137,10 @@ public class ASConnection {
}
else {
outcome="- no response from server -";
+ Result noResult = new Result();
+ noResult.setFailureDescription(outcome);
+ noResult.setOutcome("failure");
+ operationResult = mapper.valueToTree(noResult);
}
return operationResult;
}
@@ -146,6 +151,14 @@ public class ASConnection {
} catch (IOException e) {
log.error("Failed to get data: " + e.getMessage() );
+
+ Result failure = new Result();
+ failure.setFailureDescription(e.getMessage());
+ failure.setOutcome("failure");
+
+ JsonNode ret = mapper.valueToTree(failure);
+ return ret;
+
} finally {
if (br!=null)
try {
@@ -189,29 +202,6 @@ public class ASConnection {
}
- private URL getBaseUrl(String base, String ops) throws MalformedURLException {
- String spec;
- URL url2;
- if (base!=null && !base.isEmpty()) {
- if (!base.startsWith("/")) {
- spec = urlString + "/" + base;
- }
- else {
- spec = urlString + base;
- }
- if (ops!=null) {
- if (!ops.startsWith("?"))
- ops = "?" + ops;
- spec += ops;
- }
-
- url2 = new URL(spec);
- }
- else
- url2 = url;
- return url2;
- }
-
public static String getFailureDescription(JsonNode jsonNode) {
if (jsonNode==null)
return "getFailureDescription: -input was null-";
commit 490d4f8556704540a5740e6244c581aa077fb616
Merge: 1831a12 054ba69
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 26 21:01:05 2011 +0200
Merge branch 'master' into as7plugin
commit 1831a12d39873b64e0f4a07be6f274fc40c4a5cb
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 26 17:57:31 2011 +0200
Add some stats on processing times.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index d86b365..5f350c0 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -95,7 +95,9 @@ public class ASConnection {
InputStream inputStream = null;
BufferedReader br=null;
+ long t1 = System.currentTimeMillis();
try {
+
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
@@ -135,11 +137,10 @@ public class ASConnection {
else {
outcome="- no response from server -";
}
-// System.out.println("==> " + outcome);
return operationResult;
}
else {
- System.err.println("IS was null and code was " + responseCode);
+ log.error("IS was null and code was " + responseCode);
}
@@ -152,6 +153,10 @@ public class ASConnection {
} catch (IOException e) {
e.printStackTrace(); // TODO: Customise this generated block
}
+ long t2 = System.currentTimeMillis();
+ PluginStats stats = PluginStats.getInstance();
+ stats.incrementRequestCount();
+ stats.addRequestTime(t2-t1);
}
return null;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index ecb3fd6..de53386 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -77,6 +77,8 @@ import java.util.Set;
public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet,
CreateChildResourceFacet, OperationFacet
{
+ private static final String INTERNAL = "_internal:";
+ private static final int INTERNAL_SIZE = INTERNAL.length();
final Log log = LogFactory.getLog(this.getClass());
ResourceContext context;
@@ -149,31 +151,68 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
for (MeasurementScheduleRequest req : metrics) {
- Operation op = new ReadAttribute(pathToAddress(path),req.getName()); // TODO batching
- //JsonNode obj = connection.executeRaw(op);
- Result res = connection.execute(op, false);
- if (!res.isSuccess())
- continue;
-
- String val = (String) res.getResult();
-
- if (req.getDataType()== DataType.MEASUREMENT) {
- if (!val.equals("no metrics available")) { // AS 7 returns this
- try {
- Double d = Double.parseDouble(val);
- MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
- report.addData(data);
- } catch (NumberFormatException e) {
- log.warn("Non numeric input for [" + req.getName() + "] : [" + val + "]");
+ if (req.getName().startsWith(INTERNAL))
+ processPluginStats(req,report);
+ else {
+ // Metrics from the application server
+
+ Operation op = new ReadAttribute(pathToAddress(path),req.getName()); // TODO batching
+ //JsonNode obj = connection.executeRaw(op);
+ Result res = connection.execute(op, false);
+ if (!res.isSuccess())
+ continue;
+
+ String val = (String) res.getResult();
+
+ if (req.getDataType()== DataType.MEASUREMENT) {
+ if (!val.equals("no metrics available")) { // AS 7 returns this
+ try {
+ Double d = Double.parseDouble(val);
+ MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
+ report.addData(data);
+ } catch (NumberFormatException e) {
+ log.warn("Non numeric input for [" + req.getName() + "] : [" + val + "]");
+ }
}
+ } else if (req.getDataType()== DataType.TRAIT) {
+ MeasurementDataTrait data = new MeasurementDataTrait(req,val);
+ report.addData(data);
}
- } else if (req.getDataType()== DataType.TRAIT) {
- MeasurementDataTrait data = new MeasurementDataTrait(req,val);
- report.addData(data);
}
}
}
+ /**
+ * Return internal statistics data
+ * @param req Schedule for the requested data
+ * @param report report to add th data to.
+ */
+ private void processPluginStats(MeasurementScheduleRequest req, MeasurementReport report) {
+
+ String name = req.getName();
+ if (!name.startsWith(INTERNAL))
+ return;
+
+ name = name.substring(INTERNAL_SIZE);
+
+ PluginStats stats = PluginStats.getInstance();
+ MeasurementDataNumeric data;
+ Double val;
+ if (name.equals("mgmtRequests")) {
+ val= (double) stats.getRequestCount();
+ }
+ else if (name.equals("requestTime")) {
+ val =(double) stats.getRequestTime();
+ }
+ else if (name.equals("maxTime")) {
+ val = (double) stats.getMaxTime();
+ }
+ else
+ val = Double.NaN;
+
+ data = new MeasurementDataNumeric(req,val);
+ report.addData(data);
+ }
protected ASConnection getASConnection() {
return connection;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/PluginStats.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/PluginStats.java
new file mode 100644
index 0000000..1a44dde
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/PluginStats.java
@@ -0,0 +1,61 @@
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Singleton that keeps track of some statistics of this plugin
+ * @author Heiko W. Rupp
+ */
+public class PluginStats {
+ private static PluginStats ourInstance = new PluginStats();
+
+ AtomicLong requestCount = new AtomicLong();
+ AtomicLong requestTime = new AtomicLong();
+ private static final int FIFO_SIZE = 200; // Initial capacity
+ List<Long> maxTime = new ArrayList<Long>(FIFO_SIZE);
+ final Object lock = new Object();
+
+
+ public static PluginStats getInstance() {
+ return ourInstance;
+ }
+
+ private PluginStats() {
+ }
+
+ public void incrementRequestCount() {
+ requestCount.incrementAndGet();
+ }
+
+ public void addRequestTime(long l) {
+ requestTime.addAndGet(l);
+ insertTime(l);
+ }
+
+ public long getRequestCount() {
+ return requestCount.get();
+ }
+
+ public long getRequestTime() {
+ return requestTime.get();
+ }
+
+ public long getMaxTime() {
+ long max = 0;
+ synchronized (lock) {
+ for (Long i : maxTime)
+ if (i > max )
+ max = i;
+ maxTime = new ArrayList<Long>();
+ }
+ return max;
+ }
+
+ private void insertTime(long time) {
+ synchronized (lock) {
+ maxTime.add(time);
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 75484c8..64251bc 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -135,6 +135,18 @@
</operation>
+ <metric property="_internal:mgmtRequests" category="performance" dataType="measurement" defaultInterval="120000"
+ displayType="summary" measurementType="trendsup" description="Number of requests sent to the controller"
+ displayName="Number of management requests"
+ />
+ <metric property="_internal:requestTime" category="performance" dataType="measurement" defaultInterval="120000"
+ displayType="summary" measurementType="trendsup" description="Total time for requests" units="milliseconds"
+ displayName="Time used for management requests"/>
+ <metric property="_internal:maxTime" category="performance" dataType="measurement" defaultInterval="120000"
+ displayType="summary" measurementType="dynamic" description="Max time for a request since last metric get" units="milliseconds"
+ displayName="Maximum request time"/>
+
+
<server name="Profile"
description="One profile in a domain"
discovery="SubsystemDiscovery"
@@ -237,6 +249,16 @@
<process-scan name="StandaloneAS" query="process|basename|match=^java.*,arg|org.jboss.as.standalone|match=.*"/>
+ <metric property="_internal:mgmtRequests" category="performance" dataType="measurement" defaultInterval="120000"
+ displayType="summary" measurementType="trendsup" description="Number of requests sent to the controller"
+ displayName="Number of management requests"/>
+ <metric property="_internal:requestTime" category="performance" dataType="measurement" defaultInterval="120000"
+ displayType="summary" measurementType="trendsup" description="Total time for requests" units="milliseconds"
+ displayName="Time used for management requests"/>
+ <metric property="_internal:maxTime" category="performance" dataType="measurement" defaultInterval="120000"
+ displayType="summary" measurementType="dynamic" description="Max time for a request since last metric get" units="milliseconds"
+ displayName="Maximum request time"/>
+
<resource-configuration>
<c:list-property name="schema-locations" displayName="Schema locations">
@@ -618,9 +640,9 @@
description="Should an archive validation error report fail the deployment. Default: true"/>
<c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true" default="false"
description="Should an archive validation warning report fail the deployment. Default: false"/>
- <c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true"
+ <c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true" default="false"
description="enable/disable debug information logging for cached connection manager"/>
- <c:simple-property name="cached-connection-manager-error" type="boolean" readOnly="true"
+ <c:simple-property name="cached-connection-manager-error" type="boolean" readOnly="true" default="false"
description="enable/disable error information logging for cached connection manager"/>
</resource-configuration>
@@ -937,15 +959,15 @@
<c:simple-property name="path" required="true" type="string" readOnly="false" description="The filesystem path."/>
<c:simple-property name="relative-to" required="false" type="string" readOnly="false"
description="The name of another previously named path, or of one of the standard paths provided by the system.
- If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
- The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
- distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
- working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
- root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
- use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
- log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
- storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
- working area for individual server instances</li></ul>"/>
+If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
+The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
+distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
+working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
+root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
+use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
+log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
+storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
+working area for individual server instances</li></ul>"/>
</parameters>
</operation>
<resource-configuration>
@@ -1001,15 +1023,15 @@
<c:simple-property name="path" required="true" type="string" readOnly="false" description="The filesystem path."/>
<c:simple-property name="relative-to" required="false" type="string" readOnly="false"
description="The name of another previously named path, or of one of the standard paths provided by the system.
- If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
- The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
- distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
- working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
- root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
- use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
- log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
- storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
- working area for individual server instances</li></ul>"/>
+If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
+The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
+distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
+working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
+root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
+use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
+log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
+storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
+working area for individual server instances</li></ul>"/>
</parameters>
</operation>
<resource-configuration>
@@ -1023,14 +1045,14 @@
<c:simple-property name="append" required="false" type="boolean" readOnly="true" description="Specify whether to append to the target file."/>
<c:map-property name="file" description="null" >
<c:simple-property name="relative-to" required="false" type="string" readOnly="true" description="The name of another previously named path, or of one of the standard paths
- provided by the system. If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path
- specified by this attribute. The standard paths provided by the system include:<ul><li>jboss.home - the root directory
- of the JBoss AS distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current working
- directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir - root directory for an
- individual server instance</li><li>jboss.server.data.dir - directory the server will use for persistent data file
- storage</li><li>jboss.server.log.dir - directory the server will use for log file storage</li><li>jboss.server.tmp.dir -
- directory the server will use for temporary file storage</li><li>jboss.domain.servers.dir - directory under which a host controller
- will create the working area for individual server instances</li></ul>"/>
+provided by the system. If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path
+specified by this attribute. The standard paths provided by the system include:<ul><li>jboss.home - the root directory
+of the JBoss AS distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current working
+directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir - root directory for an
+individual server instance</li><li>jboss.server.data.dir - directory the server will use for persistent data file
+storage</li><li>jboss.server.log.dir - directory the server will use for log file storage</li><li>jboss.server.tmp.dir -
+directory the server will use for temporary file storage</li><li>jboss.domain.servers.dir - directory under which a host controller
+will create the working area for individual server instances</li></ul>"/>
<c:simple-property name="path" required="false" type="string" readOnly="true" description="The filesystem path."/>
</c:map-property>
<c:simple-property name="suffix" required="false" type="string" readOnly="true" description="Set the suffix string. The string is in a format which
@@ -1072,15 +1094,15 @@
<c:simple-property name="path" required="true" type="string" readOnly="false" description="The filesystem path."/>
<c:simple-property name="relative-to" required="false" type="string" readOnly="false"
description="The name of another previously named path, or of one of the standard paths provided by the system.
- If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
- The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
- distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
- working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
- root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
- use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
- log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
- storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
- working area for individual server instances</li></ul>"/>
+If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
+The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
+distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
+working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
+root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
+use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
+log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
+storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
+working area for individual server instances</li></ul>"/>
</parameters>
</operation>
<resource-configuration>
@@ -1157,7 +1179,12 @@
<resource-configuration>
<c:simple-property name="extends" required="false" type="string" readOnly="true" description="The parent security domain"/>
<c:simple-property name="cache-type" required="false" type="string" readOnly="true"
- description="Adds a cache to speed up authentication checks. Allowed values are 'default' to use simple map as the cache and 'infinispan' to use an Infinispan cache."/>
+ description="Adds a cache to speed up authentication checks. Allowed values are 'default' to use simple map as the cache and 'infinispan' to use an Infinispan cache.">
+ <c:property-options>
+ <c:option value="default"/>
+ <c:option value="infinispan"/>
+ </c:property-options>
+ </c:simple-property>
</resource-configuration>
</service>
commit 7a7c767c359f82a92056ad4a92ca8cc363ab9bcc
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 25 13:21:43 2011 +0200
Get availability by checking if the resource is readable.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index f35720e..ecb3fd6 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -93,8 +93,11 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
* @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability()
*/
public AvailabilityType getAvailability() {
- // TODO supply real implementation
- return AvailabilityType.UP;
+
+ ReadResource op = new ReadResource(pathToAddress(path));
+ Result res = connection.execute(op);
+
+ return res.isSuccess()? AvailabilityType.UP: AvailabilityType.DOWN;
}
@@ -179,6 +182,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
protected String getPath() { return path; }
+ // TODO this needs completeion and a big fat refactoring
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
// String myPath = getResultingPath();
commit 461ef8d5b0b2ec61584dd72b1aae39eef031ec3f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 25 12:00:20 2011 +0200
Support for the logging subsystem and make deployments available for standalone mode too.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 5c0a499..d86b365 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -135,7 +135,7 @@ public class ASConnection {
else {
outcome="- no response from server -";
}
- System.out.println("==> " + outcome);
+// System.out.println("==> " + outcome);
return operationResult;
}
else {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index cbc2893..f35720e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -281,8 +281,11 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
else {
- propertySimple = new PropertySimple(key,entry.findValue(key).getValueAsText());
- map.put(propertySimple);
+ JsonNode value = entry.findValue(key);
+ if (value!=null){
+ propertySimple = new PropertySimple(key, value.getValueAsText());
+ map.put(propertySimple);
+ }
}
}
@@ -367,9 +370,9 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return ret;
}
+
PropertySimple putProperty(JsonNode value, PropertyDefinition def) {
String name = def.getName();
- PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
PropertySimple ps;
if (value==null) {
@@ -380,6 +383,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
else
return new PropertySimple(name,null);
}
+ PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
switch (type) {
case BOOLEAN:
@@ -572,7 +576,12 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
resourceKey = addressToPath(serverGroupAddress);
}
else {
- resourceKey = addressToPath(step1.getAddress());
+
+ List<PROPERTY_VALUE> address = step1.getAddress();
+ Operation step3 = new Operation("deploy",address);
+ cop.addStep(step3);
+
+ resourceKey = addressToPath(address);
}
JsonNode result = connection.executeRaw(cop);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/LoggerComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/LoggerComponent.java
new file mode 100644
index 0000000..f0d5e89
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/LoggerComponent.java
@@ -0,0 +1,69 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tools.ant.taskdefs.Sleep;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.operation.OperationResult;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+
+/**
+ * Component class that deals with the Logging subsystem
+ * @author Heiko W. Rupp
+ */
+public class LoggerComponent extends BaseComponent {
+
+ private final Log log = LogFactory.getLog(LoggerComponent.class);
+
+ @Override
+ public OperationResult invokeOperation(String name,
+ Configuration parameters) throws InterruptedException, Exception {
+
+ Operation op = new Operation(name,pathToAddress(getPath()));
+
+ Map<String,Property> propertyMap = parameters.getAllProperties();
+ for (Map.Entry<String,Property> entry : propertyMap.entrySet()) {
+ PropertySimple ps = (PropertySimple) entry.getValue();
+ op.addAdditionalProperty(entry.getKey(),ps.getStringValue());
+ }
+
+
+ ASConnection conn = getASConnection();
+ ComplexResult result = conn.executeComplex(op);
+
+ if (result.isSuccess()) {
+ return new OperationResult("ok");
+ }
+ else {
+ OperationResult failure = new OperationResult();
+ failure.setErrorMessage(result.getFailureDescription().toString());
+ return failure;
+ }
+
+
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index a50ea45..a3ab676 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -134,8 +134,11 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
if (path==null||path.isEmpty())
resKey = newPath;
- else
+ else {
+ if (path.startsWith(","))
+ path = path.substring(1);
resKey = path + "," +childType + "=" + val;
+ }
PropertySimple pathProp = new PropertySimple("path",resKey);
config2.put(pathProp);
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index d7055a3..75484c8 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -162,24 +162,6 @@
<c:simple-property name="jvm" required="false"/>
</resource-configuration>
- <service name="Deployment"
- class="BaseComponent"
- discovery="SubsystemDiscovery"
- createDeletePolicy="both"
- creationDataType="content">
- <plugin-configuration>
- <c:simple-property name="path" default="deployment" readOnly="true"/>
- </plugin-configuration>
-
- <content name="file" category="deployable" isCreationType="true" description="Deployments on this server group">
- <configuration>
- <c:group name="deployment" displayName="Deployment Options">
- <c:simple-property name="runtimeName" required="true"/>
- </c:group>
- </configuration>
- </content>
-
- </service>
</server>
<server name="Host"
description="Host involved in this domain"
@@ -375,6 +357,7 @@
<c:simple-property name="journal-type" />
</resource-configuration>
+ <!-- this is no child resource TODO
<service name="Acceptor"
discovery="SubsystemDiscovery"
@@ -392,7 +375,6 @@
<c:simple-property name="path" readOnly="true" default="connector"/>
</plugin-configuration>
</service>
-<!-- this is no child resource
<service name="HQueue"
discovery="SubsystemDiscovery"
class="BaseComponent"
@@ -512,9 +494,9 @@
<metric property="bytesSent" measurementType="trendsup"/>
<metric property="bytesReceived" measurementType="trendsup"/>
- <metric property="processingTime" measurementType="trendsup"/>
+ <metric property="processingTime" measurementType="trendsup" units="milliseconds"/>
<metric property="errorCount" measurementType="trendsup" displayType="summary"/>
- <metric property="maxTime" />
+ <metric property="maxTime" units="milliseconds"/>
<metric property="requestCount" measurementType="trendsup" displayType="summary"/>
<resource-configuration>
@@ -819,6 +801,305 @@
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="subsystem=logging"/>
</plugin-configuration>
+
+ <operation name="change-root-log-level" description="Change the root logger level.">
+ <parameters>
+ <c:simple-property name="level" required="true" type="string" readOnly="false"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded.">
+ <c:property-options>
+ <c:option value="FATAL"/>
+ <c:option value="ERROR"/>
+ <c:option value="WARN"/>
+ <c:option value="INFO"/>
+ <c:option value="DEBUG"/>
+ <c:option value="TRACE"/>
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ </operation>
+
+ <operation name="remove-root-logger" description="Remove the root logger.">
+ </operation>
+
+ <operation name="set-root-logger" description="Set the root logger.">
+ <parameters>
+ <c:simple-property name="level" required="true" type="string" readOnly="false"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded.">
+ <c:property-options>
+ <c:option value="FATAL"/>
+ <c:option value="ERROR"/>
+ <c:option value="WARN"/>
+ <c:option value="INFO"/>
+ <c:option value="DEBUG"/>
+ <c:option value="TRACE"/>
+ </c:property-options>
+ </c:simple-property>
+
+ <c:list-property name="handlers" required="true" readOnly="false"
+ description="The Handlers associated with this Logger.">
+ <c:simple-property name="handler" type="string"/>
+ </c:list-property>
+ </parameters>
+ </operation>
+
+ <resource-configuration>
+ <c:map-property name="root-logger" description="The root logger for this log context.">
+ <c:simple-property name="level" readOnly="true"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded." />
+ <c:list-property name="handlers" readOnly="true">
+ <c:simple-property name="handler" readOnly="true" description="The Handlers associated with this Logger."/>
+ </c:list-property>
+ </c:map-property>
+ </resource-configuration>
+
+
+ <service name="ConsoleHandler"
+ discovery="SubsystemDiscovery"
+ class="LoggerComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="console-handler"/>
+ </plugin-configuration>
+
+ <operation name="change-log-level" description="Change the logging level for a handler.">
+ <parameters>
+ <c:simple-property name="level" required="true" type="string" readOnly="false"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded.">
+ <c:property-options>
+ <c:option value="FATAL"/>
+ <c:option value="ERROR"/>
+ <c:option value="WARN"/>
+ <c:option value="INFO"/>
+ <c:option value="DEBUG"/>
+ <c:option value="TRACE"/>
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ </operation>
+
+ <operation name="disable" description="Disable a logging handler.">
+ </operation>
+
+ <operation name="enable" description="Enable a logging handler.">
+ </operation>
+
+ <resource-configuration>
+ <c:simple-property name="name" required="false" type="string" readOnly="true" description="The handler's name."/>
+ <c:simple-property name="level" required="false" type="string" readOnly="true"
+ description="The log level specifying which message levels will be logged by this. Message levels lower than this value will be discarded. "/>
+ <c:simple-property name="encoding" required="false" type="string" readOnly="true"
+ description="The character encoding used by this Handler."/>
+ <c:simple-property name="filter" required="false" type="string" readOnly="true" description="Defines a simple filter type."/>
+ <c:simple-property name="formatter" required="false" type="string" readOnly="true" description="Defines a formatter."/>
+ <c:simple-property name="autoflush" required="false" type="boolean" readOnly="true" description="Automatically flush after each write."/>
+ <c:simple-property name="target" required="false" type="string" readOnly="true"
+ description="Defines the target of the console handler. The value can either be SYSTEM_OUT or SYSTEM_ERR.">
+ <c:property-options>
+ <c:option value="SYSTEM_OUT"/>
+ <c:option value="SYSTEM_ERR"/>
+ </c:property-options>
+ </c:simple-property>
+ </resource-configuration>
+ </service>
+
+ <service name="FileHandler"
+ discovery="SubsystemDiscovery"
+ class="LoggerComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="file-handler"/>
+ </plugin-configuration>
+
+ <operation name="change-log-level" description="Change the logging level for a handler.">
+ <parameters>
+ <c:simple-property name="level" required="true" type="string" readOnly="false"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded.">
+ <c:property-options>
+ <c:option value="FATAL"/>
+ <c:option value="ERROR"/>
+ <c:option value="WARN"/>
+ <c:option value="INFO"/>
+ <c:option value="DEBUG"/>
+ <c:option value="TRACE"/>
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ </operation>
+
+ <operation name="disable" description="Disable a logging handler.">
+ </operation>
+
+ <operation name="enable" description="Enable a logging handler.">
+ </operation>
+
+ <operation name="change-file" description="Change the file for a handler.">
+ <parameters>
+ <c:simple-property name="path" required="true" type="string" readOnly="false" description="The filesystem path."/>
+ <c:simple-property name="relative-to" required="false" type="string" readOnly="false"
+ description="The name of another previously named path, or of one of the standard paths provided by the system.
+ If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
+ The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
+ distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
+ working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
+ root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
+ use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
+ log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
+ storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
+ working area for individual server instances</li></ul>"/>
+ </parameters>
+ </operation>
+ <resource-configuration>
+ <c:simple-property name="name" required="false" type="string" readOnly="true" description="The handler's name."/>
+ <c:simple-property name="level" required="false" type="string" readOnly="true"
+ description="The log level specifying which message levels will be logged by this. Message levels lower than this value will be discarded. "/>
+ <c:simple-property name="encoding" required="false" type="string" readOnly="true"
+ description="The character encoding used by this Handler."/>
+ <c:simple-property name="filter" required="false" type="string" readOnly="true" description="Defines a simple filter type."/>
+ <c:simple-property name="formatter" required="false" type="string" readOnly="true" description="Defines a formatter."/>
+ <c:simple-property name="autoflush" required="false" type="boolean" readOnly="true" description="Automatically flush after each write."/>
+ <c:simple-property name="target" required="false" type="string" readOnly="true"
+ description="Defines the target of the console handler. The value can either be SYSTEM_OUT or SYSTEM_ERR.">
+ <c:property-options>
+ <c:option value="SYSTEM_OUT"/>
+ <c:option value="SYSTEM_ERR"/>
+ </c:property-options>
+ </c:simple-property>
+ </resource-configuration>
+ </service>
+ <service name="PeriodicRotatingFileHandler"
+ discovery="SubsystemDiscovery"
+ class="LoggerComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="periodic-rotating-file-handler"/>
+ </plugin-configuration>
+
+ <operation name="change-log-level" description="Change the logging level for a handler.">
+ <parameters>
+ <c:simple-property name="level" required="true" type="string" readOnly="false"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded.">
+ <c:property-options>
+ <c:option value="FATAL"/>
+ <c:option value="ERROR"/>
+ <c:option value="WARN"/>
+ <c:option value="INFO"/>
+ <c:option value="DEBUG"/>
+ <c:option value="TRACE"/>
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ </operation>
+
+ <operation name="disable" description="Disable a logging handler.">
+ </operation>
+
+ <operation name="enable" description="Enable a logging handler.">
+ </operation>
+
+ <operation name="change-file" description="Change the file for a handler.">
+ <parameters>
+ <c:simple-property name="path" required="true" type="string" readOnly="false" description="The filesystem path."/>
+ <c:simple-property name="relative-to" required="false" type="string" readOnly="false"
+ description="The name of another previously named path, or of one of the standard paths provided by the system.
+ If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
+ The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
+ distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
+ working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
+ root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
+ use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
+ log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
+ storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
+ working area for individual server instances</li></ul>"/>
+ </parameters>
+ </operation>
+ <resource-configuration>
+ <c:simple-property name="name" required="false" type="string" readOnly="true" description="The handler's name."/>
+ <c:simple-property name="level" required="false" type="string" readOnly="true" description="The log level specifying which message levels will be logged by this.
+ Message levels lower than this value will be discarded. "/>
+ <c:simple-property name="encoding" required="false" type="string" readOnly="true" description="The character encoding used by this Handler."/>
+ <c:simple-property name="filter" required="false" type="string" readOnly="true" description="Defines a simple filter type."/>
+ <c:simple-property name="formatter" required="false" type="string" readOnly="true" description="Defines a formatter."/>
+ <c:simple-property name="autoflush" required="false" type="boolean" readOnly="true" description="Automatically flush after each write."/>
+ <c:simple-property name="append" required="false" type="boolean" readOnly="true" description="Specify whether to append to the target file."/>
+ <c:map-property name="file" description="null" >
+ <c:simple-property name="relative-to" required="false" type="string" readOnly="true" description="The name of another previously named path, or of one of the standard paths
+ provided by the system. If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path
+ specified by this attribute. The standard paths provided by the system include:<ul><li>jboss.home - the root directory
+ of the JBoss AS distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current working
+ directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir - root directory for an
+ individual server instance</li><li>jboss.server.data.dir - directory the server will use for persistent data file
+ storage</li><li>jboss.server.log.dir - directory the server will use for log file storage</li><li>jboss.server.tmp.dir -
+ directory the server will use for temporary file storage</li><li>jboss.domain.servers.dir - directory under which a host controller
+ will create the working area for individual server instances</li></ul>"/>
+ <c:simple-property name="path" required="false" type="string" readOnly="true" description="The filesystem path."/>
+ </c:map-property>
+ <c:simple-property name="suffix" required="false" type="string" readOnly="true" description="Set the suffix string. The string is in a format which
+ can be understood by java.text.SimpleDateFormat. The period of the rotation is automatically calculated based on the suffix."/>
+ </resource-configuration>
+ </service>
+ <service name="SizeRotatingFileHandler"
+ discovery="SubsystemDiscovery"
+ class="LoggerComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="size-rotating-file-handler"/>
+ </plugin-configuration>
+
+ <operation name="change-log-level" description="Change the logging level for a handler.">
+ <parameters>
+ <c:simple-property name="level" required="true" type="string" readOnly="false"
+ description="The log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded.">
+ <c:property-options>
+ <c:option value="FATAL"/>
+ <c:option value="ERROR"/>
+ <c:option value="WARN"/>
+ <c:option value="INFO"/>
+ <c:option value="DEBUG"/>
+ <c:option value="TRACE"/>
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ </operation>
+
+ <operation name="disable" description="Disable a logging handler.">
+ </operation>
+
+ <operation name="enable" description="Enable a logging handler.">
+ </operation>
+
+ <operation name="change-file" description="Change the file for a handler.">
+ <parameters>
+ <c:simple-property name="path" required="true" type="string" readOnly="false" description="The filesystem path."/>
+ <c:simple-property name="relative-to" required="false" type="string" readOnly="false"
+ description="The name of another previously named path, or of one of the standard paths provided by the system.
+ If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute.
+ The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS
+ distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current
+ working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir -
+ root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will
+ use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for
+ log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file
+ storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the
+ working area for individual server instances</li></ul>"/>
+ </parameters>
+ </operation>
+ <resource-configuration>
+ <c:simple-property name="name" required="false" type="string" readOnly="true" description="The handler's name."/>
+ <c:simple-property name="level" required="false" type="string" readOnly="true" description="The log level specifying which message levels will be logged by this. Message levels lower than this value will be discarded. "/>
+ <c:simple-property name="encoding" required="false" type="string" readOnly="true" description="The character encoding used by this Handler."/>
+ <c:simple-property name="filter" required="false" type="string" readOnly="true" description="Defines a simple filter type."/>
+ <c:simple-property name="formatter" required="false" type="string" readOnly="true" description="Defines a formatter."/>
+ <c:simple-property name="autoflush" required="false" type="boolean" readOnly="true" description="Automatically flush after each write."/>
+ <c:simple-property name="append" required="false" type="boolean" readOnly="true" description="Specify whether to append to the target file."/>
+ <c:map-property name="file" description="null" >
+ <c:simple-property name="relative-to" required="false" type="string" readOnly="true" description="The name of another previously named path, or of one of the standard paths provided by the system. If 'relative-to' is provided, the value of the 'path' attribute is treated as relative to the path specified by this attribute. The standard paths provided by the system include:<ul><li>jboss.home - the root directory of the JBoss AS distribution</li><li>user.home - user's home directory</li><li>user.dir - user's current working directory</li><li>java.home - java installation directory</li><li>jboss.server.base.dir - root directory for an individual server instance</li><li>jboss.server.data.dir - directory the server will use for persistent data file storage</li><li>jboss.server.log.dir - directory the server will use for log file storage</li><li>jboss.server.tmp.dir - directory the server will use for temporary file storage</li><li>jboss.domain.servers.dir - directory under which a host controller will create the working area for individual server instances</li></ul>"/>
+ <c:simple-property name="path" required="false" type="string" readOnly="true" description="The filesystem path."/>
+ </c:map-property>
+ <c:simple-property name="rotate-size" required="false" description="The size at which to rotate the log file." type="long" units="bytes"/>
+ <c:simple-property name="max-backup-index" required="false" description="The maximum number of backups to keep." type="integer" />
+ </resource-configuration>
+ </service>
+
</server>
<server name="Security"
@@ -965,6 +1246,32 @@
<c:simple-property name="webservice-secure-port" type="integer" readOnly="true"
description="The non-secure port that will be used for rewriting the SOAP address. If absent the port will be identified by querying the list of installed connectors."/>
</resource-configuration>
+
+ <service name="Endpoint"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="endpoint"/>
+ </plugin-configuration>
+
+ <metric property="average-processing-time" description="Average endpoint processing time." displayType="summary" units="milliseconds"/>
+ <metric property="min-processing-time" description="Minimal endpoint processing time." units="milliseconds"/>
+ <metric property="max-processing-time" description="Maximal endpoint processing time." units="milliseconds"/>
+ <metric property="total-processing-time" description="Total endpoint processing time." measurementType="trendsup" units="milliseconds"/>
+ <metric property="request-count" description="Count of requests the endpoint processed." displayType="summary" measurementType="trendsup"/>
+ <metric property="response-count" description="Count of responses the endpoint generated." measurementType="trendsup"/>
+ <metric property="fault-count" description="Count of faults the endpoint generated." displayType="summary" measurementType="trendsup"/>
+
+ <resource-configuration>
+ <c:simple-property name="name" required="true" type="string" readOnly="true" description="Webservice endpoint name."/>
+ <c:simple-property name="context" required="true" type="string" readOnly="true" description="Webservice endpoint context."/>
+ <c:simple-property name="class" required="false" type="string" readOnly="true" description="Webservice endpoint class."/>
+ <c:simple-property name="type" required="false" type="string" readOnly="true" description="Webservice endpoint type."/>
+ <c:simple-property name="wsdl-url" required="false" type="string" readOnly="true" description="Webservice endpoint WSDL URL."/>
+ </resource-configuration>
+
+ </service>
</server>
<service name="NetworkInterface"
@@ -1018,4 +1325,30 @@
</service>
+ <service name="Deployment"
+ class="BaseComponent"
+ discovery="SubsystemDiscovery"
+ createDeletePolicy="both"
+ creationDataType="content">
+
+
+ <runs-inside>
+ <parent-resource-type name="ServerGroup" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+ <plugin-configuration>
+ <c:simple-property name="path" default="deployment" readOnly="true"/>
+ </plugin-configuration>
+
+ <content name="file" category="deployable" isCreationType="true" description="Deployments on this server group">
+ <configuration>
+ <c:group name="deployment" displayName="Deployment Options">
+ <c:simple-property name="runtimeName" required="true"/>
+ </c:group>
+ </configuration>
+ </content>
+
+ </service>
+
+
</plugin>
commit dd328eac2660aa3b2d4f0d95aa6f031d08ed09cf
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 25 11:34:19 2011 +0200
Changes and optimizations to operations handling and description elements.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index 6d4a0e2..8011628 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -23,14 +23,20 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
+import org.omg.CosNaming._BindingIteratorImplBase;
+
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
/**
- * Generate properties from a domain dump
+ * Generate properties, metrics and operation templates for the
+ * plugin descriptor from a domain dump (server can run in domain
+ * or standalone mode).
+ *
* @author Heiko W. Rupp
*/
+@SuppressWarnings("unchecked")
public class Domain2Descriptor {
public static void main(String[] args) throws Exception {
@@ -48,15 +54,15 @@ public class Domain2Descriptor {
private void run(String[] args) {
- Mode mode = null;
+ D2DMode mode = null;
int pos = 0;
if (args[0].startsWith("-")) {
if (args[0].equals("-m"))
- mode = Domain2Descriptor.Mode.METRICS;
+ mode = D2DMode.METRICS;
else if (args[0].equals("-p"))
- mode = Domain2Descriptor.Mode.PROPERTIES;
+ mode = D2DMode.PROPERTIES;
else if (args[0].equals("-o"))
- mode = Domain2Descriptor.Mode.OPERATION;
+ mode = D2DMode.OPERATION;
else {
usage();
return;
@@ -75,12 +81,12 @@ public class Domain2Descriptor {
Operation op = new Operation("read-resource-description",address);
op.addAdditionalProperty("recursive","true");
- if (mode==Domain2Descriptor.Mode.OPERATION)
+ if (mode== D2DMode.OPERATION)
op.addAdditionalProperty("operations",true);
- if (mode == Domain2Descriptor.Mode.METRICS)
+ if (mode == D2DMode.METRICS)
op.addAdditionalProperty("include-runtime",true);
- ComplexResult res = (ComplexResult) conn.execute(op,true);
+ ComplexResult res = conn.executeComplex(op);
if (!res.isSuccess()) {
System.err.println("Failure: " + res.getFailureDescription());
return;
@@ -88,39 +94,44 @@ public class Domain2Descriptor {
Map<String,Object> resMap = res.getResult();
- if (mode==Domain2Descriptor.Mode.OPERATION) {
- Map<String,Object> operationsMap = (Map<String, Object>) resMap.get("operations");
- for (Map.Entry<String,Object> entry : operationsMap.entrySet()) {
+ String what;
+ if (mode== D2DMode.OPERATION)
+ what="operations";
+ else
+ what="attributes";
+
+ Map<String,Object> attributesMap;
+ if (childType!=null) {
+ Map childMap = (Map) resMap.get("children");
+ Map <String,Object> typeMap = (Map<String, Object>) childMap.get(childType);
+ Map descriptionMap = (Map) typeMap.get("model-description");
+ if (descriptionMap==null) {
+ System.err.println("No model description found");
+ return;
+ }
+ Map starMap = (Map) descriptionMap.get("*");
+ attributesMap = (Map<String, Object>) starMap.get(what);
+ }
+ else {
+ attributesMap = (Map<String, Object>) resMap.get(what);
+ }
+
+ if (mode==D2DMode.OPERATION) {
+ for (Map.Entry<String,Object> entry : attributesMap.entrySet()) {
if (entry.getKey().startsWith("read-"))
continue;
if (entry.getKey().equals("write-attribute"))
continue;
- createOperation((Map<String,Object>)entry.getValue());
+ createOperation(entry.getKey(), (Map<String,Object>)entry.getValue());
}
-
- } else {
- Map<String,Object> attributesMap;
- if (childType!=null) {
- Map childMap = (Map) resMap.get("children");
- Map <String,Object> typeMap = (Map<String, Object>) childMap.get(childType);
- Map descriptionMap = (Map) typeMap.get("model-description");
- if (descriptionMap==null) {
- System.err.println("No model description found");
- return;
- }
- Map starMap = (Map) descriptionMap.get("*");
- attributesMap = (Map<String, Object>) starMap.get("attributes");
- }
- else {
- attributesMap = (Map<String, Object>) resMap.get("attributes");
- }
-
- createProperties(mode, attributesMap, 0);
}
+ else
+ createProperties(mode, attributesMap, 0);
+// }
}
- private void createProperties(Mode mode, Map<String, Object> attributesMap, int indent) {
+ private void createProperties(D2DMode mode, Map<String, Object> attributesMap, int indent) {
if (attributesMap==null)
return;
@@ -161,16 +172,13 @@ public class Domain2Descriptor {
}
- if (ptype== Type.LIST && mode!=Domain2Descriptor.Mode.METRICS) {
+ if (ptype== Type.LIST && mode!= D2DMode.METRICS) {
StringBuilder sb = new StringBuilder("<c:list-property name=\"");
sb.append(entryName);
sb.append("\"");
- if (props.containsKey("description")) {
- sb.append(" description=\"");
- sb.append(props.get("description"));
- sb.append("\"");
- }
+ String description = (String) props.get("description");
+ appendDescription(sb,description);
sb.append(" >\n");
if (!props.containsKey("attributes"))
sb.append(" <c:simple-property name=\"").append(entryName).append("\" />\n");
@@ -192,7 +200,7 @@ public class Domain2Descriptor {
}
String accessType = getAccessType(props);
- if (mode==Domain2Descriptor.Mode.METRICS) {
+ if (mode== D2DMode.METRICS) {
if (!accessType.equals("metric"))
continue;
@@ -204,11 +212,7 @@ public class Domain2Descriptor {
sb.append(" dataType=\"trait\"");
String description = (String) props.get("description");
- if (description!=null) {
- if (sb.length()+description.length() > 120)
- sb.append("\n ");
- sb.append(" description=\"").append(description).append('"');
- }
+ appendDescription(sb,description);
sb.append("/>");
System.out.println(sb.toString());
@@ -224,32 +228,27 @@ public class Domain2Descriptor {
}
}
- private void createOperation(Map<String,Object> operationMap) {
+ private void createOperation(String name, Map<String, Object> operationMap) {
StringBuilder builder = new StringBuilder("<operation name=\"");
- String name = (String) operationMap.get("operation-name");
builder.append(name).append('"');
String description = (String) operationMap.get("description");
- if (description!=null && !description.isEmpty()) {
- builder.append(" description=\"").append(description).append('"');
- }
+ appendDescription(builder, description);
builder.append(">\n");
-
-
- if (!((Map)operationMap.get("request-properties")).isEmpty()) {
- Map<String,Object> map = (Map<String, Object>) operationMap.get("request-properties");
+ Map<String,Object> reqMap = (Map<String, Object>) operationMap.get("request-properties");
+ if (reqMap!=null && !reqMap.isEmpty()) {
builder.append(" <parameters>\n");
- generatePropertiesForMap(builder, map, true);
+ generatePropertiesForMap(builder, reqMap, true);
builder.append(" </parameters>\n");
}
- if (!((Map)operationMap.get("reply-properties")).isEmpty()){
- Map<String,Object> map = (Map<String, Object>) operationMap.get("reply-properties"); // TODO not sure -- perhaps for the java code?
+ Map replyMap = (Map) operationMap.get("reply-properties");
+ if (replyMap!=null && !replyMap.isEmpty()){
builder.append(" <results>\n");
- generatePropertiesForMap(builder, map, true);
+ generatePropertiesForMap(builder, replyMap, true);
builder.append(" </results>\n");
}
@@ -258,6 +257,21 @@ public class Domain2Descriptor {
System.out.println(builder.toString());
}
+ private void appendDescription(StringBuilder builder, String description) {
+ if (description!=null && !description.isEmpty()) {
+ if (builder.length()>120)
+ builder.append("\n ");
+ builder.append(" description=\"");
+
+ description = description.replace("<","<");
+ description = description.replace(">",">");
+ description = description.replace("\"","\\\"");
+
+ builder.append(description);
+ builder.append('"');
+ }
+ }
+
private void generatePropertiesForMap(StringBuilder builder, Map<String, Object> map, boolean forceReadWrite) {
for (Map.Entry<String,Object> entry : map.entrySet()) {
@@ -334,11 +348,7 @@ public class Domain2Descriptor {
}
String description = (String) props.get("description");
- if (description!=null) {
- if (sb.length()+description.length() > 120)
- sb.append("\n ");
- sb.append(" description=\"").append(description).append('"');
- }
+ appendDescription(sb,description);
sb.append("/>");
return sb;
}
@@ -350,6 +360,9 @@ public class Domain2Descriptor {
private Type getTypeFromProps(Map<String, Object> props) {
Map<String,String> tMap = (Map<String, String>) props.get("type");
+ if (tMap==null)
+ return Type.OBJECT;
+
String type = tMap.get("TYPE_MODEL_VALUE");
Type ret = Type.valueOf(type);
@@ -391,6 +404,7 @@ public class Domain2Descriptor {
System.out.println(" path is of kind 'key=value[,key=value]+");
System.out.println(" -p create properties (default)");
System.out.println(" -m create metrics");
+ System.out.println(" -o create operations");
}
public enum Type {
@@ -405,7 +419,7 @@ public class Domain2Descriptor {
;
}
- private enum Mode {
+ private enum D2DMode {
METRICS,
PROPERTIES,
OPERATION
commit 895f8fd65dd46327a171ecb96d498baecc2afffc
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 25 11:23:09 2011 +0200
Add a test for AS7-853
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index 1ef3761..57ec4f3 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -153,6 +153,81 @@ public class UploadAndDeployTest {
}
+ // Test for AS7-853
+ @Test(timeOut = 60*1000L, enabled = true)
+ public void testUploadIndividualSteps2() throws Exception {
+
+ String bytes_value = prepare();
+
+ System.out.println("sha: " + bytes_value);
+
+ System.out.println();
+ ASConnection connection = new ASConnection(DC_HOST, DC_HTTP_PORT);
+
+ List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
+ deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ Operation op = new Operation("add",deploymentsAddress);
+ List<Object> content = new ArrayList<Object>(1);
+ Map<String,Object> contentValues = new HashMap<String,Object>();
+ contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE",bytes_value));
+ content.add(contentValues);
+ op.addAdditionalProperty("content",content);
+ op.addAdditionalProperty("name", TEST_WAR); // this needs to be unique per upload
+ op.addAdditionalProperty("runtime-name", TEST_WAR);
+ System.out.flush();
+ JsonNode ret = connection.executeRaw(op);
+ op = null;
+ System.out.println("Add to /deploy done " + ret);
+ System.out.flush();
+
+ assert ret.toString().contains("success") : ret;
+
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group", "main-server-group"));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+
+ Operation attach = new Operation("add",serverGroupAddress,"enabled",true);
+ System.out.flush();
+ ret = connection.executeRaw(attach);
+ System.out.println("Add to server group done: " + ret);
+ System.out.flush();
+
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "add to sg was no success " + ret.getTextValue();
+
+
+ Result depRes;// = connection.execute(deploy);
+
+ Thread.sleep(500);
+
+ Operation undeploy = new Operation("undeploy",serverGroupAddress);
+ depRes = connection.execute(undeploy);
+
+ assert depRes.isSuccess() : "Undeploy went wrong: " + depRes.getFailureDescription();
+ undeploy = null;
+
+ // Now tear down stuff again
+
+ Operation unattach = new Operation("remove",serverGroupAddress);
+ ret = connection.executeRaw(unattach);
+
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "remove from sg was no success " + ret.getTextValue();
+
+
+ // remove from domain
+
+ Operation remove = new Operation("remove",deploymentsAddress);
+ ret = connection.executeRaw(remove);
+
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "remove from domain was no success " + ret.getTextValue();
+
+ System.out.flush();
+
+ }
+
@Test(timeOut = 60*1000L, enabled = true)
public void testUploadComposite() throws Exception {
commit 3dbd7b89c98c52007fecc64c79a403de1170f68c
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue May 24 15:26:53 2011 +0200
Add a comment that tests need to run against domain mode.
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index f2a4d54..1ef3761 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -36,7 +36,8 @@ import org.rhq.modules.plugins.jbossas7.json.Result;
/**
* Test uploading and deploying to the domain
- * To use it, domain server must be up and running locally and
+ * To use it, a server in <b>domain mode</b> must be up and have it's
+ * <b>DomainController</b> running <b>locally</b> and
* the UPLOAD_FILE must point to a valid archive in the resources directory.
* @author Heiko W. Rupp
*/
commit 506c0dbaf78a349cebeb34f99b96befb57ec1c07
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 20 11:56:14 2011 +0200
Prevent NPE on container shutdown.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/event/EventContextImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/event/EventContextImpl.java
index 64a6ff7..b0b37ec 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/event/EventContextImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/event/EventContextImpl.java
@@ -103,7 +103,7 @@ public class EventContextImpl implements EventContext {
public SigarProxy getSigar() {
return getEventManager().getSigar();
}
-
+
private void registerEventPollerInternal(final EventPoller poller, int pollingInterval,
final String sourceLocation) {
EventDefinition eventDefinition = EventUtility.getEventDefinition(poller.getEventType(), this.resource.getResourceType());
@@ -124,6 +124,8 @@ public class EventContextImpl implements EventContext {
EventDefinition eventDefinition = EventUtility.getEventDefinition(eventType, this.resource.getResourceType());
if (eventDefinition == null)
throw new IllegalArgumentException("Unknown event type - no EventDefinition exists with name '" + eventType + "'.");
- getEventManager().unregisterEventPoller(this.resource, eventType, sourceLocation);
+ EventManager eventManager = getEventManager();
+ if (eventManager!=null)
+ eventManager.unregisterEventPoller(this.resource, eventType, sourceLocation);
}
}
commit 63ee4634ec99c852eb69defd272a8f2a79a92ed8
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 20 11:34:44 2011 +0200
Follow the changes in deploy handling of AS and correctly implement delete of deployments
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index eace9b8..5c0a499 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -157,6 +157,16 @@ public class ASConnection {
return null;
}
+
+
+ public Result execute(Operation op) {
+ return execute(op,false);
+ }
+
+ public ComplexResult executeComplex(Operation op) {
+ return (ComplexResult) execute(op,true);
+ }
+
public Result execute(Operation op, boolean isComplex){
JsonNode node = executeRaw(op);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 609fe69..cbc2893 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -464,14 +464,40 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return result;
}
+ public String addressToPath(List<PROPERTY_VALUE> address)
+ {
+ StringBuilder builder = new StringBuilder();
+ Iterator<PROPERTY_VALUE> iter = address.iterator();
+ while (iter.hasNext()) {
+ PROPERTY_VALUE val = iter.next();
+ builder.append(val.getKey()).append('=').append(val.getValue());
+ if (iter.hasNext())
+ builder.append(',');
+ }
+ return builder.toString();
+ }
+
@Override
public void deleteResource() throws Exception {
- System.out.println("delete resource: " + path);
- Operation op = new Operation("remove",pathToAddress(path));
- ComplexResult res = (ComplexResult) connection.execute(op, true);
+ log.info("delete resource: " + path + " ...");
+ List<PROPERTY_VALUE> address = pathToAddress(path);
+ Operation op = new Operation("remove", address);
+ ComplexResult res = connection.executeComplex(op);
if (!res.isSuccess())
throw new IllegalArgumentException("Delete for [" + path + "] failed: " + res.getFailureDescription());
+ if (path.contains("server-group")) {
+ // This was a server group level deployment - we also need to remove the entry in /deployments
+ for (PROPERTY_VALUE val : address) {
+ if (val.getKey().equals("deployment")) {
+ ComplexResult res2 = connection.executeComplex(new Operation("remove",val.getKey(),val.getValue()));
+ if (!res2.isSuccess())
+ throw new IllegalArgumentException("Removal of [" + path + "] falied : " + res2.getFailureDescription());
+ }
+ }
+ }
+ log.info(" ... done");
+
}
@@ -499,6 +525,13 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
String fileName = details.getFileName();
+
+ if (fileName.startsWith("C:\\fakepath\\")) { // TODO this is a hack as the server adds the fake path somehow
+ fileName=fileName.substring("C:\\fakepath\\".length());
+ }
+
+ log.info("Deploying [" + fileName + "] ...");
+
String tmpName = fileName; // TODO figure out the tmp-name biz with the AS guys
JsonNode resultNode = uploadResult.get("result");
@@ -506,12 +539,19 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
ASConnection connection = getASConnection();
Operation step1 = new Operation("add","deployment",tmpName);
- step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+// step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+ List<Object> content = new ArrayList<Object>(1);
+ Map<String,Object> contentValues = new HashMap<String,Object>();
+ contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE",hash));
+ content.add(contentValues);
+ step1.addAdditionalProperty("content",content);
+
step1.addAdditionalProperty("name", tmpName);
step1.addAdditionalProperty("runtime-name", fileName);
CompositeOperation cop = new CompositeOperation();
cop.addStep(step1);
+ String resourceKey;
/*
* We need to check here if this is an upload to /deployment only
@@ -519,21 +559,34 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
*/
if (context.getResourceKey().contains("server-group=")) {
- List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>();
serverGroupAddress.addAll(pathToAddress(context.getResourceKey()));
serverGroupAddress.add(new PROPERTY_VALUE("deployment", tmpName));
- Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+ Operation step2 = new Operation("add",serverGroupAddress);
cop.addStep(step2);
+
+ Operation step3 = new Operation("deploy",serverGroupAddress);
+ cop.addStep(step3);
+
+ resourceKey = addressToPath(serverGroupAddress);
+ }
+ else {
+ resourceKey = addressToPath(step1.getAddress());
}
JsonNode result = connection.executeRaw(cop);
if (ASConnection.isErrorReply(result)) {
- report.setErrorMessage(ASConnection.getFailureDescription(resultNode));
+ String failureDescription = ASConnection.getFailureDescription(result);
+ report.setErrorMessage(failureDescription);
report.setStatus(CreateResourceStatus.FAILURE);
+ log.warn(" ... done with failure: " + failureDescription);
}
else {
report.setStatus(CreateResourceStatus.SUCCESS);
+ report.setResourceName(fileName);
+ report.setResourceKey(resourceKey);
+ log.info(" ... with success and key [" + resourceKey + "]" );
}
return report;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index 8c46247..67190ba 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -21,9 +21,11 @@ package org.rhq.modules.plugins.jbossas7;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.codehaus.jackson.JsonNode;
@@ -62,6 +64,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
return null; // TODO: Customise this generated block
}
+ // TODO I think this package code is not used.
@Override
public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages,
ContentServices contentServices) {
@@ -87,23 +90,35 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
deploymentsAddress.add(new PROPERTY_VALUE("deployment", fileName));
Operation step1 = new Operation("add",deploymentsAddress);
- step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+// step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+ List<Object> content = new ArrayList<Object>(1);
+ Map<String,Object> contentValues = new HashMap<String,Object>();
+ contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE",hash));
+ content.add(contentValues);
+ step1.addAdditionalProperty("content",content);
+
step1.addAdditionalProperty("name", fileName);
List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
serverGroupAddress.addAll(pathToAddress(context.getResourceKey()));
serverGroupAddress.add(new PROPERTY_VALUE("deployment", fileName));
- Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+ Operation step2 = new Operation("add",serverGroupAddress);
+ Operation step3 = new Operation("deploy",serverGroupAddress);
CompositeOperation cop = new CompositeOperation();
cop.addStep(step1);
cop.addStep(step2);
+ cop.addStep(step3);
JsonNode result = connection.executeRaw(cop);
if (ASConnection.isErrorReply(result)) // TODO get failure message into response
response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE));
- else
- response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.SUCCESS));
+ else {
+ DeployIndividualPackageResponse individualPackageResponse = new DeployIndividualPackageResponse(
+ details.getKey(), ContentResponseResult.SUCCESS);
+ response.addPackageResponse(individualPackageResponse);
+ response.setOverallRequestResult(ContentResponseResult.SUCCESS);
+ }
}
else
response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE));
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 7e0a890..d7055a3 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -857,6 +857,29 @@
description="Specifies the MappingManager implementation class name to use. To use the container default set the value to 'default''."/>
</resource-configuration>
+ <service name="SecurtityDomain"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="security-domain"/>
+ </plugin-configuration>
+
+
+
+ <resource-configuration>
+ <c:simple-property name="extends" required="false" type="string" readOnly="true" description="The parent security domain"/>
+ <c:simple-property name="cache-type" required="false" type="string" readOnly="true"
+ description="Adds a cache to speed up authentication checks. Allowed values are 'default' to use simple map as the cache and 'infinispan' to use an Infinispan cache."/>
+ </resource-configuration>
+ </service>
+
</server>
<server name="Threads"
@@ -915,8 +938,6 @@
</service>
-
-
</server>
<server name="Webservices"
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java
index a59b05e..cb10279 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java
@@ -92,4 +92,15 @@ public class PathHandlingTest {
}
assert found == 2 : "did not find both keys, but " + found;
}
+
+ public void addr2path() throws Exception {
+
+ String path = "subsystem=jms,profile=default,queue=java:/foo";
+
+ BaseComponent bc = new BaseComponent();
+ List<PROPERTY_VALUE> list = bc.pathToAddress(path);
+
+ String path2 = bc.addressToPath(list);
+ assert path.equals(path2);
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index b1eb277..f2a4d54 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -22,7 +22,9 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.codehaus.jackson.JsonNode;
import org.testng.annotations.Test;
@@ -54,10 +56,24 @@ public class UploadAndDeployTest {
assert bytes_value != null;
System.out.println("sha: " + bytes_value);
+ assert bytes_value.equals("7jgpMVmynfxpqp8UDleKLmtgbrA=");
}
@Test(timeOut = 60*1000L, enabled = true)
+ public void testDoubleUploadOnly() throws Exception {
+
+ String bytes_value = prepare();
+ String bytes_value2 = prepare();
+
+ assert bytes_value != null;
+ assert bytes_value2 != null;
+ assert bytes_value.equals(bytes_value2);
+
+ assert bytes_value.equals("7jgpMVmynfxpqp8UDleKLmtgbrA=");
+ }
+
+ @Test(timeOut = 60*1000L, enabled = true)
public void testUploadIndividualSteps() throws Exception {
String bytes_value = prepare();
@@ -70,11 +86,16 @@ public class UploadAndDeployTest {
List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
Operation op = new Operation("add",deploymentsAddress);
- op.addAdditionalProperty("hash",new PROPERTY_VALUE("BYTES_VALUE",bytes_value));
- op.addAdditionalProperty("name", TEST_WAR); // this needs to be separate per upload
+ List<Object> content = new ArrayList<Object>(1);
+ Map<String,Object> contentValues = new HashMap<String,Object>();
+ contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE",bytes_value));
+ content.add(contentValues);
+ op.addAdditionalProperty("content",content);
+ op.addAdditionalProperty("name", TEST_WAR); // this needs to be unique per upload
op.addAdditionalProperty("runtime-name", TEST_WAR);
System.out.flush();
JsonNode ret = connection.executeRaw(op);
+ op = null;
System.out.println("Add to /deploy done " + ret);
System.out.flush();
@@ -82,12 +103,13 @@ public class UploadAndDeployTest {
List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
- serverGroupAddress.add(new PROPERTY_VALUE("server-group","main-server-group"));
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group", "main-server-group"));
serverGroupAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
- op.addAdditionalProperty("runtime-name", TEST_WAR);
- Operation deploy = new Operation("add",serverGroupAddress,"enabled","true");
+
+ Operation attach = new Operation("add",serverGroupAddress);//,"enabled","true");
+// deploy.addAdditionalProperty("runtime-name", TEST_WAR);
System.out.flush();
- ret = connection.executeRaw(deploy);
+ ret = connection.executeRaw(attach);
System.out.println("Add to server group done: " + ret);
System.out.flush();
@@ -95,10 +117,24 @@ public class UploadAndDeployTest {
assert ret.get("outcome").getTextValue().equals("success") : "add to sg was no success " + ret.getTextValue();
+ Operation deploy = new Operation("deploy",serverGroupAddress);
+ Result depRes = connection.execute(deploy);
+
+ assert depRes.isSuccess() : "Deploy went wrong: " + depRes.getFailureDescription();
+
+
+ Thread.sleep(500);
+
+ Operation undeploy = new Operation("undeploy",serverGroupAddress);
+ depRes = connection.execute(undeploy);
+
+ assert depRes.isSuccess() : "Undeploy went wrong: " + depRes.getFailureDescription();
+ undeploy = null;
+
// Now tear down stuff again
- Operation undeploy = new Operation("remove",serverGroupAddress);
- ret = connection.executeRaw(undeploy);
+ Operation unattach = new Operation("remove",serverGroupAddress);
+ ret = connection.executeRaw(unattach);
assert ret.has("outcome") : "Ret not valid " + ret.toString();
assert ret.get("outcome").getTextValue().equals("success") : "remove from sg was no success " + ret.getTextValue();
@@ -121,26 +157,36 @@ public class UploadAndDeployTest {
String bytes_value = prepare();
+ System.out.println("Prepare done");
+ System.out.flush();
List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
Operation step1 = new Operation("add",deploymentsAddress);
- step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", bytes_value));
- step1.addAdditionalProperty("name", TEST_WAR);
+ List<Object> content = new ArrayList<Object>(1);
+ Map<String,Object> contentValues = new HashMap<String,Object>();
+ contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE",bytes_value));
+ content.add(contentValues);
+ step1.addAdditionalProperty("content", content);
+ step1.addAdditionalProperty("name", TEST_WAR); // this needs to be unique per upload
+
List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
serverGroupAddress.add(new PROPERTY_VALUE("server-group","main-server-group"));
serverGroupAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
- Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+ Operation step2 = new Operation("add",serverGroupAddress);// ,"enabled","true");
+ Operation step2a = new Operation("deploy",serverGroupAddress);
- Operation step3 = new Operation("remove",serverGroupAddress);
+ Operation step3 = new Operation("undeploy",serverGroupAddress);
+ Operation step3a = new Operation("remove",serverGroupAddress);
Operation step4 = new Operation("remove",deploymentsAddress);
CompositeOperation cop = new CompositeOperation();
cop.addStep(step1);
cop.addStep(step2);
+ cop.addStep(step2a);
ASConnection connection = new ASConnection(DC_HOST, DC_HTTP_PORT);
@@ -148,16 +194,23 @@ public class UploadAndDeployTest {
System.out.println(ret);
System.out.flush();
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "Composite deploy was no success " + ret.getTextValue();
+
Thread.sleep(1000);
cop = new CompositeOperation();
cop.addStep(step3);
+ cop.addStep(step3a);
cop.addStep(step4);
ret = connection.executeRaw(cop);
System.out.println(ret);
System.out.flush();
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "Composite remove was no success " + ret.getTextValue();
+
}
commit 1b158d363959f76fbc698d34435b2fc4f6557eab
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 19 10:39:21 2011 +0200
Fix the property name for includes.
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 574e8cb..7e0a890 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -980,8 +980,8 @@
<c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
<!-- note: at domain level there is no port-offset -->
<c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
- <c:list-property name="include">
- <c:simple-property name="binding" displayName="Included bindings" description="Other bindings that are included in this one"/>
+ <c:list-property name="includes">
+ <c:simple-property name="includes" displayName="Included bindings" description="Other bindings that are included in this one"/>
</c:list-property>
<c:list-property name="socket-binding">
<c:map-property name="binding">
commit 19cca0b11c0a3d45055d0906e586fd697a9f8e78
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 19 10:38:44 2011 +0200
Barf if a property can not be found in the JSON.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index ccdd235..609fe69 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -195,6 +195,10 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
for (Map.Entry<String,PropertyDefinition> propDefEntry: entrySet) {
PropertyDefinition propDef = propDefEntry.getValue();
JsonNode sub = json.findValue(propDef.getName());
+ if (sub==null) {
+ log.error("No value for property [" + propDef.getName() + "] found - check the descriptor");
+ continue;
+ }
if (propDef instanceof PropertyDefinitionSimple) {
PropertySimple propertySimple;
commit b16fc49c66386a7e399999d62782db7d29221cda
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 18 22:15:06 2011 +0200
Support creation of JMS objects.
This code may be pulled up in a super class, as it is applicable for most/all cases of :add
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java
index 70bb5d7..3aeef6e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java
@@ -29,12 +29,15 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.core.domain.resource.CreateResourceStatus;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
-import org.rhq.modules.plugins.jbossas7.json.Result;
/**
* Component class for the JMS subsystem
@@ -48,42 +51,77 @@ public class JmsComponent extends DomainComponent {
public CreateResourceReport createResource(CreateResourceReport report) {
- Configuration resConf = report.getResourceConfiguration();
Configuration pConf = report.getPluginConfiguration();
+ Configuration resConf = report.getResourceConfiguration();
+ ConfigurationDefinition resConfDef = report.getResourceType().getResourceConfigurationDefinition();
String type = pConf.getSimpleValue("path", "");
List<PROPERTY_VALUE> address = pathToAddress(getPath());
address.add(new PROPERTY_VALUE(type,report.getUserSpecifiedResourceName()));
Operation op = new Operation("add",address);
+
+ // Loop over the properties from the config and add them as properties to the op
for (Map.Entry<String, Property> entry: resConf.getAllProperties().entrySet()) {
Property value = entry.getValue();
if (value !=null) {
+ String name = entry.getKey();
+
if (value instanceof PropertySimple) {
+ PropertyDefinitionSimple propDef = (PropertyDefinitionSimple) resConfDef.get(name);
PropertySimple ps = (PropertySimple) value;
- op.addAdditionalProperty(entry.getKey(), ps.getStringValue()); // TODO determine real type
+ op.addAdditionalProperty(name, getObjectForProperty(ps,propDef));
} else if (value instanceof PropertyList) {
PropertyList propertyList = (PropertyList) value;
- List<String> list = new ArrayList<String>();
+ List<Object> list = new ArrayList<Object>();
+ PropertyDefinitionList pd = resConfDef.getPropertyDefinitionList(name);
+ PropertyDefinitionSimple propDef = (PropertyDefinitionSimple) pd.getMemberDefinition();
for (Property p : propertyList.getList()) {
- list.add(p.toString()); // TODO
+
+ Object o = getObjectForProperty((PropertySimple) p, propDef);
+ list.add(o);
}
- op.addAdditionalProperty(entry.getKey(),list);
+ op.addAdditionalProperty(name,list);
}
}
}
ComplexResult res = (ComplexResult) getASConnection().execute(op,true);
+ // TODO Currently this reports a failure even if it succeeds for jms
+
if (res == null || !res.isSuccess()) {
report.setStatus(CreateResourceStatus.FAILURE);
} else {
report.setStatus(CreateResourceStatus.SUCCESS);
- report.setResourceKey(address.toString()); // TODO ??
+ report.setResourceKey(address.toString());
report.setResourceName(report.getUserSpecifiedResourceName());
}
System.out.println(report);
return report;
}
+
+ Object getObjectForProperty(PropertySimple prop, PropertyDefinitionSimple propDef) {
+
+ PropertySimpleType type = propDef.getType();
+ switch (type) {
+ case STRING:
+ return prop.getStringValue();
+ case INTEGER:
+ return prop.getIntegerValue();
+ case BOOLEAN:
+ return prop.getBooleanValue();
+ case LONG:
+ return prop.getLongValue();
+ case FLOAT:
+ return prop.getFloatValue();
+ case DOUBLE:
+ return prop.getDoubleValue();
+ default:
+ return prop.getStringValue();
+ }
+
+
+ }
}
commit 5abdcb5f64541a372b8a00412b7b9fc38c118827
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 18 22:14:15 2011 +0200
Make failure description an object, as the AS may result stuff that jackson can't deal with.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
index ccc967b..c7a983e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
@@ -36,7 +36,7 @@ public class Result {
@JsonProperty("compensating-operation")
private Operation compensatingOperation;
@JsonProperty("failure-description")
- private List<Map<String, String>> failureDescription;
+ private /*List<Map<String, String>>*/Object failureDescription;
@JsonIgnore
private boolean success = false;
@@ -74,11 +74,11 @@ public class Result {
this.compensatingOperation = compensatingOperation;
}
- public List<Map<String, String>> getFailureDescription() {
+ public Object getFailureDescription() {
return failureDescription;
}
- public void setFailureDescription(List<Map<String, String>> failureDescription) {
+ public void setFailureDescription(/*List<Map<String, String>>*/Object failureDescription) {
this.failureDescription = failureDescription;
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 2ca9f91..53ac89e 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -23,7 +23,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
import org.testng.annotations.Test;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
@@ -157,7 +160,7 @@ public class OperationJsonTest {
assert result.getResult() == null;
assert result.getCompensatingOperation() == null;
assert result.getFailureDescription() != null;
- assert result.getFailureDescription().size() == 1;
+// assert result.getFailureDescription().size() == 1;
}
public void complexResult1() throws Exception {
@@ -216,4 +219,77 @@ public class OperationJsonTest {
}
+ public void complexResult2() throws Exception {
+
+
+ String resultString =
+ "{\n" +
+ " \"outcome\" : \"failed\",\n" +
+ " \"result\" : {\n" +
+ " \"server-groups\" : {\n" +
+ " \"main-server-group\" : {\n" +
+ " \"server-one\" : {\n" +
+ " \"host\" : \"local\",\n" +
+ " \"response\" : {\n" +
+ " \"outcome\" : \"success\",\n" +
+ " \"result\" : null,\n" +
+ " \"compensating-operation\" : {\n" +
+ " \"operation\" : \"add\",\n" +
+ " \"address\" : [ {\n" +
+ " \"subsystem\" : \"jms\"\n" +
+ " }, {\n" +
+ " \"queue\" : \"flubbr\"\n" +
+ " } ],\n" +
+ " \"durable\" : \"true\",\n" +
+ " \"entries\" : [ \"PropertySimple[id=0, name=entries, value=flubbr, override=null]\" ]\n" +
+ " }\n" +
+ " }\n" +
+ " },\n" +
+ " \"server-two\" : {\n" +
+ " \"host\" : \"local\",\n" +
+ " \"response\" : {\n" +
+ " \"outcome\" : \"success\",\n" +
+ " \"result\" : null,\n" +
+ " \"compensating-operation\" : {\n" +
+ " \"operation\" : \"add\",\n" +
+ " \"address\" : [ {\n" +
+ " \"subsystem\" : \"jms\"\n" +
+ " }, {\n" +
+ " \"queue\" : \"flubbr\"\n" +
+ " } ],\n" +
+ " \"durable\" : \"true\",\n" +
+ " \"entries\" : [ \"PropertySimple[id=0, name=entries, value=flubbr, override=null]\" ]\n" +
+ " }\n" +
+ " }\n" +
+ " },\n" +
+ " \"server-demo\" : {\n" +
+ " \"host\" : \"local\",\n" +
+ " \"response\" : {\n" +
+ " \"outcome\" : \"failed\",\n" +
+ " \"failure-description\" : \"No handler for add at address [\\n (\\\"host\\\" => \\\"local\\\"),\\n (\\\"server\\\" => \\\"server-demo\\\"),\\n (\\\"subsystem\\\" => \\\"jms\\\"),\\n (\\\"queue\\\" => \\\"flubbr\\\")\\n]\"\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ " },\n" +
+ " \"failure-description\" : \"Operation was not applied successfully to any servers\"\n" +
+ "}";
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
+
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+ assert !result.isSuccess() : "Result should be 'failed', but was not";
+ assert result.getFailureDescription().equals("Operation was not applied successfully to any servers");
+
+ assert result.getResult().containsKey("server-groups");
+ Map<String,Object> sgs = (Map<String, Object>) result.getResult().get("server-groups");
+ assert sgs.containsKey("main-server-group");
+ Map<String,Object> mainSg = (Map<String, Object>) sgs.get("main-server-group");
+ assert mainSg.size()==3 : "Main server group does not have 3 servers, but " + mainSg.size();
+ Map<String,Object> s3 = (Map<String, Object>) mainSg.get("server-demo");
+ Map<String,Object> response = (Map<String, Object>) s3.get("response");
+ assert response!=null;
+
+ }
+
}
commit 427fe807db9993edeb3de4b246c961710f5d7c4a
Merge: 9520bad 25e909e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 18 11:45:37 2011 +0200
Merge branch 'master' into as7plugin
commit 9520bad8e6bd7574dba08530613e526aaee2a768
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 18 11:42:29 2011 +0200
Work on creation of JMS destinations with the normal "create child" workflow.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index f4ba9a0..6d4a0e2 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -242,14 +242,14 @@ public class Domain2Descriptor {
if (!((Map)operationMap.get("request-properties")).isEmpty()) {
Map<String,Object> map = (Map<String, Object>) operationMap.get("request-properties");
builder.append(" <parameters>\n");
- generatePropertiesForMap(builder, map);
+ generatePropertiesForMap(builder, map, true);
builder.append(" </parameters>\n");
}
if (!((Map)operationMap.get("reply-properties")).isEmpty()){
Map<String,Object> map = (Map<String, Object>) operationMap.get("reply-properties"); // TODO not sure -- perhaps for the java code?
builder.append(" <results>\n");
- generatePropertiesForMap(builder, map);
+ generatePropertiesForMap(builder, map, true);
builder.append(" </results>\n");
}
@@ -258,7 +258,7 @@ public class Domain2Descriptor {
System.out.println(builder.toString());
}
- private void generatePropertiesForMap(StringBuilder builder, Map<String, Object> map) {
+ private void generatePropertiesForMap(StringBuilder builder, Map<String, Object> map, boolean forceReadWrite) {
for (Map.Entry<String,Object> entry : map.entrySet()) {
Map<String, Object> entryValue = (Map<String, Object>) entry.getValue();
@@ -266,8 +266,7 @@ public class Domain2Descriptor {
Type type = getTypeFromProps(entryValue);
String typeString = getTypeStringForTypeAndName(type, entryKey);
- builder.append(generateProperty(4, entryValue,typeString, entryKey,getAccessType(
- entryValue)));
+ builder.append(generateProperty(4, entryValue,typeString, entryKey, null));
builder.append('\n');
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java
new file mode 100644
index 0000000..70bb5d7
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JmsComponent.java
@@ -0,0 +1,89 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.resource.CreateResourceStatus;
+import org.rhq.core.pluginapi.inventory.CreateResourceReport;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.Result;
+
+/**
+ * Component class for the JMS subsystem
+ * @author Heiko W. Rupp
+ */
+public class JmsComponent extends DomainComponent {
+
+ private final Log log = LogFactory.getLog(JmsComponent.class);
+
+ @Override
+ public CreateResourceReport createResource(CreateResourceReport report) {
+
+
+ Configuration resConf = report.getResourceConfiguration();
+ Configuration pConf = report.getPluginConfiguration();
+
+ String type = pConf.getSimpleValue("path", "");
+
+ List<PROPERTY_VALUE> address = pathToAddress(getPath());
+ address.add(new PROPERTY_VALUE(type,report.getUserSpecifiedResourceName()));
+ Operation op = new Operation("add",address);
+ for (Map.Entry<String, Property> entry: resConf.getAllProperties().entrySet()) {
+ Property value = entry.getValue();
+ if (value !=null) {
+
+ if (value instanceof PropertySimple) {
+ PropertySimple ps = (PropertySimple) value;
+ op.addAdditionalProperty(entry.getKey(), ps.getStringValue()); // TODO determine real type
+ } else if (value instanceof PropertyList) {
+ PropertyList propertyList = (PropertyList) value;
+ List<String> list = new ArrayList<String>();
+ for (Property p : propertyList.getList()) {
+ list.add(p.toString()); // TODO
+ }
+ op.addAdditionalProperty(entry.getKey(),list);
+ }
+ }
+ }
+ ComplexResult res = (ComplexResult) getASConnection().execute(op,true);
+
+ if (res == null || !res.isSuccess()) {
+ report.setStatus(CreateResourceStatus.FAILURE);
+ } else {
+ report.setStatus(CreateResourceStatus.SUCCESS);
+ report.setResourceKey(address.toString()); // TODO ??
+ report.setResourceName(report.getUserSpecifiedResourceName());
+ }
+
+ System.out.println(report);
+ return report;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index b0089f7..574e8cb 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -392,6 +392,7 @@
<c:simple-property name="path" readOnly="true" default="connector"/>
</plugin-configuration>
</service>
+<!-- this is no child resource
<service name="HQueue"
discovery="SubsystemDiscovery"
class="BaseComponent"
@@ -406,11 +407,12 @@
</resource-configuration>
</service>
+-->
</server>
<server name="JMS"
discovery="SubsystemDiscovery"
- class="DomainComponent"
+ class="JmsComponent"
description="The JMS messaging subsystem"
singleton="true"
>
@@ -425,23 +427,57 @@
<service name="Queue"
discovery="SubsystemDiscovery"
- class="BaseComponent"
+ class="JmsComponent"
+ createDeletePolicy="both"
>
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="queue"/>
</plugin-configuration>
+ <resource-configuration> <!-- See BZ 705713 TODO -->
+ <c:simple-property name="durable" required="false" type="boolean" readOnly="false" default="false"
+ description="Whether the queue is durable or not."/>
+ <c:list-property name="entries" required="false" readOnly="false"
+ description="The jndi names the queue will be bound to.">
+ <c:simple-property name="entries" type="string"/>
+ </c:list-property>
+ <c:simple-property name="selector" required="false" type="string" readOnly="false" description="The queue selector."/>
+ <c:template name="add" description="Properties when adding a new queue" >
+ <c:simple-property name="durable" required="false" type="boolean" default="false"
+ description="Whether the queue is durable or not."/>
+ <c:list-property name="entries" required="false"
+ description="The jndi names the queue will be bound to.">
+ <c:simple-property name="entries" type="string"/>
+ </c:list-property>
+ <c:simple-property name="selector" required="false" type="string" description="The queue selector."/>
+ </c:template>
+ </resource-configuration>
</service>
<service name="Topic"
discovery="SubsystemDiscovery"
- class="BaseComponent"
+ class="JmsComponent"
+ createDeletePolicy="both"
>
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="topic"/>
</plugin-configuration>
+ <resource-configuration> <!-- See BZ 705713 TODO -->
+ <c:list-property name="entries" required="false" readOnly="false"
+ description="The jndi names the queue will be bound to.">
+ <c:simple-property name="entries" type="string"/>
+ </c:list-property>
+ <c:template name="add" description="Template when adding a Topic">
+ <!--<c:list-property name="entries" required="false"-->
+ <!--description="The jndi names the queue will be bound to.">-->
+ <c:simple-property name="entries" type="string"/>
+ <c:simple-property name="foobar" required="false" />
+ <!--</c:list-property>-->
+ </c:template>
+ </resource-configuration>
</service>
<service name="Connection-Factory"
discovery="SubsystemDiscovery"
- class="BaseComponent"
+ class="JmsComponent"
+ createDeletePolicy="both"
>
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="connection-factory"/>
@@ -542,17 +578,30 @@
<c:simple-property name="default-web-module" type="string" readOnly="true" defaultValue="ROOT.war"
description="The web module deployment name that will be mapped as the root webapp."/>
<c:map-property name="access-log" description="The access log configuration for this virtual server." >
- <c:simple-property name="pattern" type="string" readOnly="true" defaultValue="common" description="The access log pattern."/>
- <c:simple-property name="resolve-hosts" type="boolean" readOnly="true" defaultValue="false" description="Host resolution."/>
- <c:simple-property name="extended" type="boolean" readOnly="true" defaultValue="false"
+ <c:simple-property name="pattern" type="string" readOnly="true" defaultValue="common" required="false" description="The access log pattern."/>
+ <c:simple-property name="resolve-hosts" type="boolean" readOnly="true" defaultValue="false" required="false" description="Host resolution."/>
+ <c:simple-property name="extended" type="boolean" readOnly="true" defaultValue="false" required="false"
description="Enable extended pattern, with more options."/>
- <c:simple-property name="prefix" type="string" readOnly="true" description="Prefix for the log file name."/>
- <c:simple-property name="rotate" type="boolean" readOnly="true" defaultValue="true" description="Rotate the access log every day."/>
- <!--<c:simple-property name="directory" description="The location for the access logging." />-->
+ <c:simple-property name="prefix" type="string" readOnly="true" required="false" description="Prefix for the log file name."/>
+ <c:simple-property name="rotate" type="boolean" readOnly="true" defaultValue="true" required="false" description="Rotate the access log every day."/>
+ <c:map-property name="directory" description="The location for the access logging." required="false" >
+ <c:simple-property name="path" required="false" type="string" readOnly="true" description="The relative folder path."/>
+ <c:simple-property name="relative-to" required="false" type="string" readOnly="true"
+ description="The folder the path is relative to."/>
+ </c:map-property>
</c:map-property>
- <!--<c:list-property name="rewrite" >-->
- <!--<c:simple-property name="rewrite" />-->
- <!--</c:list-property>-->
+ <c:list-property name="rewrite" description="A list of rewrite rules that will be processed in order on the URL or vhost specified in the request." >
+ <c:map-property name="rewrite">
+
+ <c:simple-property name="pattern" required="false" type="string" readOnly="true" description="The pattern that will be matched."/>
+ <c:simple-property name="substitution" required="false" type="string" readOnly="true"
+ description="The string that will replace the original URL or vhost."/>
+ <c:simple-property name="flags" required="false" type="string" readOnly="true" description="Option flags for this rewrite rule."/>
+ <c:list-property name="condition" description="A list of conditions this rule needs to match for rewrite to occur." >
+ <c:simple-property name="condition" />
+ </c:list-property>
+ </c:map-property>
+ </c:list-property>
</resource-configuration>
</service>
@@ -756,6 +805,60 @@
</server>
+ <server name="Logging"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="subsystem=logging"/>
+ </plugin-configuration>
+ </server>
+
+ <server name="Security"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="subsystem=security"/>
+ </plugin-configuration>
+
+
+
+ <resource-configuration>
+ <c:simple-property name="authentication-manager-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="Specifies the AuthenticationManager implementation class name to use. To use the container default set the value to 'default'"/>
+ <c:simple-property name="deep-copy-subject-mode" required="false" type="boolean" readOnly="true" defaultValue="false"
+ description="Sets the copy mode of subjects done by the security managers to be deep copies that makes copies of the subject principals and credentials if they are cloneable. It should be set to true if subject include mutable content that can be corrupted when multiple threads have the same identity and cache flushes/logout clearing the subject in one thread results in subject references affecting other threads."/>
+ <c:simple-property name="default-callback-handler-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="A global class name for the CallbackHandler implementation to be used with login modules. To use the container default set the value to 'default'"/>
+ <c:simple-property name="subject-factory-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="Sets the class name for the SubjectFactory implementation to be used. To use the container default set the value to 'default'."/>
+ <c:simple-property name="authorization-manager-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="Specifies the AuthorizationManager implementation class name to use. To use the container default set the value to 'default'."/>
+ <c:simple-property name="audit-manager-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="Specifies the AuditManager implementation class name to use. To use the container default set the value to 'default'."/>
+ <c:simple-property name="identity-trust-manager-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="Specifies the IdentityTrustManager implementation class name to use. To use the container default set the value to 'default'."/>
+ <c:simple-property name="mapping-manager-class-name" required="false" type="string" readOnly="true" defaultValue="default"
+ description="Specifies the MappingManager implementation class name to use. To use the container default set the value to 'default''."/>
+ </resource-configuration>
+
+ </server>
+
<server name="Threads"
discovery="SubsystemDiscovery"
class="BaseComponent"
commit cb3803400824fa0ffcca5fd6b0141973a8316025
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 16 18:00:11 2011 +0200
Add support for operations.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index 11d7fe4..f4ba9a0 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -48,13 +48,15 @@ public class Domain2Descriptor {
private void run(String[] args) {
- boolean doMetrics = false;
+ Mode mode = null;
int pos = 0;
if (args[0].startsWith("-")) {
if (args[0].equals("-m"))
- doMetrics = true;
+ mode = Domain2Descriptor.Mode.METRICS;
else if (args[0].equals("-p"))
- doMetrics = false;
+ mode = Domain2Descriptor.Mode.PROPERTIES;
+ else if (args[0].equals("-o"))
+ mode = Domain2Descriptor.Mode.OPERATION;
else {
usage();
return;
@@ -70,39 +72,55 @@ public class Domain2Descriptor {
ASConnection conn = new ASConnection("localhost",9990);
List<PROPERTY_VALUE> address = pathToAddress(path);
- Operation op = new Operation("read-resource-description",address); // ,"operations",true);
+ Operation op = new Operation("read-resource-description",address);
op.addAdditionalProperty("recursive","true");
- if (doMetrics)
+
+ if (mode==Domain2Descriptor.Mode.OPERATION)
+ op.addAdditionalProperty("operations",true);
+ if (mode == Domain2Descriptor.Mode.METRICS)
op.addAdditionalProperty("include-runtime",true);
+
ComplexResult res = (ComplexResult) conn.execute(op,true);
if (!res.isSuccess()) {
System.err.println("Failure: " + res.getFailureDescription());
return;
}
- Map<String,Object> attributesMap;
Map<String,Object> resMap = res.getResult();
- if (childType!=null) {
- Map childMap = (Map) resMap.get("children");
- Map <String,Object> typeMap = (Map<String, Object>) childMap.get(childType);
- Map descriptionMap = (Map) typeMap.get("model-description");
- if (descriptionMap==null) {
- System.err.println("No model description found");
- return;
+ if (mode==Domain2Descriptor.Mode.OPERATION) {
+ Map<String,Object> operationsMap = (Map<String, Object>) resMap.get("operations");
+ for (Map.Entry<String,Object> entry : operationsMap.entrySet()) {
+ if (entry.getKey().startsWith("read-"))
+ continue;
+ if (entry.getKey().equals("write-attribute"))
+ continue;
+
+ createOperation((Map<String,Object>)entry.getValue());
}
- Map starMap = (Map) descriptionMap.get("*");
- attributesMap = (Map<String, Object>) starMap.get("attributes");
- }
- else {
- attributesMap = (Map<String, Object>) resMap.get("attributes");
- }
- createProperties(doMetrics, attributesMap, 0);
+ } else {
+ Map<String,Object> attributesMap;
+ if (childType!=null) {
+ Map childMap = (Map) resMap.get("children");
+ Map <String,Object> typeMap = (Map<String, Object>) childMap.get(childType);
+ Map descriptionMap = (Map) typeMap.get("model-description");
+ if (descriptionMap==null) {
+ System.err.println("No model description found");
+ return;
+ }
+ Map starMap = (Map) descriptionMap.get("*");
+ attributesMap = (Map<String, Object>) starMap.get("attributes");
+ }
+ else {
+ attributesMap = (Map<String, Object>) resMap.get("attributes");
+ }
+ createProperties(mode, attributesMap, 0);
+ }
}
- private void createProperties(boolean doMetrcis, Map<String, Object> attributesMap, int indent) {
+ private void createProperties(Mode mode, Map<String, Object> attributesMap, int indent) {
if (attributesMap==null)
return;
@@ -121,7 +139,7 @@ public class Domain2Descriptor {
Map<String, Object> attributesMap1 = (Map<String, Object>) props.get(
"attributes");
if (attributesMap1!=null)
- createProperties(doMetrcis,
+ createProperties(mode,
attributesMap1, indent+4);
else {
for (Map.Entry<String,Object> emapEntry : props.entrySet()) {
@@ -143,7 +161,7 @@ public class Domain2Descriptor {
}
- if (ptype== Type.LIST && !doMetrcis) {
+ if (ptype== Type.LIST && mode!=Domain2Descriptor.Mode.METRICS) {
StringBuilder sb = new StringBuilder("<c:list-property name=\"");
sb.append(entryName);
@@ -160,7 +178,7 @@ public class Domain2Descriptor {
doIndent(indent,sb);
sb.append("<c:map-property name=\"").append(entryName).append("\">\n");
System.out.println(sb.toString());
- createProperties(doMetrcis, (Map<String, Object>) props.get("attributes"), indent + 4);
+ createProperties(mode, (Map<String, Object>) props.get("attributes"), indent + 4);
sb = new StringBuilder();
doIndent(indent,sb);
sb.append("</c:map-property>\n");
@@ -174,7 +192,7 @@ public class Domain2Descriptor {
}
String accessType = getAccessType(props);
- if (doMetrcis) {
+ if (mode==Domain2Descriptor.Mode.METRICS) {
if (!accessType.equals("metric"))
continue;
@@ -206,6 +224,54 @@ public class Domain2Descriptor {
}
}
+ private void createOperation(Map<String,Object> operationMap) {
+
+ StringBuilder builder = new StringBuilder("<operation name=\"");
+
+ String name = (String) operationMap.get("operation-name");
+ builder.append(name).append('"');
+
+ String description = (String) operationMap.get("description");
+ if (description!=null && !description.isEmpty()) {
+ builder.append(" description=\"").append(description).append('"');
+ }
+ builder.append(">\n");
+
+
+
+ if (!((Map)operationMap.get("request-properties")).isEmpty()) {
+ Map<String,Object> map = (Map<String, Object>) operationMap.get("request-properties");
+ builder.append(" <parameters>\n");
+ generatePropertiesForMap(builder, map);
+ builder.append(" </parameters>\n");
+
+ }
+ if (!((Map)operationMap.get("reply-properties")).isEmpty()){
+ Map<String,Object> map = (Map<String, Object>) operationMap.get("reply-properties"); // TODO not sure -- perhaps for the java code?
+ builder.append(" <results>\n");
+ generatePropertiesForMap(builder, map);
+ builder.append(" </results>\n");
+ }
+
+
+ builder.append("</operation>\n");
+ System.out.println(builder.toString());
+ }
+
+ private void generatePropertiesForMap(StringBuilder builder, Map<String, Object> map) {
+ for (Map.Entry<String,Object> entry : map.entrySet()) {
+
+ Map<String, Object> entryValue = (Map<String, Object>) entry.getValue();
+ String entryKey = entry.getKey();
+
+ Type type = getTypeFromProps(entryValue);
+ String typeString = getTypeStringForTypeAndName(type, entryKey);
+ builder.append(generateProperty(4, entryValue,typeString, entryKey,getAccessType(
+ entryValue)));
+ builder.append('\n');
+ }
+ }
+
private String getAccessType(Map<String, Object> props) {
String accessType = (String) props.get("access-type");
if (accessType==null)
@@ -340,4 +406,11 @@ public class Domain2Descriptor {
;
}
+ private enum Mode {
+ METRICS,
+ PROPERTIES,
+ OPERATION
+ ;
+ }
+
}
commit f4c7cf499cf6ffa9296e21333f88c137d2bc87a7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 16 13:45:31 2011 +0200
Prevent possible NPE
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index 088a3b7..11d7fe4 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -87,6 +87,10 @@ public class Domain2Descriptor {
Map childMap = (Map) resMap.get("children");
Map <String,Object> typeMap = (Map<String, Object>) childMap.get(childType);
Map descriptionMap = (Map) typeMap.get("model-description");
+ if (descriptionMap==null) {
+ System.err.println("No model description found");
+ return;
+ }
Map starMap = (Map) descriptionMap.get("*");
attributesMap = (Map<String, Object>) starMap.get("attributes");
}
commit 177b2a3e0bc8d078757044df0e51a1f1b369c98d
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 16 12:03:02 2011 +0200
Some handling for maps of maps.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 22aa90b..ccdd235 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -25,6 +25,7 @@ import org.codehaus.jackson.map.ObjectMapper;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
@@ -330,9 +331,29 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
Map<String,PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
for (Map.Entry<String,PropertyDefinition> maEntry : memberDefMap.entrySet()) {
JsonNode valueNode = json.findValue(maEntry.getKey());
- PropertySimple p = putProperty(valueNode, maEntry.getValue());
- System.out.println(p);
- pm.put(p);
+ Property p;
+ if (maEntry.getValue() instanceof PropertyDefinitionSimple) {
+ p = putProperty(valueNode, maEntry.getValue());
+ pm.put(p);
+ }
+ else if (maEntry.getValue() instanceof PropertyDefinitionMap) { // TODO make this recursive?
+
+ PropertyDefinitionMap pdm = (PropertyDefinitionMap) maEntry.getValue();
+ Map<String,PropertyDefinition> mmDefMap = pdm.getPropertyDefinitions();
+ for (Map.Entry<String,PropertyDefinition> mmDefEntry : mmDefMap.entrySet()) {
+ if (valueNode!=null) {
+ JsonNode node2 = valueNode.findValue(mmDefEntry.getKey());
+ System.err.println("Map not yet implemented " + node2.toString());
+ }
+ else
+ System.err.println("Value node was null " );
+ }
+ }
+ else { // PropDefList
+ System.err.println("List not yet implemented");
+ }
+
+// pm.put(p);
}
ret.put(pm);
}
commit b4c2894cc92a4127503f1d9f1c4675988a6cf44b
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 13 14:42:09 2011 +0200
Better handling of lists of maps.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index ac57b57..088a3b7 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -114,13 +114,13 @@ public class Domain2Descriptor {
if (ptype == Type.OBJECT) {
System.out.println("<c:map-property name=\"" + entryName +"\" description=\"" +
props.get("description") + "\" >");
- Map<String, Object> attributesMap1 = (Map<String, Object>) ((Map<String, Object>) entry.getValue()).get(
+ Map<String, Object> attributesMap1 = (Map<String, Object>) props.get(
"attributes");
if (attributesMap1!=null)
createProperties(doMetrcis,
attributesMap1, indent+4);
else {
- for (Map.Entry<String,Object> emapEntry : ((Map<String,Object>)entry.getValue()).entrySet()) {
+ for (Map.Entry<String,Object> emapEntry : props.entrySet()) {
String key = emapEntry.getKey();
if (key.equals("type") || key.equals("description") || key.equals("required"))
continue;
@@ -141,10 +141,29 @@ public class Domain2Descriptor {
if (ptype== Type.LIST && !doMetrcis) {
- System.out.println("<c:list-property name=\"" + entryName +"\" >");
- System.out.println(" <c:simple-property name=\"" + entryName + "\" />");
- System.out.println("</c:list-property>");
+ StringBuilder sb = new StringBuilder("<c:list-property name=\"");
+ sb.append(entryName);
+ sb.append("\"");
+ if (props.containsKey("description")) {
+ sb.append(" description=\"");
+ sb.append(props.get("description"));
+ sb.append("\"");
+ }
+ sb.append(" >\n");
+ if (!props.containsKey("attributes"))
+ sb.append(" <c:simple-property name=\"").append(entryName).append("\" />\n");
+ else {
+ doIndent(indent,sb);
+ sb.append("<c:map-property name=\"").append(entryName).append("\">\n");
+ System.out.println(sb.toString());
+ createProperties(doMetrcis, (Map<String, Object>) props.get("attributes"), indent + 4);
+ sb = new StringBuilder();
+ doIndent(indent,sb);
+ sb.append("</c:map-property>\n");
+ }
+ sb.append("</c:list-property>");
+ System.out.println(sb.toString());
continue;
commit c308e4477615f11cfae09d93fc486e34622b71f8
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 13 11:24:29 2011 +0200
Support embedded maps.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index cef3d9e..ac57b57 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -106,42 +106,43 @@ public class Domain2Descriptor {
Map<String,Object> props = (Map<String, Object>) entry.getValue();
+ String entryName = entry.getKey();
Type ptype = getTypeFromProps(props);
- String typeString;
-
- switch (ptype) {
- case INT:
- typeString = "integer"; break;
- case STRING:
- typeString = "string"; break;
- case BOOLEAN:
- typeString = "boolean"; break;
- case LONG:
- typeString = "long"; break;
- case BIG_DECIMAL:
- typeString = "long"; break; // TODO better float or double?
- case LIST:
- typeString = "-list-";
- break; // Handled below
- case OBJECT: // an embedded map
- typeString = "-object-";
- System.out.println("<c:list-property name=\"" + entry.getKey() +"\" description=\"" +
+ String typeString = getTypeStringForTypeAndName(ptype, entryName);
+
+ if (ptype == Type.OBJECT) {
+ System.out.println("<c:map-property name=\"" + entryName +"\" description=\"" +
props.get("description") + "\" >");
- createProperties(doMetrcis,
- (Map<String, Object>) ((Map<String, Object>) entry.getValue()).get("attributes"), indent+4);
- System.out.println("</c:list-property>");
+ Map<String, Object> attributesMap1 = (Map<String, Object>) ((Map<String, Object>) entry.getValue()).get(
+ "attributes");
+ if (attributesMap1!=null)
+ createProperties(doMetrcis,
+ attributesMap1, indent+4);
+ else {
+ for (Map.Entry<String,Object> emapEntry : ((Map<String,Object>)entry.getValue()).entrySet()) {
+ String key = emapEntry.getKey();
+ if (key.equals("type") || key.equals("description") || key.equals("required"))
+ continue;
+
+ Map<String,Object> emapEntryValue = (Map<String, Object>) emapEntry.getValue();
+ String ts = getTypeStringForTypeAndName(getTypeFromProps(emapEntryValue),key);
+ StringBuilder sb = generateProperty(indent, emapEntryValue,ts,emapEntry.getKey(),getAccessType(emapEntryValue));
+ System.out.println(sb.toString());
+
+ }
+ }
+
+ System.out.println("</c:map-property>");
continue;
- default:
- typeString = "- unknown -";
- System.err.println("Unknown type " + ptype + " for " + entry.getKey());
+
}
if (ptype== Type.LIST && !doMetrcis) {
- System.out.println("<c:list-property name=\"" + entry.getKey() +"\" >");
- System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
+ System.out.println("<c:list-property name=\"" + entryName +"\" >");
+ System.out.println(" <c:simple-property name=\"" + entryName + "\" />");
System.out.println("</c:list-property>");
@@ -149,9 +150,7 @@ public class Domain2Descriptor {
continue;
}
- String accessType = (String) props.get("access-type");
- if (accessType==null)
- accessType = "read-only"; // default of as7
+ String accessType = getAccessType(props);
if (doMetrcis) {
if (!accessType.equals("metric"))
continue;
@@ -159,7 +158,7 @@ public class Domain2Descriptor {
StringBuilder sb = new StringBuilder();
doIndent(indent,sb);
sb.append("<metric property=\"");
- sb.append(entry.getKey()).append('"');
+ sb.append(entryName).append('"');
if (ptype== Type.STRING)
sb.append(" dataType=\"trait\"");
@@ -177,43 +176,83 @@ public class Domain2Descriptor {
if (accessType.equals("metric"))
continue;
- StringBuilder sb = new StringBuilder();
- doIndent(indent,sb);
- sb.append("<c:simple-property name=\"");
- sb.append(entry.getKey()).append('"');
+ StringBuilder sb = generateProperty(indent, props, typeString, entryName, accessType);
- Object required = props.get("required");
- if (required != null && (Boolean) required) {
- sb.append(" required=\"true\"");
- }
- else {
- sb.append(" required=\"false\"");
- }
+ System.out.println(sb.toString());
+ }
+ }
+ }
- sb.append(" type=\"").append(typeString).append("\"");
- sb.append(" readOnly=\"");
- if (accessType!=null && accessType.equals("read-only")) // TODO if no access-type is given, the one from the parent applies
- sb.append("true");
- else
- sb.append("false");
- sb.append('"');
-
- Object defVal = props.get("default");
- if (defVal!=null) {
- sb.append(" defaultValue=\"").append(defVal).append('\"');
- }
+ private String getAccessType(Map<String, Object> props) {
+ String accessType = (String) props.get("access-type");
+ if (accessType==null)
+ accessType = "read-only"; // default of as7
+ return accessType;
+ }
- String description = (String) props.get("description");
- if (description!=null) {
- if (sb.length()+description.length() > 120)
- sb.append("\n ");
- sb.append(" description=\"").append(description).append('"');
- }
- sb.append("/>");
+ private String getTypeStringForTypeAndName(Type ptype, String entryName) {
+ String typeString;
+
+ switch (ptype) {
+ case INT:
+ typeString = "integer"; break;
+ case STRING:
+ typeString = "string"; break;
+ case BOOLEAN:
+ typeString = "boolean"; break;
+ case LONG:
+ typeString = "long"; break;
+ case BIG_DECIMAL:
+ typeString = "long"; break; // TODO better float or double?
+ case LIST:
+ typeString = "-list-";
+ break; // Handled below
+ case OBJECT: // an embedded map
+ typeString = "-object-";
+ break; // Handled below
+ default:
+ typeString = "- unknown -";
+ System.err.println("Unknown type " + ptype + " for " + entryName);
+ }
+ return typeString;
+ }
- System.out.println(sb.toString());
- }
+ private StringBuilder generateProperty(int indent, Map<String, Object> props, String typeString, String entryName,
+ String accessType) {
+ StringBuilder sb = new StringBuilder();
+ doIndent(indent,sb);
+ sb.append("<c:simple-property name=\"");
+ sb.append(entryName).append('"');
+
+ Object required = props.get("required");
+ if (required != null && (Boolean) required) {
+ sb.append(" required=\"true\"");
+ }
+ else {
+ sb.append(" required=\"false\"");
+ }
+
+ sb.append(" type=\"").append(typeString).append("\"");
+ sb.append(" readOnly=\"");
+ if (accessType!=null && accessType.equals("read-only")) // TODO if no access-type is given, the one from the parent applies
+ sb.append("true");
+ else
+ sb.append("false");
+ sb.append('"');
+
+ Object defVal = props.get("default");
+ if (defVal!=null) {
+ sb.append(" defaultValue=\"").append(defVal).append('\"');
+ }
+
+ String description = (String) props.get("description");
+ if (description!=null) {
+ if (sb.length()+description.length() > 120)
+ sb.append("\n ");
+ sb.append(" description=\"").append(description).append('"');
}
+ sb.append("/>");
+ return sb;
}
private void doIndent(int indent, StringBuilder sb) {
commit 8ad8f978ec24bbd9e32e91e72f5985418645fc32
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 12 16:55:15 2011 +0200
More properties for the web subsystem and better handling of properties.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index a73179a..22aa90b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -205,7 +205,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
else {
// property is null? Check if it is required
if (propDef.isRequired()) {
- propertySimple = new PropertySimple(propDef.getName(),null);
+ String defaultValue = ((PropertyDefinitionSimple) propDef).getDefaultValue();
+ propertySimple = new PropertySimple(propDef.getName(),defaultValue);
ret.put(propertySimple);
}
}
@@ -312,11 +313,11 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
else if (memberDefinition instanceof PropertyDefinitionSimple) {
String name = memberDefinition.getName();
- Iterator<String> keys = sub.getFieldNames();
+ Iterator<JsonNode> keys = sub.getElements();
while(keys.hasNext()) {
- String entryKey = keys.next();
+ JsonNode entry = keys.next();
- PropertySimple propertySimple = new PropertySimple(name,entryKey);
+ PropertySimple propertySimple = new PropertySimple(name,entry.getTextValue());
propertyList.add(propertySimple);
}
}
@@ -329,7 +330,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
Map<String,PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
for (Map.Entry<String,PropertyDefinition> maEntry : memberDefMap.entrySet()) {
JsonNode valueNode = json.findValue(maEntry.getKey());
- PropertySimple p = putProperty(valueNode,maEntry.getValue());
+ PropertySimple p = putProperty(valueNode, maEntry.getValue());
System.out.println(p);
pm.put(p);
}
@@ -345,6 +346,16 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
String name = def.getName();
PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
PropertySimple ps;
+
+ if (value==null) {
+ if (def instanceof PropertyDefinitionSimple) {
+ PropertyDefinitionSimple pds = (PropertyDefinitionSimple) def;
+ return new PropertySimple(name,pds.getDefaultValue());
+ }
+ else
+ return new PropertySimple(name,null);
+ }
+
switch (type) {
case BOOLEAN:
ps = new PropertySimple(name,value.getBooleanValue());
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index d61f963..cef3d9e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -141,7 +141,7 @@ public class Domain2Descriptor {
if (ptype== Type.LIST && !doMetrcis) {
System.out.println("<c:list-property name=\"" + entry.getKey() +"\" >");
- System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
+ System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
System.out.println("</c:list-property>");
@@ -173,7 +173,7 @@ public class Domain2Descriptor {
System.out.println(sb.toString());
}
- else {
+ else { // configuration
if (accessType.equals("metric"))
continue;
@@ -186,6 +186,9 @@ public class Domain2Descriptor {
if (required != null && (Boolean) required) {
sb.append(" required=\"true\"");
}
+ else {
+ sb.append(" required=\"false\"");
+ }
sb.append(" type=\"").append(typeString).append("\"");
sb.append(" readOnly=\"");
@@ -197,7 +200,7 @@ public class Domain2Descriptor {
Object defVal = props.get("default");
if (defVal!=null) {
- sb.append(" default=\"").append(defVal).append('\"');
+ sb.append(" defaultValue=\"").append(defVal).append('\"');
}
String description = (String) props.get("description");
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index bbd7ba3..b0089f7 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -482,9 +482,48 @@
<metric property="requestCount" measurementType="trendsup" displayType="summary"/>
<resource-configuration>
- <c:simple-property name="protocol" required="false" description="The web connector protocol."/>
- <c:simple-property name="socket-binding" required="false" description="The web connector socket-binding reference, this connector should be bound to."/>
- <c:simple-property name="scheme" required="false" description="The web connector scheme"/>
+ <c:simple-property name="protocol" required="true" type="string" readOnly="true" description="The web connector protocol."/>
+ <c:simple-property name="socket-binding" required="true" type="string" readOnly="true"
+ description="The web connector socket-binding reference, this connector should be bound to."/>
+ <c:simple-property name="scheme" type="string" readOnly="true" default="http" description="The web connector scheme."/>
+ <c:simple-property name="executor" type="string" readOnly="true" required="false"
+ description="The name of the executor that should be used for the processing threads of this connector. Defaults to using an internal pool."/>
+ <c:simple-property name="enabled" type="boolean" readOnly="true" defaultValue="true"
+ description="Defines whether the connector should be started on startup."/>
+ <c:simple-property name="enable-lookups" type="boolean" readOnly="true" defaultValue="false"
+ description="Enable DNS lookups for Servlet API."/>
+ <c:simple-property name="proxy-name" type="string" readOnly="true" required="false"
+ description="The host name that will be used when sending a redirect. The default value is null."/>
+ <c:simple-property name="proxy-port" type="integer" readOnly="true" required="false"
+ description="The port that will be used when sending a redirect."/>
+ <c:simple-property name="max-post-size" type="integer" readOnly="true" defaultValue="2097152"
+ description="Maximum size in bytes of a POST request that can be parsed by the container."/>
+ <c:simple-property name="max-save-post-size" type="integer" readOnly="true" defaultValue="4096"
+ description="Maximum size in bytes of a POST request that will be saved during certain authentication schemes."/>
+ <c:simple-property name="secure" type="boolean" readOnly="true" defaultValue="false"
+ description="Indicates if content sent or recieved by the connector is secured from the user perspective."/>
+ <c:simple-property name="redirect-port" type="integer" readOnly="true" defaultValue="8443"
+ description="The port for redirection to a secure connector."/>
+ <c:simple-property name="max-connections" type="integer" readOnly="true" required="false"
+ description="Amount of concurrent connections that can be processed by the connector with optimum performance. The default value depends on the connector used."/>
+ <c:list-property name="virtual-server" description="The list of virtual servers that can be accessed through this connector. The default is to allow all virtual servers.">
+ <c:simple-property name="virtual-server" />
+ </c:list-property>
+ <c:map-property name="ssl" description="The SSL configuration of the connector." >
+ <c:simple-property name="name" type="string" readOnly="true" description="The configuration name."/>
+ <c:simple-property name="key-alias" type="string" readOnly="true" description="The key alias."/>
+ <c:simple-property name="password" type="string" readOnly="true" description="Password."/>
+ <c:simple-property name="certificate-key-file" type="string" readOnly="true" description="Key file for the certificate."/>
+ <c:simple-property name="cipher-suite" type="string" readOnly="true" description="The allowed cipher suite."/>
+ <c:simple-property name="protocol" type="string" readOnly="true" description="The SSL protocols that are enabled."/>
+ <c:simple-property name="verify-client" type="string" readOnly="true" description="Enable client certificate verification."/>
+ <c:simple-property name="verify-depth" type="integer" readOnly="true" description="Limit certificate nesting."/>
+ <c:simple-property name="certificate-file" type="string" readOnly="true" description="Server certificate file."/>
+ <c:simple-property name="ca-certificate-file" type="string" readOnly="true" description="Certificate authority."/>
+ <c:simple-property name="ca-revocation-url" type="string" readOnly="true" description="Certificate authority revocation list."/>
+ <c:simple-property name="session-cache-size" type="string" readOnly="true" description="SSL session cache."/>
+ <c:simple-property name="session-timeout" type="string" readOnly="true" description="SSL session cache timeout."/>
+ </c:map-property>
</resource-configuration>
</service>
@@ -497,13 +536,24 @@
</plugin-configuration>
<resource-configuration>
- <c:simple-property name="access-log"/>
- <c:list-property name="alias" description="The virtual server aliases">
- <c:simple-property name="alias"/>
+ <c:list-property name="alias" >
+ <c:simple-property name="alias" />
</c:list-property>
- <c:simple-property name="rewrite"/>
+ <c:simple-property name="default-web-module" type="string" readOnly="true" defaultValue="ROOT.war"
+ description="The web module deployment name that will be mapped as the root webapp."/>
+ <c:map-property name="access-log" description="The access log configuration for this virtual server." >
+ <c:simple-property name="pattern" type="string" readOnly="true" defaultValue="common" description="The access log pattern."/>
+ <c:simple-property name="resolve-hosts" type="boolean" readOnly="true" defaultValue="false" description="Host resolution."/>
+ <c:simple-property name="extended" type="boolean" readOnly="true" defaultValue="false"
+ description="Enable extended pattern, with more options."/>
+ <c:simple-property name="prefix" type="string" readOnly="true" description="Prefix for the log file name."/>
+ <c:simple-property name="rotate" type="boolean" readOnly="true" defaultValue="true" description="Rotate the access log every day."/>
+ <!--<c:simple-property name="directory" description="The location for the access logging." />-->
+ </c:map-property>
+ <!--<c:list-property name="rewrite" >-->
+ <!--<c:simple-property name="rewrite" />-->
+ <!--</c:list-property>-->
</resource-configuration>
-
</service>
commit 3823cbfce3711e0903dcd2288a6b95899859a7d7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 12 14:45:27 2011 +0200
Bumb version to follow master.
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index 38cdfa0..7593f18 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -10,7 +10,7 @@
<parent>
<groupId>org.rhq</groupId>
<artifactId>rhq-plugins-parent</artifactId>
- <version>4.0.0-SNAPSHOT</version>
+ <version>4.1.0-SNAPSHOT</version>
</parent>
<groupId>org.rhq</groupId>
commit c600bb6926683ee771ca11a3d1b69cd6722088f0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 12 13:06:13 2011 +0200
Support default values if provided.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index ab317dc..d61f963 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -48,13 +48,13 @@ public class Domain2Descriptor {
private void run(String[] args) {
- boolean doMetrcis = false;
+ boolean doMetrics = false;
int pos = 0;
if (args[0].startsWith("-")) {
if (args[0].equals("-m"))
- doMetrcis = true;
+ doMetrics = true;
else if (args[0].equals("-p"))
- doMetrcis = false;
+ doMetrics = false;
else {
usage();
return;
@@ -72,7 +72,7 @@ public class Domain2Descriptor {
List<PROPERTY_VALUE> address = pathToAddress(path);
Operation op = new Operation("read-resource-description",address); // ,"operations",true);
op.addAdditionalProperty("recursive","true");
- if (doMetrcis)
+ if (doMetrics)
op.addAdditionalProperty("include-runtime",true);
ComplexResult res = (ComplexResult) conn.execute(op,true);
if (!res.isSuccess()) {
@@ -94,7 +94,7 @@ public class Domain2Descriptor {
attributesMap = (Map<String, Object>) resMap.get("attributes");
}
- createProperties(doMetrcis, attributesMap, 0);
+ createProperties(doMetrics, attributesMap, 0);
}
@@ -195,6 +195,11 @@ public class Domain2Descriptor {
sb.append("false");
sb.append('"');
+ Object defVal = props.get("default");
+ if (defVal!=null) {
+ sb.append(" default=\"").append(defVal).append('\"');
+ }
+
String description = (String) props.get("description");
if (description!=null) {
if (sb.length()+description.length() > 120)
commit 99e9fe5029899b1d53481b90ca8577ff9df8ac61
Merge: f751fc8 7d3d67f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 12 12:29:20 2011 +0200
Merge branch 'master' into as7plugin
commit f751fc8abe6f0562386fdfae5e2e3946e40abc03
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 12 09:36:58 2011 +0200
Get rid of some bogus stuff
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 3d4f335..bbd7ba3 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -156,9 +156,6 @@
</plugin-configuration>
- <content name="deployment" category="deployable" isCreationType="true" description="Deployments on this domain">
- </content>
-
<resource-configuration>
<c:simple-property name="profile" />
<c:simple-property name="socket-binding-group"/>
@@ -174,11 +171,10 @@
<c:simple-property name="path" default="deployment" readOnly="true"/>
</plugin-configuration>
- <content name="file" category="deployable" isCreationType="true" description="Deployments on this domain">
+ <content name="file" category="deployable" isCreationType="true" description="Deployments on this server group">
<configuration>
<c:group name="deployment" displayName="Deployment Options">
<c:simple-property name="runtimeName" required="true"/>
- <c:simple-property name="alreadyUploaded" type="boolean" description="Was this already uploaded to the Domain? TODO"/>
</c:group>
</configuration>
</content>
@@ -224,8 +220,14 @@
</plugin-configuration>
<content name="file" category="deployable" isCreationType="true" description="Deployments on this domain">
+ <configuration>
+ <c:group name="deployment" displayName="Deployment Options">
+ <c:simple-property name="runtimeName" required="true"/>
+ </c:group>
+ </configuration>
</content>
+
<resource-configuration>
<c:simple-property name="name" readOnly="true"/>
<c:simple-property name="runtime-name" readOnly="true"/>
commit e735bdab1e57ffbf8e8898ae37f4f0e9cedd9f08
Merge: 05bd876 a62f196
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 11 09:19:34 2011 +0200
Merge branch 'master' into as7plugin
commit 05bd876ef224ec81424a5892c4e48b0b80f31fb7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 11 09:17:30 2011 +0200
Prevent NPE if processInfo is null.
diff --git a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
index 9bd3859..d50f324 100644
--- a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
+++ b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
@@ -152,16 +152,18 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
NetworkStats stats = resourceContext.getSystemInformation().getNetworkStats("localhost", PORT);
-
- processInfo.refresh();
-
- for (MeasurementScheduleRequest request : metrics) {
- if (request.getName().startsWith("NetworkStat.")) {
- int val = stats.getByName(request.getName().substring("NetworkStat.".length()));
- report.addData(new MeasurementDataNumeric(request, (double) val));
- } else if (request.getName().startsWith("Process.")) {
- Double value = ObjectUtil.lookupDeepNumericAttributeProperty(processInfo, request.getName().substring("Process.".length()));
- report.addData(new MeasurementDataNumeric(request, value));
+
+ if (processInfo!=null) {
+ processInfo.refresh();
+
+ for (MeasurementScheduleRequest request : metrics) {
+ if (request.getName().startsWith("NetworkStat.")) {
+ int val = stats.getByName(request.getName().substring("NetworkStat.".length()));
+ report.addData(new MeasurementDataNumeric(request, (double) val));
+ } else if (request.getName().startsWith("Process.")) {
+ Double value = ObjectUtil.lookupDeepNumericAttributeProperty(processInfo, request.getName().substring("Process.".length()));
+ report.addData(new MeasurementDataNumeric(request, value));
+ }
}
}
}
@@ -269,7 +271,7 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
if (args != null) {
processExecution.setArguments(args.split(" "));
}
-
+
processExecution.setCaptureOutput(true);
processExecution.setWaitForCompletion(1000L);
processExecution.setKillOnTimeout(true);
commit 5a31be172085a5e029ae9fb0525de7516562042d
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue May 10 21:02:32 2011 +0200
Add datasource metrics and take care of the "no metrics available" response.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 72ab4dd..a73179a 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -151,16 +151,17 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
if (!res.isSuccess())
continue;
- String val = (String) res.getResult();
+ String val = (String) res.getResult();
if (req.getDataType()== DataType.MEASUREMENT) {
-
- try {
- Double d = Double.parseDouble(val);
- MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
- report.addData(data);
- } catch (NumberFormatException e) {
- log.warn("Non numeric input for [" + req.getName() + "] : [" + val + "]");
+ if (!val.equals("no metrics available")) { // AS 7 returns this
+ try {
+ Double d = Double.parseDouble(val);
+ MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
+ report.addData(data);
+ } catch (NumberFormatException e) {
+ log.warn("Non numeric input for [" + req.getName() + "] : [" + val + "]");
+ }
}
} else if (req.getDataType()== DataType.TRAIT) {
MeasurementDataTrait data = new MeasurementDataTrait(req,val);
@@ -196,12 +197,18 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
if (propDef instanceof PropertyDefinitionSimple) {
PropertySimple propertySimple;
- if (sub!=null)
+ if (sub!=null) {
+ // Property is non-null -> return it.
propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
+ ret.put(propertySimple);
+ }
else {
- propertySimple = new PropertySimple(propDef.getName(),"- null -"); // TODO store it at all when it is null?
+ // property is null? Check if it is required
+ if (propDef.isRequired()) {
+ propertySimple = new PropertySimple(propDef.getName(),null);
+ ret.put(propertySimple);
+ }
}
- ret.put(propertySimple);
} else if (propDef instanceof PropertyDefinitionList) {
PropertyList propertyList = new PropertyList(propDef.getName());
PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 50939ae..3d4f335 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -568,6 +568,28 @@
<c:simple-property name="path" readOnly="true" default="data-source"/>
</plugin-configuration>
+ <metric property="PreparedStatementCacheCurrentSize"
+ description="The number of prepared and callable statements currently cached in the statement cache"/>
+ <metric property="PreparedStatementCacheMissCount"
+ description="The number of times that a statement request could not be satisfied with a statement from the cache"/>
+ <metric property="PreparedStatementCacheAddCount" description="The number of statements added to the statement cache"/>
+ <metric property="PreparedStatementCacheAccessCount" description="The number of times that the statement cache was accessed"/>
+ <metric property="PreparedStatementCacheDeleteCount" description="The number of statements discarded from the cache"/>
+ <metric property="PreparedStatementCacheHitCount" description="The number of times that statements from the cache were used"/>
+ <metric property="AverageBlockingTime" description="The average time spent blocking for a connection"/>
+ <metric property="MaxWaitTime" description="The maximum wait time for a connection"/>
+ <metric property="ActiveCount" description="The active count"/>
+ <metric property="CreatedCount" description="The created count"/>
+ <metric property="MaxCreationTime" description="The maximum time for creating a physical connection"/>
+ <metric property="MaxWaitCount" description="The maximum number of threads waiting for a connection"/>
+ <metric property="TotalCreationTime" description="The total time spent creating physical connections"/>
+ <metric property="AvailableCount" description="The available count"/>
+ <metric property="MaxUsedCount" description="The maximum number of connections used"/>
+ <metric property="TimedOut" description="The timed out count"/>
+ <metric property="TotalBlockingTime" description="The total blocking time"/>
+ <metric property="AverageCreationTime" description="The average time spent creating a physical connection"/>
+ <metric property="DestroyedCount" description="The destroyed count"/>
+
<resource-configuration>
<c:simple-property name="connection-url" required="true" type="string" readOnly="true" description="The JDBC driver connection URL"/>
<c:simple-property name="driver-class" required="true" type="string" readOnly="true"
commit e2d2375fe00d761acf5805255c719bbd01cff397
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue May 10 18:29:33 2011 +0200
Metrics have no type
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index e61ff3c..ab317dc 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -160,7 +160,6 @@ public class Domain2Descriptor {
doIndent(indent,sb);
sb.append("<metric property=\"");
sb.append(entry.getKey()).append('"');
- sb.append(" type=\"").append(typeString).append("\"");
if (ptype== Type.STRING)
sb.append(" dataType=\"trait\"");
commit 9d9c11e54fcd7fccaac08c5d336aaef83bff8995
Merge: 33f3c42 ae6d42e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue May 10 18:12:12 2011 +0200
Merge branch 'master' into as7plugin
commit 33f3c425d2c908379eb4a03f225690e214280287
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 9 17:02:00 2011 +0200
Fix uploading of deployments
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
index b369a95..80e8ea4 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
@@ -25,6 +25,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -42,7 +43,9 @@ import org.codehaus.jackson.map.ObjectMapper;
*/
public class ASUploadConnection {
- private static final String BOUNDARY = "-----------------------------261773107125236";
+ private static final String BOUNDARY_PARAM = "NeAG1QNIHHOyB5joAS7Rox!!";
+
+ private static final String BOUNDARY = "--" + BOUNDARY_PARAM;
private static final String CRLF = "\r\n";
@@ -71,6 +74,7 @@ public class ASUploadConnection {
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod(POST_REQUEST_METHOD);
+ connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY_PARAM);
// Grab the test WAR file and get a stream to its contents to be included in the POST.
os = new BufferedOutputStream(connection.getOutputStream());
@@ -92,6 +96,7 @@ public class ASUploadConnection {
os.flush();
int code = connection.getResponseCode();
+ System.err.println("Response code " + code);
if (code==500)
is = connection.getErrorStream();
else
@@ -128,15 +133,13 @@ public class ASUploadConnection {
}
- private byte[] buildPostRequestHeader(String fileName) {
+ private byte[] buildPostRequestHeader(String fileName) throws UnsupportedEncodingException {
final StringBuilder builder = new StringBuilder();
- builder.append(buildPostRequestHeaderSection("form-data; name=\"test1\"", "", "test1"));
- builder.append(buildPostRequestHeaderSection("form-data; name=\"test2\"", "", "test2"));
builder.append(buildPostRequestHeaderSection("form-data; name=\"file\"; filename=\""+fileName+"\"", "application/octet-stream", ""));
- return builder.toString().getBytes();
+ return builder.toString().getBytes("US-ASCII");
}
- private String buildPostRequestHeaderSection(final String contentDisposition, final String contentType, final String content) {
+ private StringBuilder buildPostRequestHeaderSection(final String contentDisposition, final String contentType, final String content) {
final StringBuilder builder = new StringBuilder();
builder.append(BOUNDARY);
builder.append(CRLF);
@@ -152,16 +155,16 @@ public class ASUploadConnection {
builder.append(content);
}
builder.append(CRLF);
- return builder.toString();
+ return builder;
}
- private byte[] buildPostRequestFooter() {
+ private byte[] buildPostRequestFooter() throws UnsupportedEncodingException{
final StringBuilder builder = new StringBuilder();
builder.append(CRLF);
builder.append(BOUNDARY);
builder.append("--");
builder.append(CRLF);
- return builder.toString().getBytes();
+ return builder.toString().getBytes("US-ASCII");
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 48b0094..50939ae 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -531,9 +531,9 @@
<c:simple-property name="bean-validation-enabled" required="true" type="boolean" readOnly="true"
description="Specify whether bean validation is enabled"/>
<c:simple-property name="archive-validation-enabled" type="boolean" readOnly="true" description="Enabling the validation"/>
- <c:simple-property name="archive-validation-fail-on-error" type="boolean" readOnly="true"
+ <c:simple-property name="archive-validation-fail-on-error" type="boolean" readOnly="true" default="true"
description="Should an archive validation error report fail the deployment. Default: true"/>
- <c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true"
+ <c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true" default="false"
description="Should an archive validation warning report fail the deployment. Default: false"/>
<c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true"
description="enable/disable debug information logging for cached connection manager"/>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index e4e9d70..b1eb277 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -30,6 +30,7 @@ import org.testng.annotations.Test;
import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.Result;
/**
* Test uploading and deploying to the domain
@@ -46,6 +47,17 @@ public class UploadAndDeployTest {
private static final int DC_HTTP_PORT = 9990;
@Test(timeOut = 60*1000L, enabled = true)
+ public void testUploadOnly() throws Exception {
+
+ String bytes_value = prepare();
+
+ assert bytes_value != null;
+
+ System.out.println("sha: " + bytes_value);
+
+ }
+
+ @Test(timeOut = 60*1000L, enabled = true)
public void testUploadIndividualSteps() throws Exception {
String bytes_value = prepare();
@@ -79,7 +91,7 @@ public class UploadAndDeployTest {
System.out.println("Add to server group done: " + ret);
System.out.flush();
- assert ret.has("outcome") : "Ret not valied " + ret.toString();
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
assert ret.get("outcome").getTextValue().equals("success") : "add to sg was no success " + ret.getTextValue();
@@ -88,7 +100,7 @@ public class UploadAndDeployTest {
Operation undeploy = new Operation("remove",serverGroupAddress);
ret = connection.executeRaw(undeploy);
- assert ret.has("outcome") : "Ret not valied " + ret.toString();
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
assert ret.get("outcome").getTextValue().equals("success") : "remove from sg was no success " + ret.getTextValue();
@@ -97,7 +109,7 @@ public class UploadAndDeployTest {
Operation remove = new Operation("remove",deploymentsAddress);
ret = connection.executeRaw(remove);
- assert ret.has("outcome") : "Ret not valied " + ret.toString();
+ assert ret.has("outcome") : "Ret not valid " + ret.toString();
assert ret.get("outcome").getTextValue().equals("success") : "remove from domain was no success " + ret.getTextValue();
System.out.flush();
@@ -156,13 +168,19 @@ public class UploadAndDeployTest {
InputStream fis = getClass().getClassLoader().getResourceAsStream(UPLOAD_FILE);
- int b;
- while ((b = fis.read())!=-1) {
- os.write(b);
+ final byte[] buffer = new byte[1024];
+ int numRead = 0;
+
+ while(numRead > -1) {
+ numRead = fis.read(buffer);
+ if(numRead > 0) {
+ os.write(buffer,0,numRead);
+ }
}
fis.close();
JsonNode node = conn.finishUpload();
System.out.println(node);
+ assert node != null : "No result from upload - node was null";
assert node.has("outcome") : "No outcome from upload";
String outcome = node.get("outcome").getTextValue();
assert outcome.equals("success") : "Upload was no success" + outcome;
commit 2f14177fb1381441fafb767076439f1e401d15bc
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 6 11:24:52 2011 +0200
Add more subsystems
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 04686c4..48b0094 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -507,6 +507,42 @@
</server>
+ <server name="General JCA connectors"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ description="General settings of the JCA engine. Not nexessarily for end-users"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="subsystem=connector"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:simple-property name="default-workmanager-short-running-thread-pool" required="true" type="string" readOnly="true"
+ description="Specify the name of short running thread pool"/>
+ <c:simple-property name="default-workmanager-long-running-thread-pool" required="true" type="string" readOnly="true"
+ description="Specify the name of long running thread pool"/>
+ <c:simple-property name="bean-validation-enabled" required="true" type="boolean" readOnly="true"
+ description="Specify whether bean validation is enabled"/>
+ <c:simple-property name="archive-validation-enabled" type="boolean" readOnly="true" description="Enabling the validation"/>
+ <c:simple-property name="archive-validation-fail-on-error" type="boolean" readOnly="true"
+ description="Should an archive validation error report fail the deployment. Default: true"/>
+ <c:simple-property name="archive-validation-fail-on-warn" type="boolean" readOnly="true"
+ description="Should an archive validation warning report fail the deployment. Default: false"/>
+ <c:simple-property name="cached-connection-manager-debug" type="boolean" readOnly="true"
+ description="enable/disable debug information logging for cached connection manager"/>
+ <c:simple-property name="cached-connection-manager-error" type="boolean" readOnly="true"
+ description="enable/disable error information logging for cached connection manager"/>
+ </resource-configuration>
+
+ </server>
+
<server name="Datasources"
discovery="SubsystemDiscovery"
class="BaseComponent"
@@ -629,6 +665,23 @@
</server>
+ <server name="ResourceAdapters"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="subsystem=resource-adapters"/>
+ </plugin-configuration>
+ </server>
+
+
<server name="Threads"
discovery="SubsystemDiscovery"
class="BaseComponent"
@@ -689,6 +742,33 @@
</server>
+ <server name="Webservices"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="subsystem=webservices"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:simple-property name="modify-soap-address" required="true" type="boolean" readOnly="true"
+ description="Whether the soap address can be modified."/>
+ <c:simple-property name="webservice-host" required="true" type="string" readOnly="true"
+ description="The WSDL, that is a required deployment artifact for an endpoint, has a &soap:address> element which points to the location of the endpoint. JBoss supports rewriting of that SOAP address. If the content of &soap:address> is a valid URL, JBossWS will not rewrite it unless 'modifySOAPAddress' is true. If the content of &soap:address> is not a valid URL, JBossWS will rewrite it using the attribute values given below. If 'webServiceHost' is set to 'jbossws.undefined.host', JBossWS uses requesters host when rewriting the &soap:address>"/>
+ <c:simple-property name="webservice-port" type="integer" readOnly="true"
+ description="The non-secure port that will be used for rewriting the SOAP address. If absent the port will be identified by querying the list of installed connectors."/>
+ <c:simple-property name="webservice-secure-port" type="integer" readOnly="true"
+ description="The non-secure port that will be used for rewriting the SOAP address. If absent the port will be identified by querying the list of installed connectors."/>
+ </resource-configuration>
+ </server>
+
<service name="NetworkInterface"
discovery="SubsystemDiscovery"
class="BaseComponent"
commit fa33a38abec2ac915f128af5a9e262edc36c2f3f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu May 5 12:07:00 2011 +0200
Prevent a possible NPE.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index 8e42fdf..e61ff3c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -99,6 +99,9 @@ public class Domain2Descriptor {
}
private void createProperties(boolean doMetrcis, Map<String, Object> attributesMap, int indent) {
+ if (attributesMap==null)
+ return;
+
for (Map.Entry<String,Object> entry : attributesMap.entrySet()) {
Map<String,Object> props = (Map<String, Object>) entry.getValue();
commit 3f081f6dc8e72c207bc0bacb8465f8d6195418d7
Merge: ba33706 341a653
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 4 15:25:27 2011 +0200
Merge branch 'master' into as7plugin
commit ba33706d7029e1771a3329a429d1348d7c3a29a1
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 2 15:39:05 2011 +0200
Also handle nested elements.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
index 599f61c..8e42fdf 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -94,8 +94,11 @@ public class Domain2Descriptor {
attributesMap = (Map<String, Object>) resMap.get("attributes");
}
+ createProperties(doMetrcis, attributesMap, 0);
+ }
+ private void createProperties(boolean doMetrcis, Map<String, Object> attributesMap, int indent) {
for (Map.Entry<String,Object> entry : attributesMap.entrySet()) {
Map<String,Object> props = (Map<String, Object>) entry.getValue();
@@ -118,12 +121,21 @@ public class Domain2Descriptor {
case LIST:
typeString = "-list-";
break; // Handled below
+ case OBJECT: // an embedded map
+ typeString = "-object-";
+ System.out.println("<c:list-property name=\"" + entry.getKey() +"\" description=\"" +
+ props.get("description") + "\" >");
+ createProperties(doMetrcis,
+ (Map<String, Object>) ((Map<String, Object>) entry.getValue()).get("attributes"), indent+4);
+ System.out.println("</c:list-property>");
+
+ continue;
default:
typeString = "- unknown -";
System.err.println("Unknown type " + ptype + " for " + entry.getKey());
}
- if (ptype==Type.LIST && !doMetrcis) {
+ if (ptype== Type.LIST && !doMetrcis) {
System.out.println("<c:list-property name=\"" + entry.getKey() +"\" >");
System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
@@ -134,14 +146,19 @@ public class Domain2Descriptor {
continue;
}
+ String accessType = (String) props.get("access-type");
+ if (accessType==null)
+ accessType = "read-only"; // default of as7
if (doMetrcis) {
- if (!props.get("access-type").equals("metric"))
+ if (!accessType.equals("metric"))
continue;
- StringBuilder sb = new StringBuilder("<metric property=\"");
+ StringBuilder sb = new StringBuilder();
+ doIndent(indent,sb);
+ sb.append("<metric property=\"");
sb.append(entry.getKey()).append('"');
sb.append(" type=\"").append(typeString).append("\"");
- if (ptype==Type.STRING)
+ if (ptype== Type.STRING)
sb.append(" dataType=\"trait\"");
String description = (String) props.get("description");
@@ -155,8 +172,12 @@ public class Domain2Descriptor {
}
else {
+ if (accessType.equals("metric"))
+ continue;
- StringBuilder sb = new StringBuilder("<c:simple-property name=\"");
+ StringBuilder sb = new StringBuilder();
+ doIndent(indent,sb);
+ sb.append("<c:simple-property name=\"");
sb.append(entry.getKey()).append('"');
Object required = props.get("required");
@@ -166,7 +187,7 @@ public class Domain2Descriptor {
sb.append(" type=\"").append(typeString).append("\"");
sb.append(" readOnly=\"");
- if (props.get("access-type").equals("read-only"))
+ if (accessType!=null && accessType.equals("read-only")) // TODO if no access-type is given, the one from the parent applies
sb.append("true");
else
sb.append("false");
@@ -183,8 +204,11 @@ public class Domain2Descriptor {
System.out.println(sb.toString());
}
}
+ }
-
+ private void doIndent(int indent, StringBuilder sb) {
+ for (int i = 0 ; i < indent ; i++)
+ sb.append(' ');
}
private Type getTypeFromProps(Map<String, Object> props) {
commit 07e330834624e13d48342c9a3e9ba5037490af11
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon May 2 10:47:44 2011 +0200
Remove unused import.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 03a0f12..a50ea45 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -29,7 +29,6 @@ import org.rhq.modules.plugins.jbossas7.json.ReadResource;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
commit d58b242f0d092d7b95b9e544edbc1eae5e32038c
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Apr 28 15:05:57 2011 +0200
Get rid of the old getLevelData() method. We are doing that via operation now.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 12d3ec6..eace9b8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -26,13 +26,11 @@ import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
-import java.net.URLConnection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
-import org.jetbrains.annotations.Nullable;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
@@ -47,7 +45,6 @@ public class ASConnection {
private final Log log = LogFactory.getLog(ASConnection.class);
URL url;
String urlString;
- private StringBuilder builder;
private ObjectMapper mapper;
public ASConnection(String host, int port) {
@@ -63,64 +60,6 @@ public class ASConnection {
}
- @Deprecated
- JsonNode getLevelData(@Nullable String base, boolean recursive, boolean includeMetrics) throws Exception{
- String ops = null;
- if (recursive)
- ops = "recursive";
- if (includeMetrics)
- ops += "&include-runtime=true";
-
- return getLevelData(base,ops);
-}
-
- /**
- * Return the JSON-Object for a certain path.
- *
- * @param base Path to the object/subsystem. Can be null/"" for the base objects
- * @param ops OperationDescription to run on the api can be null
- * @return A JSONObject encoding the level plus sub levels provided
- * @throws Exception If anything goes wrong
- */
- @Deprecated
- JsonNode getLevelData(@Nullable String base, @Nullable String ops) throws Exception {
-
- URL url2;
- String spec;
- url2 = getBaseUrl(base, ops);
-
- JsonNode tree = null;
-
- URLConnection conn = url2.openConnection();
- InputStream inputStream = null;
- try {
- inputStream = conn.getInputStream();
- } catch (IOException e) {
- System.err.println(e.getMessage());
- return tree;
- }
- BufferedReader in = new BufferedReader(new InputStreamReader(
- inputStream));
- try {
- String line;
- StringBuilder builder = new StringBuilder();
- while ((line = in.readLine()) != null) {
- builder.append(line);
- }
-
- ObjectMapper mapper = new ObjectMapper();
-
- tree = mapper.readTree(builder.toString());
-
- } catch (IOException ioe) {
- System.err.println("for in put " + url2 + " : " + ioe.getMessage());
- } finally {
- in.close();
- }
-
- return tree;
- }
-
static boolean isErrorReply(JsonNode in) {
if (in == null)
@@ -182,14 +121,14 @@ public class ASConnection {
br = new BufferedReader(new InputStreamReader(
inputStream));
String line;
- builder = new StringBuilder();
+ StringBuilder builder = new StringBuilder();
while ((line = br.readLine()) != null) {
builder.append(line);
}
String outcome;
JsonNode operationResult=null;
- if (builder!=null) {
+ if (builder !=null) {
outcome= builder.toString();
operationResult = mapper.readTree(outcome);
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 50dd55c..03a0f12 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -25,6 +25,7 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
+import org.rhq.modules.plugins.jbossas7.json.ReadResource;
import java.util.ArrayList;
import java.util.Arrays;
@@ -106,7 +107,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
JsonNode json ;
if (!recursive)
- json = connection.getLevelData(path,recursive, false);
+ json = connection.executeRaw(new ReadResource(parentComponent.pathToAddress(path)));
else {
List<PROPERTY_VALUE> addr ;
addr = parentComponent.pathToAddress(parentPath);
commit ae5428243c5ae6639e3acac97ae476ad05b4f825
Merge: 40c5ede 15a53e5
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Apr 28 10:48:43 2011 +0200
Merge branch 'master' into as7plugin
commit 40c5eded43cd9e4d6050c9ca5ecbd06ddd1cd5b1
Merge: 9dc32bc f50680d
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 27 21:33:14 2011 +0200
Merge branch 'master' into as7plugin
commit 9dc32bcb1ff5af961cd980c7d0ec518057bedba2
Merge: 0559cb7 0086a69
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 27 16:18:48 2011 +0200
Merge branch 'master' into as7plugin
commit 0559cb7526a5804a39c9883f750dc217d3d096ca
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 20 08:58:28 2011 +0200
Add generating of <metric> elements.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
new file mode 100644
index 0000000..599f61c
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Descriptor.java
@@ -0,0 +1,247 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Generate properties from a domain dump
+ * @author Heiko W. Rupp
+ */
+public class Domain2Descriptor {
+
+ public static void main(String[] args) throws Exception {
+
+ if (args.length<1) {
+ usage();
+ System.exit(1);
+ }
+
+ Domain2Descriptor d2d = new Domain2Descriptor();
+ d2d.run(args);
+
+
+ }
+
+ private void run(String[] args) {
+
+ boolean doMetrcis = false;
+ int pos = 0;
+ if (args[0].startsWith("-")) {
+ if (args[0].equals("-m"))
+ doMetrcis = true;
+ else if (args[0].equals("-p"))
+ doMetrcis = false;
+ else {
+ usage();
+ return;
+ }
+ pos++;
+ }
+
+ String path = args[pos];
+ String childType = null;
+ if (args.length>pos+1)
+ childType = args[pos+1];
+
+ ASConnection conn = new ASConnection("localhost",9990);
+
+ List<PROPERTY_VALUE> address = pathToAddress(path);
+ Operation op = new Operation("read-resource-description",address); // ,"operations",true);
+ op.addAdditionalProperty("recursive","true");
+ if (doMetrcis)
+ op.addAdditionalProperty("include-runtime",true);
+ ComplexResult res = (ComplexResult) conn.execute(op,true);
+ if (!res.isSuccess()) {
+ System.err.println("Failure: " + res.getFailureDescription());
+ return;
+ }
+
+ Map<String,Object> attributesMap;
+
+ Map<String,Object> resMap = res.getResult();
+ if (childType!=null) {
+ Map childMap = (Map) resMap.get("children");
+ Map <String,Object> typeMap = (Map<String, Object>) childMap.get(childType);
+ Map descriptionMap = (Map) typeMap.get("model-description");
+ Map starMap = (Map) descriptionMap.get("*");
+ attributesMap = (Map<String, Object>) starMap.get("attributes");
+ }
+ else {
+ attributesMap = (Map<String, Object>) resMap.get("attributes");
+ }
+
+
+
+ for (Map.Entry<String,Object> entry : attributesMap.entrySet()) {
+
+ Map<String,Object> props = (Map<String, Object>) entry.getValue();
+
+
+ Type ptype = getTypeFromProps(props);
+ String typeString;
+
+ switch (ptype) {
+ case INT:
+ typeString = "integer"; break;
+ case STRING:
+ typeString = "string"; break;
+ case BOOLEAN:
+ typeString = "boolean"; break;
+ case LONG:
+ typeString = "long"; break;
+ case BIG_DECIMAL:
+ typeString = "long"; break; // TODO better float or double?
+ case LIST:
+ typeString = "-list-";
+ break; // Handled below
+ default:
+ typeString = "- unknown -";
+ System.err.println("Unknown type " + ptype + " for " + entry.getKey());
+ }
+
+ if (ptype==Type.LIST && !doMetrcis) {
+
+ System.out.println("<c:list-property name=\"" + entry.getKey() +"\" >");
+ System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
+ System.out.println("</c:list-property>");
+
+
+
+ continue;
+ }
+
+ if (doMetrcis) {
+ if (!props.get("access-type").equals("metric"))
+ continue;
+
+ StringBuilder sb = new StringBuilder("<metric property=\"");
+ sb.append(entry.getKey()).append('"');
+ sb.append(" type=\"").append(typeString).append("\"");
+ if (ptype==Type.STRING)
+ sb.append(" dataType=\"trait\"");
+
+ String description = (String) props.get("description");
+ if (description!=null) {
+ if (sb.length()+description.length() > 120)
+ sb.append("\n ");
+ sb.append(" description=\"").append(description).append('"');
+ }
+ sb.append("/>");
+ System.out.println(sb.toString());
+
+ }
+ else {
+
+ StringBuilder sb = new StringBuilder("<c:simple-property name=\"");
+ sb.append(entry.getKey()).append('"');
+
+ Object required = props.get("required");
+ if (required != null && (Boolean) required) {
+ sb.append(" required=\"true\"");
+ }
+
+ sb.append(" type=\"").append(typeString).append("\"");
+ sb.append(" readOnly=\"");
+ if (props.get("access-type").equals("read-only"))
+ sb.append("true");
+ else
+ sb.append("false");
+ sb.append('"');
+
+ String description = (String) props.get("description");
+ if (description!=null) {
+ if (sb.length()+description.length() > 120)
+ sb.append("\n ");
+ sb.append(" description=\"").append(description).append('"');
+ }
+ sb.append("/>");
+
+ System.out.println(sb.toString());
+ }
+ }
+
+
+ }
+
+ private Type getTypeFromProps(Map<String, Object> props) {
+ Map<String,String> tMap = (Map<String, String>) props.get("type");
+ String type = tMap.get("TYPE_MODEL_VALUE");
+ Type ret = Type.valueOf(type);
+
+ return ret;
+ }
+
+ /**
+ * Convert a path in the form key=value,key=value... to a List of properties.
+ * @param path Path to translate
+ * @return List of properties
+ */
+ public List<PROPERTY_VALUE> pathToAddress(String path) {
+ if (path==null || path.isEmpty())
+ return Collections.emptyList();
+
+ List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
+ String[] components = path.split(",");
+ for (String component : components) {
+ String tmp = component.trim();
+
+ if (tmp.contains("=")) {
+ // strip / from the start of the key if it happens to be there
+ if (tmp.startsWith("/"))
+ tmp = tmp.substring(1);
+
+ String[] pair = tmp.split("=");
+ PROPERTY_VALUE valuePair = new PROPERTY_VALUE(pair[0], pair[1]);
+ result.add(valuePair);
+ }
+ }
+
+ return result;
+ }
+
+
+
+ private static void usage() {
+ System.out.println("Domain2Properties [-p|-m] path type");
+ System.out.println(" path is of kind 'key=value[,key=value]+");
+ System.out.println(" -p create properties (default)");
+ System.out.println(" -m create metrics");
+ }
+
+ public enum Type {
+ STRING,
+ INT,
+ BOOLEAN,
+ LONG,
+ BIG_DECIMAL,
+ OBJECT,
+ LIST
+
+ ;
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Properties.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Properties.java
deleted file mode 100644
index 0b8b38e..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Properties.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.modules.plugins.jbossas7;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import com.apple.java.Usage;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
-import org.rhq.modules.plugins.jbossas7.json.Operation;
-import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
-
-/**
- * Generate properties from a domain dump
- * @author Heiko W. Rupp
- */
-public class Domain2Properties {
-
- public static void main(String[] args) throws Exception {
-
- if (args.length<2) {
- usage();
- System.exit(1);
- }
-
- Domain2Properties dp = new Domain2Properties();
- dp.run(args);
-
-
- }
-
- private void run(String[] args) {
-
- String path = args[0];
- String type = args[1];
-
- ASConnection conn = new ASConnection("localhost",9990);
-
- List<PROPERTY_VALUE> address = pathToAddress(path);
- Operation op = new Operation("read-resource-description",address,"operations",true);
- op.addAdditionalProperty("recursive","true");
- ComplexResult res = (ComplexResult) conn.execute(op,true);
- if (!res.isSuccess()) {
- System.err.println("Failure: " + res.getFailureDescription());
- return;
- }
-
-
- Map<String,Object> resMap = res.getResult();
- Map childMap = (Map) resMap.get("children");
- Map <String,Object> typeMap = (Map<String, Object>) childMap.get(type);
- Map descriptionMap = (Map) typeMap.get("model-description");
- Map starMap = (Map) descriptionMap.get("*");
- Map<String,Object> attributesMap = (Map<String, Object>) starMap.get("attributes");
-
-
-
- for (Map.Entry<String,Object> entry : attributesMap.entrySet()) {
-
- Map<String,Object> props = (Map<String, Object>) entry.getValue();
-
-
- Type ptype = getTypeFromProps(props);
- String typeString;
-
- switch (ptype) {
- case INT:
- typeString = "integer"; break;
- case STRING:
- typeString = "string"; break;
- case BOOLEAN:
- typeString = "boolean"; break;
- case LONG:
- typeString = "long"; break;
- case BIG_DECIMAL:
- typeString = "long"; break; // TODO bettter float or double?
- case LIST:
- typeString = "-list-";
- break; // Handled below
- default:
- typeString = "- unknown -";
- System.err.println("Unknown type " + ptype + " for " + entry.getKey());
- }
-
- if (ptype==Type.LIST) {
-
- System.out.println("<c:list-property name=\"" + entry.getKey() +"\" >");
- System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
- System.out.println("</c:list-property>");
-
-
-
- continue;
- }
-
- StringBuilder sb = new StringBuilder("<c:simple-property name=\"");
- sb.append(entry.getKey()).append('"');
-
- if ((Boolean) props.get("required")) {
- sb.append(" required=\"true\"");
- }
-
- sb.append(" type=\"").append(typeString).append("\"");
- sb.append(" readOnly=\"");
- if (props.get("access-type").equals("read-only"))
- sb.append("true");
- else
- sb.append("false");
- sb.append('"');
-
- String description = (String) props.get("description");
- if (sb.length()+description.length() > 120)
- sb.append("\n ");
- sb.append(" description=\"").append(description).append('"');
- sb.append("/>");
-
- System.out.println(sb.toString());
- }
-
-
- }
-
- private Type getTypeFromProps(Map<String, Object> props) {
- Map<String,String> tMap = (Map<String, String>) props.get("type");
- String type = tMap.get("TYPE_MODEL_VALUE");
- Type ret = Type.valueOf(type);
-
- return ret;
- }
-
- /**
- * Convert a path in the form key=value,key=value... to a List of properties.
- * @param path Path to translate
- * @return List of properties
- */
- public List<PROPERTY_VALUE> pathToAddress(String path) {
- if (path==null || path.isEmpty())
- return Collections.emptyList();
-
- List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
- String[] components = path.split(",");
- for (String component : components) {
- String tmp = component.trim();
-
- if (tmp.contains("=")) {
- // strip / from the start of the key if it happens to be there
- if (tmp.startsWith("/"))
- tmp = tmp.substring(1);
-
- String[] pair = tmp.split("=");
- PROPERTY_VALUE valuePair = new PROPERTY_VALUE(pair[0], pair[1]);
- result.add(valuePair);
- }
- }
-
- return result;
- }
-
-
-
- private static void usage() {
- System.out.println("Domain2Properties path type");
- System.out.println(" path is of kind 'key=value[,key=value]+");
- }
-
- public enum Type {
- STRING,
- INT,
- BOOLEAN,
- LONG,
- BIG_DECIMAL,
- OBJECT,
- LIST
-
- ;
- }
-
-}
commit 47863657731b18878a50252743504ac825299636
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Apr 19 15:08:41 2011 +0200
Put the Domain below the DomainController node and remove the separate domain node. Also add some more properties.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index f03f62c..72ab4dd 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -67,6 +67,7 @@ import org.rhq.modules.plugins.jbossas7.json.Result;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -316,13 +317,16 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
} // end List of ..
else if (propDef instanceof PropertyDefinitionMap) {
PropertyDefinitionMap mapDef = (PropertyDefinitionMap) propDef;
+ PropertyMap pm = new PropertyMap(mapDef.getName());
+
Map<String,PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
for (Map.Entry<String,PropertyDefinition> maEntry : memberDefMap.entrySet()) {
JsonNode valueNode = json.findValue(maEntry.getKey());
- System.out.println(valueNode);
PropertySimple p = putProperty(valueNode,maEntry.getValue());
- ret.put(p);
+ System.out.println(p);
+ pm.put(p);
}
+ ret.put(pm);
}
}
@@ -496,6 +500,99 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
@Override
public OperationResult invokeOperation(String name,
Configuration parameters) throws InterruptedException, Exception {
- return null; // TODO: Customise this generated block
+
+ if (!name.contains(":")) {
+ OperationResult badName = new OperationResult("Operation name did not contain a ':'");
+ badName.setErrorMessage("Operation name did not contain a ':'");
+ return badName;
+ }
+
+ int colonPos = name.indexOf(':');
+ String what = name.substring(0, colonPos);
+ String op = name.substring(colonPos+1);
+ Operation operation=null;
+
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
+
+ if (what.equals("server-group")) {
+ String groupName = parameters.getSimpleValue("name",null);
+ String profile = parameters.getSimpleValue("profile","default");
+
+ address.add(new PROPERTY_VALUE("server-group",groupName));
+
+ operation = new Operation(op,address,"profile",profile);
+ } else if (what.equals("server")) {
+
+ if (context.getResourceType().getName().equals("JBossAS-Managed")) {
+ String host = conf.getSimpleValue("domainHost","local");
+ address.add(new PROPERTY_VALUE("host",host));
+ address.add(new PROPERTY_VALUE("server-config",myServerName));
+ operation = new Operation(op,address);
+ }
+ else if (context.getResourceType().getName().equals("Host")) {
+ address.addAll(pathToAddress(getPath()));
+ String serverName = parameters.getSimpleValue("name",null);
+ address.add(new PROPERTY_VALUE("server-config",serverName));
+ Map<String,Object> props = new HashMap<String, Object>();
+ String serverGroup = parameters.getSimpleValue("group",null);
+ props.put("group",serverGroup);
+ if (op.equals("add")) {
+ props.put("name",serverName);
+ boolean autoStart = parameters.getSimple("auto-start").getBooleanValue();
+ props.put("auto-start",autoStart);
+ // TODO put more properties in
+ }
+
+ operation = new Operation(op,address,props);
+ }
+ } else if (what.equals("destination")) {
+ address.addAll(pathToAddress(getPath()));
+ String newName = parameters.getSimpleValue("name","");
+// String type = parameters.getSimpleValue("type","Queue").toLowerCase();
+// address.add(new PROPERTY_VALUE(type,newName));
+ String queueName = parameters.getSimpleValue("queue-address","");
+ Map<String,Object> props = new HashMap<String, Object>();
+ props.put("queue-address",queueName);
+ operation = new Operation(op,address);
+ } else if (what.equals("managed-server")) {
+ String chost = parameters.getSimpleValue("hostname","");
+ String serverName = parameters.getSimpleValue("servername","");
+ String serverGroup = parameters.getSimpleValue("server-group","");
+ String socketBindings = parameters.getSimpleValue("socket-bindings","");
+ String portS = parameters.getSimpleValue("port-offset","0");
+ int port = Integer.parseInt(portS);
+ String autostartS = parameters.getSimpleValue("auto-start","false");
+ boolean autoStart = Boolean.getBoolean(autostartS);
+
+ address.add(new PROPERTY_VALUE("host", chost));
+ address.add(new PROPERTY_VALUE("server-config",serverName));
+ Map<String,Object> props = new HashMap<String, Object>();
+ props.put("name",serverName);
+ props.put("group",serverGroup);
+ props.put("socket-binding-group",socketBindings);
+ props.put("socket-binding-port-offset",port);
+ props.put("auto-start",autoStart);
+
+ operation = new Operation(op,address,props);
+ } else if (what.equals("domain")) {
+ operation = new Operation(op,Collections.<PROPERTY_VALUE>emptyList());
+ }
+
+ OperationResult operationResult = new OperationResult();
+ if (operation!=null) {
+ JsonNode result = connection.executeRaw(operation);
+
+ if (ASConnection.isErrorReply(result)) {
+ operationResult.setErrorMessage(ASConnection.getFailureDescription(result));
+ }
+ else {
+ operationResult.setSimpleResult(ASConnection.getSuccessDescription(result));
+ }
+ }
+ else {
+ operationResult.setErrorMessage("No valid operation was given");
+ }
+ // TODO throw an exception if the operation failed?
+ return operationResult;
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
index 8d9ff0f..2f71edb 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
@@ -76,6 +76,7 @@ public class BaseProcessDiscovery extends AbstractBaseDiscovery implements Resou
String serverNameFull;
String serverName;
String psName = psr.getProcessScan().getName();
+ String description = discoveryContext.getResourceType().getDescription();
if (psName.equals("ProcessController")) {
serverNameFull = "ProcessController";
serverName = "ProcessController";
@@ -85,6 +86,7 @@ public class BaseProcessDiscovery extends AbstractBaseDiscovery implements Resou
if (hp.isLocal) {
serverName = "DomainController";
serverNameFull = "DomainController";
+ description = "Domain controller for an AS7 domain";
}
else {
serverName = "HostController";
@@ -138,7 +140,7 @@ public class BaseProcessDiscovery extends AbstractBaseDiscovery implements Resou
serverNameFull, // key TODO distinguish per domain?
serverName, // Name
null, // TODO real version ?
- discoveryContext.getResourceType().getDescription(), // Description
+ description, // Description
config,
psr.getProcessInfo()
);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index 1d73822..35425e3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -68,100 +68,4 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
return super.getAvailability(); // TODO: Customise this generated block
}
- @Override
- public OperationResult invokeOperation(String name,
- Configuration parameters) throws InterruptedException, Exception {
-
- if (!name.contains(":")) {
- OperationResult badName = new OperationResult("Operation name did not contain a ':'");
- badName.setErrorMessage("Operation name did not contain a ':'");
- return badName;
- }
-
- int colonPos = name.indexOf(':');
- String what = name.substring(0, colonPos);
- String op = name.substring(colonPos+1);
- Operation operation=null;
-
- List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
-
- if (what.equals("server-group")) {
- String groupName = parameters.getSimpleValue("name",null);
- String profile = parameters.getSimpleValue("profile","default");
-
- address.add(new PROPERTY_VALUE("server-group",groupName));
-
- operation = new Operation(op,address,"profile",profile);
- } else if (what.equals("server")) {
-
- if (context.getResourceType().getName().equals("JBossAS-Managed")) {
- String host = conf.getSimpleValue("domainHost","local");
- address.add(new PROPERTY_VALUE("host",host));
- address.add(new PROPERTY_VALUE("server-config",myServerName));
- operation = new Operation(op,address);
- }
- else if (context.getResourceType().getName().equals("Host")) {
- address.addAll(pathToAddress(getPath()));
- String serverName = parameters.getSimpleValue("name",null);
- address.add(new PROPERTY_VALUE("server-config",serverName));
- Map<String,Object> props = new HashMap<String, Object>();
- String serverGroup = parameters.getSimpleValue("group",null);
- props.put("group",serverGroup);
- if (op.equals("add")) {
- props.put("name",serverName);
- boolean autoStart = parameters.getSimple("auto-start").getBooleanValue();
- props.put("auto-start",autoStart);
- // TODO put more properties in
- }
-
- operation = new Operation(op,address,props);
- }
- } else if (what.equals("destination")) {
- address.addAll(pathToAddress(getPath()));
- String newName = parameters.getSimpleValue("name","");
-// String type = parameters.getSimpleValue("type","Queue").toLowerCase();
-// address.add(new PROPERTY_VALUE(type,newName));
- String queueName = parameters.getSimpleValue("queue-address","");
- Map<String,Object> props = new HashMap<String, Object>();
- props.put("queue-address",queueName);
- operation = new Operation(op,address);
- } else if (what.equals("managed-server")) {
- String chost = parameters.getSimpleValue("hostname","");
- String serverName = parameters.getSimpleValue("servername","");
- String serverGroup = parameters.getSimpleValue("server-group","");
- String socketBindings = parameters.getSimpleValue("socket-bindings","");
- String portS = parameters.getSimpleValue("port-offset","0");
- int port = Integer.parseInt(portS);
- String autostartS = parameters.getSimpleValue("auto-start","false");
- boolean autoStart = Boolean.getBoolean(autostartS);
-
- address.add(new PROPERTY_VALUE("host", chost));
- address.add(new PROPERTY_VALUE("server-config",serverName));
- Map<String,Object> props = new HashMap<String, Object>();
- props.put("name",serverName);
- props.put("group",serverGroup);
- props.put("socket-binding-group",socketBindings);
- props.put("socket-binding-port-offset",port);
- props.put("auto-start",autoStart);
-
- operation = new Operation(op,address,props);
- }
-
- OperationResult operationResult = new OperationResult();
- if (operation!=null) {
- JsonNode result = connection.executeRaw(operation);
-
- if (ASConnection.isErrorReply(result)) {
- operationResult.setErrorMessage(ASConnection.getFailureDescription(result));
- }
- else {
- operationResult.setSimpleResult(ASConnection.getSuccessDescription(result));
- }
- }
- else {
- operationResult.setErrorMessage("No valid operation was given");
- }
- // TODO throw an exception if the operation failed?
- return operationResult;
- }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
deleted file mode 100644
index a8b1058..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.modules.plugins.jbossas7;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ProcessScanResult;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.core.system.ProcessInfo;
-
-/**
- * Discover the domain. This is done by scanning for host controllers.
- * If they are also DC, the domain-controller element points to local.
- *
- * @author Heiko W. Rupp
- */
-@SuppressWarnings("unused")
-public class DomainDiscovery extends AbstractBaseDiscovery<BaseComponent> {
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
- throws Exception {
-
- Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
-
-
- List<ProcessScanResult> scans = context.getAutoDiscoveredProcesses();
-
- for (ProcessScanResult psr : scans) {
-
- // get the HostController, to find host.xml
- String psName = psr.getProcessScan().getName();
- if (!psName.equals("HostController"))
- continue;
-
- // Now we have the host controller, lets get the host.xml file
- // and obtain the domain controller info from there
- ProcessInfo processInfo = psr.getProcessInfo();
- readHostXml(processInfo,true);
- HostPort dcHp = getDomainControllerFromHostXml();
-
- if (!dcHp.isLocal) {
- log.info("Domain controller is not local, but at " + dcHp);
- continue;
- }
-
- // Ok, this is a domain controller, so we can return a Domain resource.
-
- // Get the management port and save for later use
- HostPort managementHostPort = getManagementPortFromHostXml();
- Configuration config = context.getDefaultPluginConfiguration();
- config.put(new PropertySimple("port",managementHostPort.port));
- config.put(new PropertySimple("hostname",managementHostPort.host));
-
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- "Domain", // Key
- "Domain", // Name
- null, // Version
- context.getResourceType().getDescription(), // Description
- config,
- null);
- details.add(detail);
- }
- return details;
- }
-}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 80df496..04686c4 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -96,32 +96,9 @@
<process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
- <operation name="shutdown" description="Shut this Host-/Domaincontroller down with all managed servers.">
+ <operation name="domain:shutdown" displayName="Shutdown Domain" description="Shut this Host-/Domaincontroller down with all managed servers.">
</operation>
-
- </server>
-
- <server name="Domain"
- discovery="DomainDiscovery"
- class="DomainComponent"
- description="An AS7 management profile">
-
- <subcategories>
- <subcategory name="Integration" />
- <subcategory name="Core"/>
- <subcategory name="Web"/>
- </subcategories>
-
- <plugin-configuration>
- <c:simple-property name="hostname" default="localhost" displayName="Management host" required="true"/>
- <c:simple-property name="port" default="9990" type="integer" displayName="Management port" required="true"/>
- </plugin-configuration>
-
- <!-- Scan for host controller is intentional -->
- <process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
-
-
<operation name="server-group:add" displayName="Add ServerGroup" description="Add a server group to the Domain.">
<parameters>
<c:simple-property name="name" description="Name of Group to add"/>
@@ -556,18 +533,75 @@
</plugin-configuration>
<resource-configuration>
- <c:map-property name="configuration">
- <c:simple-property name="connection-url"/>
- <c:simple-property name="driver-class"/>
- <c:simple-property name="jndi-name"/>
- <c:simple-property name="driver"/>
- <c:simple-property name="pool-name"/>
- <c:simple-property name="use-java-context" type="boolean"/>
- <c:simple-property name="enabled" type="boolean"/>
- <c:simple-property name="user-name"/>
- <c:simple-property name="password"/>
- <!-- TODO more when they become available in the AS -->
- </c:map-property>
+ <c:simple-property name="connection-url" required="true" type="string" readOnly="true" description="The JDBC driver connection URL"/>
+ <c:simple-property name="driver-class" required="true" type="string" readOnly="true"
+ description="The fully qualifed name of the JDBC driver class"/>
+ <c:simple-property name="jndi-name" required="true" type="string" readOnly="true"
+ description="Specifies the JNDI name for the datasource"/>
+ <c:simple-property name="driver" required="true" type="string" readOnly="true"
+ description="Defines the JDBC driver the datasource should use with this format: <driver-name>#<major-version>.<minor-version> where <driver-name> is the fully qualifed name of the JDBC driver class"/>
+ <c:simple-property name="new-connection-sql" type="string" readOnly="true"
+ description="Specifies an SQL statement to execute whenever a connection is added to the connection pool."/>
+ <c:simple-property name="pool-name" type="string" readOnly="true"
+ description="Specifies the pool name for the datasource used for management"/>
+ <c:simple-property name="url-delimiter" type="string" readOnly="true"
+ description="Specifies the delimeter for URLs in connection-url for HA datasources"/>
+ <c:simple-property name="url-selector-strategy-class-name" type="string" readOnly="true"
+ description="A class that implements org.jboss.jca.adapters.jdbc.URLSelectorStrategy"/>
+ <c:simple-property name="use-java-context" type="boolean" readOnly="true"
+ description="Setting this to false will bind the DataSource into global JNDI;"/>
+ <c:simple-property name="enabled" type="string" readOnly="true" description="Specifies if the datasource should be enabled"/>
+ <c:simple-property name="max-pool-size" type="integer" readOnly="false"
+ description="The max-pool-size element indicates the maximum number of connections for a pool. No more connections will be created in each sub-pool."/>
+ <c:simple-property name="min-pool-size" type="integer" readOnly="false"
+ description="The min-pool-size element indicates the minimum number of connections a pool should hold. These are not created until a Subject is known from a request for a connection."/>
+ <c:simple-property name="pool-prefill" type="boolean" readOnly="false"
+ description="Whether to attempt to prefill the connection pool. Changing this value require a server restart."/>
+ <c:simple-property name="pool-use-strict-min" type="boolean" readOnly="false"
+ description="Define if the min-pool-size should be considered a strictly."/>
+ <c:simple-property name="user-name" type="string" readOnly="true"
+ description="Specify the username used when creating a new connection."/>
+ <c:simple-property name="password" type="password" readOnly="true"
+ description="Specify the passwprd used when creating a new connection."/>
+ <c:simple-property name="prepared-statements-cacheSize" type="long" readOnly="true"
+ description="The number of prepared statements per connection in an LRU cache"/>
+ <c:simple-property name="share-prepared-statements" type="boolean" readOnly="true"
+ description="Whether to share prepare statements, i.e. whether asking for same statement twice without closing uses the same underlying prepared statement"/>
+ <c:simple-property name="track-statements" type="string" readOnly="true"
+ description="Whether to check for unclosed statements when a connection is returned to the pool and result sets are closed when a statement is closed/return to the prepared statement cache. valid values are: false - do not track statements and results true - track statements and result sets and warn when they are not closed nowarn - track statements but do no warn about them being unclosed"/>
+ <c:simple-property name="allocation-retry" type="integer" readOnly="true"
+ description="The allocation retry element indicates the number of times that allocating a connection should be tried before throwing an exception."/>
+ <c:simple-property name="allocation-retry-wait-millis" type="long" readOnly="true"
+ description="Indicates the time in milliseconds to wait between retrying to allocate a connection."/>
+ <c:simple-property name="blocking-timeout-wait-millis" type="long" readOnly="false"
+ description="The blocking-timeout-millis element indicates the maximum time in milliseconds to block while waiting for a connection before throwing an exception. Note that this blocks only while waiting for a permit for a connection, and will never throw an exception if creating a new connection takes an inordinately long time."/>
+ <c:simple-property name="idle-timeout-minutes" type="long" readOnly="false"
+ description="The idle-timeout-minutes elements indicates the maximum time in minutes a connection may be idle before being closed. The actual maximum time depends also on the IdleRemover scan time, which is 1/2 the smallest idle-timeout-minutes of any pool. Changing this value require a server restart."/>
+ <c:simple-property name="query-timeout" type="long" readOnly="true"
+ description="Any configured query timeout in seconds The default is no timeout"/>
+ <c:simple-property name="use-try-lock" type="long" readOnly="true"
+ description="Any configured timeout for internal locks on the resource adapter objects in seconds"/>
+ <c:simple-property name="set-tx-query-timeout" type="boolean" readOnly="true"
+ description="Whether to set the query timeout based on the time remaining until transaction timeout, any configured query timeout will be used if there is no transaction."/>
+ <c:simple-property name="transaction-isolation" type="string" readOnly="true"
+ description="Set java.sql.Connection transaction isolation level to use. The constants defined by transaction-isolation-values are the possible transaction isolation levels and include: TRANSACTION_READ_UNCOMMITTED TRANSACTION_READ_COMMITTED TRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLE TRANSACTION_NONE"/>
+ <c:simple-property name="check-valid-connection-sql" type="string" readOnly="true"
+ description="Specify an SQL statement to check validity of a pool connection. This may be called when managed connection is taken from pool for use."/>
+ <c:simple-property name="exception-sorter-class-name" type="string" readOnly="true"
+ description="An org.jboss.jca.adapters.jdbc.ExceptionSorter that provides a boolean isExceptionFatal(SQLException e) method to validate is an exception should be broadcast to all javax.resource.spi.ConnectionEventListener as a connectionErrorOccurred"/>
+ <c:simple-property name="stale-connection-checker-class-name" type="string" readOnly="true"
+ description="An org.jboss.jca.adapters.jdbc.StaleConnectionChecker that provides a boolean isStaleConnection(SQLException e) method which if it it returns true will wrap the exception in an org.jboss.jca.adapters.jdbc.StaleConnectionException"/>
+ <c:simple-property name="valid-connection-checker-class-name" type="string" readOnly="true"
+ description="An org.jboss.jca.adapters.jdbc.ValidConnectionChecker that provides a SQLException isValidConnection(Connection e) method to validate is a connection is valid. An exception means the connection is destroyed. This overrides the check-valid-connection-sql when present."/>
+ <c:simple-property name="background-validation-minutes" type="long" readOnly="false"
+ description="The background-validation-minutes element specifies the amount of time, in minutes, that background validation will run. Changing this value require a server restart."/>
+ <c:simple-property name="background-validation" type="boolean" readOnly="false"
+ description="An element to specify that connections should be validated on a background thread versus being validated prior to use. Changing this value require a server restart."/>
+ <c:simple-property name="use-fast-fail" type="boolean" readOnly="false"
+ description="Whether fail a connection allocation on the first connection if it is invalid (true) or keep trying until the pool is exhausted of all potential connections (false)"/>
+ <c:simple-property name="validate-on-match" type="boolean" readOnly="true"
+ description="The validate-on-match element indicates whether or not connection level validation should be done when a connection factory attempts to match a managed connection for a given set. This is typically exclusive to the use of background validation"/>
+ <c:simple-property name="spy" type="boolean" readOnly="true" description="whatever spy or not the jdbc connection"/>
</resource-configuration>
</service>
@@ -595,13 +629,73 @@
</server>
+ <server name="Threads"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="subsystem=threads"/>
+ </plugin-configuration>
+
+ <service name="ThreadFactory"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="thread-factory"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:simple-property name="name" required="true" type="string" readOnly="true" description="The bean name of the created thread factory."/>
+ <c:simple-property name="group-name" type="string" readOnly="false"
+ description="Specifies the name of a the thread group to create for this thread factory."/>
+ <c:simple-property name="thread-name-pattern" type="string" readOnly="false"
+ description="The template used to create names for threads. The following patterns may be used:
+ %% - emit a percent sign
+ %t - emit the per-factory thread sequence number
+ %g - emit the global thread sequence number
+ %f - emit the factory sequence number
+ %i - emit the thread ID."/>
+ <c:simple-property name="priority" type="integer" readOnly="false"
+ description="May be used to specify the thread priority of created threads."/>
+ <c:list-property name="properties" >
+ <c:simple-property name="properties" /> <!-- TODO list of maps ? -->
+ </c:list-property>
+ </resource-configuration>
+ </service>
+
+ <service name="ThreadPool"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="bounded-queue-thread-pool|queueless-thread-pool|scheduled-thread-pool|unbounded-queue-thread-pool"/>
+ </plugin-configuration>
+ </service>
+
+
+
+
+ </server>
+
<service name="NetworkInterface"
discovery="SubsystemDiscovery"
class="BaseComponent"
description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
<runs-inside>
- <parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="HostController" plugin="jboss-as-7"/>
<parent-resource-type name="Host" plugin="jboss-as-7"/>
<parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
</runs-inside>
@@ -616,7 +710,7 @@
class="BaseComponent"
>
<runs-inside>
- <parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="HostController" plugin="jboss-as-7"/>
<parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
</runs-inside>
commit 92e81c2b9607a0f58ca23d9695316cb6025b2a68
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Apr 18 17:55:59 2011 +0200
Allow for multiple types to be separated by a bar ( | ).
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 18ba3ba..50dd55c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -26,6 +26,8 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
@@ -62,119 +64,129 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
Configuration config = context.getDefaultPluginConfiguration();
- String cpath = config.getSimpleValue("path", null);
- if (cpath==null) {
+ String confPath = config.getSimpleValue("path", null);
+ if (confPath==null) {
log.error("Path plugin config is null for ResourceType [" + context.getResourceType().getName() +"].");
return details;
}
+ List<String> subTypes = new ArrayList<String>();
+ if (confPath.contains("|")) {
+ subTypes.addAll(Arrays.asList(confPath.split("\\|")));
+ }
+ else
+ subTypes.add(confPath);
- boolean recursive = false;
- String parentPath = parentComponent.getPath();
+ for (String cpath : subTypes) {
- String path;
- String childType = null;
- if (!cpath.contains("=")) { // NO = -> no sub path, but a type
- recursive = true;
- childType = cpath;
- }
+ boolean recursive = false;
- if (parentPath==null || parentPath.isEmpty())
- path = "";
- else
- path = parentPath;
+ String parentPath = parentComponent.getPath();
+
+ String path;
+ String childType = null;
+ if (!cpath.contains("=")) { // NO = -> no sub path, but a type
+ recursive = true;
+ childType = cpath;
- if (cpath.contains("="))
- path += "," + cpath;
+ }
- System.out.println("total path: [" + path + "]");
+ if (parentPath==null || parentPath.isEmpty())
+ path = "";
+ else
+ path = parentPath;
+ if (cpath.contains("="))
+ path += "," + cpath;
- JsonNode json ;
- if (!recursive)
- json = connection.getLevelData(path,recursive, false);
- else {
- List<PROPERTY_VALUE> addr ;
- addr = parentComponent.pathToAddress(parentPath);
- json = connection.executeRaw(new ReadChildrenNames(addr, childType));
- }
- if (!ASConnection.isErrorReply(json)) {
- if (recursive) {
+ System.out.println("total path: [" + path + "]");
+
+
+ JsonNode json ;
+ if (!recursive)
+ json = connection.getLevelData(path,recursive, false);
+ else {
+ List<PROPERTY_VALUE> addr ;
+ addr = parentComponent.pathToAddress(parentPath);
+ json = connection.executeRaw(new ReadChildrenNames(addr, childType));
+ }
+ if (!ASConnection.isErrorReply(json)) {
+ if (recursive) {
- JsonNode subNode = json.findPath("result");
+ JsonNode subNode = json.findPath("result");
- if (subNode!=null && subNode.isContainerNode()){
+ if (subNode!=null && subNode.isContainerNode()){
- Iterator<JsonNode> iter = subNode.getElements();
- while (iter.hasNext()) {
+ Iterator<JsonNode> iter = subNode.getElements();
+ while (iter.hasNext()) {
- JsonNode node = iter.next();
- String val = node.getTextValue();
+ JsonNode node = iter.next();
+ String val = node.getTextValue();
- String newPath = cpath + "=" + val;
- Configuration config2 = context.getDefaultPluginConfiguration();
+ String newPath = cpath + "=" + val;
+ Configuration config2 = context.getDefaultPluginConfiguration();
- String resKey;
+ String resKey;
- if (path==null||path.isEmpty())
- resKey = newPath;
- else
- resKey = path + "," +childType + "=" + val;
+ if (path==null||path.isEmpty())
+ resKey = newPath;
+ else
+ resKey = path + "," +childType + "=" + val;
- PropertySimple pathProp = new PropertySimple("path",resKey);
- config2.put(pathProp);
+ PropertySimple pathProp = new PropertySimple("path",resKey);
+ config2.put(pathProp);
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- resKey, // Key
- val, // Name
- null, // Version
- "TODO", // subsystem.description, // TODO Description
- config2,
- null);
- details.add(detail);
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ resKey, // Key
+ val, // Name
+ null, // Version
+ "TODO", // subsystem.description, // TODO Description
+ config2,
+ null);
+ details.add(detail);
+ }
}
- }
- else {
+ else {
- if (subNode==null) {
- log.error("subNode was null for " + path + " and type " + context.getResourceType().getName());
+ if (subNode==null) {
+ log.error("subNode was null for " + path + " and type " + context.getResourceType().getName());
+ }
+ else if (!subNode.isNull())
+ log.info("subnode was no container");
}
- else if (!subNode.isNull())
- log.info("subnode was no container");
+
}
+ else {
- }
- else {
+ String resKey = path;
+ String name = resKey.substring(resKey.lastIndexOf("=") + 1);
+ Configuration config2 = context.getDefaultPluginConfiguration();
+ PropertySimple pathProp = new PropertySimple("path",path);
+ config2.put(pathProp);
- String resKey = path;
- String name = resKey.substring(resKey.lastIndexOf("=") + 1);
- Configuration config2 = context.getDefaultPluginConfiguration();
- PropertySimple pathProp = new PropertySimple("path",path);
- config2.put(pathProp);
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ path, // Key
+ name, // Name
+ null, // Version
+ path, // Description
+ config2,
+ null);
+ details.add(detail);
+ }
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- path, // Key
- name, // Name
- null, // Version
- path, // Description
- config2,
- null);
- details.add(detail);
}
- return details;
}
-
- return Collections.emptySet();
+ return details;
}
}
commit 3496a92b6fc1765c530141c84062dc1e106f9b71
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Apr 18 17:21:49 2011 +0200
(Yet) small helper to create the properties for resource configurations by reading the descriptions from the domain.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Properties.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Properties.java
new file mode 100644
index 0000000..0b8b38e
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/Domain2Properties.java
@@ -0,0 +1,200 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import com.apple.java.Usage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Generate properties from a domain dump
+ * @author Heiko W. Rupp
+ */
+public class Domain2Properties {
+
+ public static void main(String[] args) throws Exception {
+
+ if (args.length<2) {
+ usage();
+ System.exit(1);
+ }
+
+ Domain2Properties dp = new Domain2Properties();
+ dp.run(args);
+
+
+ }
+
+ private void run(String[] args) {
+
+ String path = args[0];
+ String type = args[1];
+
+ ASConnection conn = new ASConnection("localhost",9990);
+
+ List<PROPERTY_VALUE> address = pathToAddress(path);
+ Operation op = new Operation("read-resource-description",address,"operations",true);
+ op.addAdditionalProperty("recursive","true");
+ ComplexResult res = (ComplexResult) conn.execute(op,true);
+ if (!res.isSuccess()) {
+ System.err.println("Failure: " + res.getFailureDescription());
+ return;
+ }
+
+
+ Map<String,Object> resMap = res.getResult();
+ Map childMap = (Map) resMap.get("children");
+ Map <String,Object> typeMap = (Map<String, Object>) childMap.get(type);
+ Map descriptionMap = (Map) typeMap.get("model-description");
+ Map starMap = (Map) descriptionMap.get("*");
+ Map<String,Object> attributesMap = (Map<String, Object>) starMap.get("attributes");
+
+
+
+ for (Map.Entry<String,Object> entry : attributesMap.entrySet()) {
+
+ Map<String,Object> props = (Map<String, Object>) entry.getValue();
+
+
+ Type ptype = getTypeFromProps(props);
+ String typeString;
+
+ switch (ptype) {
+ case INT:
+ typeString = "integer"; break;
+ case STRING:
+ typeString = "string"; break;
+ case BOOLEAN:
+ typeString = "boolean"; break;
+ case LONG:
+ typeString = "long"; break;
+ case BIG_DECIMAL:
+ typeString = "long"; break; // TODO bettter float or double?
+ case LIST:
+ typeString = "-list-";
+ break; // Handled below
+ default:
+ typeString = "- unknown -";
+ System.err.println("Unknown type " + ptype + " for " + entry.getKey());
+ }
+
+ if (ptype==Type.LIST) {
+
+ System.out.println("<c:list-property name=\"" + entry.getKey() +"\" >");
+ System.out.println(" <c:simple-property name=\"" + entry.getKey() + "\" />");
+ System.out.println("</c:list-property>");
+
+
+
+ continue;
+ }
+
+ StringBuilder sb = new StringBuilder("<c:simple-property name=\"");
+ sb.append(entry.getKey()).append('"');
+
+ if ((Boolean) props.get("required")) {
+ sb.append(" required=\"true\"");
+ }
+
+ sb.append(" type=\"").append(typeString).append("\"");
+ sb.append(" readOnly=\"");
+ if (props.get("access-type").equals("read-only"))
+ sb.append("true");
+ else
+ sb.append("false");
+ sb.append('"');
+
+ String description = (String) props.get("description");
+ if (sb.length()+description.length() > 120)
+ sb.append("\n ");
+ sb.append(" description=\"").append(description).append('"');
+ sb.append("/>");
+
+ System.out.println(sb.toString());
+ }
+
+
+ }
+
+ private Type getTypeFromProps(Map<String, Object> props) {
+ Map<String,String> tMap = (Map<String, String>) props.get("type");
+ String type = tMap.get("TYPE_MODEL_VALUE");
+ Type ret = Type.valueOf(type);
+
+ return ret;
+ }
+
+ /**
+ * Convert a path in the form key=value,key=value... to a List of properties.
+ * @param path Path to translate
+ * @return List of properties
+ */
+ public List<PROPERTY_VALUE> pathToAddress(String path) {
+ if (path==null || path.isEmpty())
+ return Collections.emptyList();
+
+ List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
+ String[] components = path.split(",");
+ for (String component : components) {
+ String tmp = component.trim();
+
+ if (tmp.contains("=")) {
+ // strip / from the start of the key if it happens to be there
+ if (tmp.startsWith("/"))
+ tmp = tmp.substring(1);
+
+ String[] pair = tmp.split("=");
+ PROPERTY_VALUE valuePair = new PROPERTY_VALUE(pair[0], pair[1]);
+ result.add(valuePair);
+ }
+ }
+
+ return result;
+ }
+
+
+
+ private static void usage() {
+ System.out.println("Domain2Properties path type");
+ System.out.println(" path is of kind 'key=value[,key=value]+");
+ }
+
+ public enum Type {
+ STRING,
+ INT,
+ BOOLEAN,
+ LONG,
+ BIG_DECIMAL,
+ OBJECT,
+ LIST
+
+ ;
+ }
+
+}
commit e42f046825018fb8c74b6e33c3be401acf47acb4
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Apr 18 12:54:56 2011 +0200
If we detect the DC, name it so.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 0de50b8..12d3ec6 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -133,10 +133,6 @@ public class ASConnection {
outcome = outcomeNode.getTextValue();
if (outcome.equals("failed")) {
JsonNode reasonNode = in.findValue("failure-description");
- if (reasonNode==null)
- reasonNode = in.findValue("domain-failure-description");// TODO JBAS-9182
- if (reasonNode==null)
- reasonNode = in.findValue("host-failure-descriptions"); // TODO JBAS-9182
String reason = reasonNode.getTextValue();
// log.info(reason);
@@ -266,10 +262,6 @@ public class ASConnection {
if (jsonNode==null)
return "getFailureDescription: -input was null-";
JsonNode node = jsonNode.findValue("failure-description");
- if (node==null)
- node = jsonNode.findValue("domain-failure-description"); // TODO JBAS-9182
- if (node==null)
- node = jsonNode.findValue("host-failure-descriptions"); // TODO JBAS-9182
return node.getValueAsText();
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
index 7a648c9..63a4e45 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
@@ -48,8 +48,8 @@ public abstract class AbstractBaseDiscovery<T extends ResourceComponent> impleme
// private final Log log = LogFactory.getLog(AbstractBaseDiscovery.class);
- protected void readHostXml(ProcessInfo processInfo) {
- String hostXmlFile = getHostXmlFileLocation(processInfo);
+ protected void readHostXml(ProcessInfo processInfo,boolean isDomainMode) {
+ String hostXmlFile = getHostXmlFileLocation(processInfo,isDomainMode);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
@@ -61,23 +61,6 @@ public abstract class AbstractBaseDiscovery<T extends ResourceComponent> impleme
}
}
- /**
- * Get the location of the host definition file (host.xml in domain mode, standalone.xml
- * in standalone mode.
- *
- * @param processInfo ProcessInfo structure containing the ENV variables
- * @return The path to the definition file.
- */
- private String getHostXmlFileLocation(ProcessInfo processInfo) {
-
- String home = getHomeDirFromCommandLine(processInfo.getCommandLine());
- StringBuilder builder = new StringBuilder(home);
- builder.append("/domain");
- builder.append("/configuration");
- builder.append("/host.xml");
- return builder.toString();
-
- }
String getHomeDirFromCommandLine(String[] commandLine) {
for (String line: commandLine) {
@@ -202,6 +185,32 @@ public abstract class AbstractBaseDiscovery<T extends ResourceComponent> impleme
return new HostPort(false);
}
+ /**
+ * Get the location of the host definition file (host.xml in domain mode, standalone.xml
+ * in standalone mode.
+ * @param processInfo ProcessInfo structure containing the ENV variables
+ * @param isDomain Are we looking for host.xml (=isDomain) or not
+ * @return The path to the definition file.
+ */
+ protected String getHostXmlFileLocation(ProcessInfo processInfo, boolean isDomain) {
+
+ String home = processInfo.getEnvironmentVariable("jboss.home.dir");
+ if (home==null)
+ home = getHomeDirFromCommandLine(processInfo.getCommandLine());
+ StringBuilder builder = new StringBuilder(home);
+ if (isDomain)
+ builder.append("/domain");
+ else
+ builder.append("/standalone");
+ builder.append("/configuration");
+ if (isDomain)
+ builder.append("/host.xml");
+ else
+ builder.append("/standalone.xml");
+ return builder.toString();
+
+ }
+
protected static class HostPort {
String host;
int port;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 3b77360..f03f62c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -53,6 +53,8 @@ import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pluginapi.operation.OperationFacet;
+import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
@@ -71,7 +73,7 @@ import java.util.Map;
import java.util.Set;
public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet,
- CreateChildResourceFacet
+ CreateChildResourceFacet, OperationFacet
{
final Log log = LogFactory.getLog(this.getClass());
@@ -490,4 +492,10 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return report;
}
+
+ @Override
+ public OperationResult invokeOperation(String name,
+ Configuration parameters) throws InterruptedException, Exception {
+ return null; // TODO: Customise this generated block
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
index 9fa8396..8d9ff0f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
@@ -49,7 +49,7 @@ import org.rhq.plugins.jmx.JMXDiscoveryComponent;
/**
* Discovery class
*/
-public class BaseProcessDiscovery implements ResourceDiscoveryComponent
+public class BaseProcessDiscovery extends AbstractBaseDiscovery implements ResourceDiscoveryComponent
{
@@ -80,8 +80,19 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
serverNameFull = "ProcessController";
serverName = "ProcessController";
} else if (psName.equals("HostController")) {
- serverName = "HostController";
- serverNameFull = "HostController";
+ readHostXml(psr.getProcessInfo(),true);
+ HostPort hp = getDomainControllerFromHostXml();
+ if (hp.isLocal) {
+ serverName = "DomainController";
+ serverNameFull = "DomainController";
+ }
+ else {
+ serverName = "HostController";
+ serverNameFull = "HostController";
+ }
+ config.put(new PropertySimple("homedir",getHomeDirFromCommandLine(psr.getProcessInfo().getCommandLine())));
+ // TODO add the start script
+
} else {
serverNameFull = getBaseDirFromCommandLine(commandLine);
if (serverNameFull==null || serverNameFull.isEmpty()) {
@@ -127,7 +138,7 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
serverNameFull, // key TODO distinguish per domain?
serverName, // Name
null, // TODO real version ?
- "TODO", // Description
+ discoveryContext.getResourceType().getDescription(), // Description
config,
psr.getProcessInfo()
);
@@ -160,30 +171,6 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
return hostName;
}
- /**
- * Get the location of the host definition file (host.xml in domain mode, standalone.xml
- * in standalone mode.
- * @param processInfo ProcessInfo structure containing the ENV variables
- * @param isDomain Are we looking for host.xml (=isDomain) or not
- * @return The path to the definition file.
- */
- private String getHostXmlFileLocation(ProcessInfo processInfo, boolean isDomain) {
-
- String home = processInfo.getEnvironmentVariable("jboss.home.dir");
- StringBuilder builder = new StringBuilder(home);
- if (isDomain)
- builder.append("/domain");
- else
- builder.append("/standalone");
- builder.append("/configuration");
- if (isDomain)
- builder.append("/host.xml");
- else
- builder.append("/standalone.xml");
- return builder.toString();
-
- }
-
String getBaseDirFromCommandLine(String[] commandLine) {
for (String line: commandLine) {
if (line.startsWith(DJBOSS_SERVER_BASE_DIR))
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
index 667b3ee..a8b1058 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
@@ -61,7 +61,7 @@ public class DomainDiscovery extends AbstractBaseDiscovery<BaseComponent> {
// Now we have the host controller, lets get the host.xml file
// and obtain the domain controller info from there
ProcessInfo processInfo = psr.getProcessInfo();
- readHostXml(processInfo);
+ readHostXml(processInfo,true);
HostPort dcHp = getDomainControllerFromHostXml();
if (!dcHp.isLocal) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
index 7f39a9f..3f57a06 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
@@ -70,7 +70,7 @@ public class ManagedASDiscovery extends AbstractBaseDiscovery
// Now we have the host controller, lets get the host.xml file
// and obtain the servers from there.
ProcessInfo processInfo = psr.getProcessInfo();
- readHostXml(processInfo);
+ readHostXml(processInfo,true);
String hostName = findHostName();
HostPort managementHostPort = getManagementPortFromHostXml();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
index a87a6f8..ccc967b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
@@ -37,10 +37,6 @@ public class Result {
private Operation compensatingOperation;
@JsonProperty("failure-description")
private List<Map<String, String>> failureDescription;
- @JsonProperty("host-failure-description") // TODO JBAS-9182
- private List<Map<String, String>> hostFailureDescription;
- @JsonProperty("domain-failure-description") // TODO JBAS-9182
- private List<Map<String, String>> domainFailureDescription;
@JsonIgnore
private boolean success = false;
@@ -86,19 +82,4 @@ public class Result {
this.failureDescription = failureDescription;
}
- public List<Map<String, String>> getHostFailureDescription() {
- return hostFailureDescription;
- }
-
- public void setHostFailureDescription(List<Map<String, String>> hostFailureDescription) {
- this.hostFailureDescription = hostFailureDescription;
- }
-
- public List<Map<String, String>> getDomainFailureDescription() {
- return domainFailureDescription;
- }
-
- public void setDomainFailureDescription(List<Map<String, String>> domainFailureDescription) {
- this.domainFailureDescription = domainFailureDescription;
- }
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index b6600ab..80df496 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -83,7 +83,7 @@
<server name="HostController"
discovery="BaseProcessDiscovery"
class="BaseComponent"
- description="Domain controller delegate for this host"
+ description="Domain controller (delegate) for this host"
>
<plugin-configuration>
@@ -96,8 +96,7 @@
<process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
- <operation name="dummyOperation">
- <!-- TODO supply parameters and return values -->
+ <operation name="shutdown" description="Shut this Host-/Domaincontroller down with all managed servers.">
</operation>
commit d59ccb6efc2e5edc240ae388c036a0087b4a5e9c
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Apr 15 15:16:37 2011 +0200
Add domain level deployments
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 8d47d9d..3b77360 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -34,20 +34,27 @@ 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.PropertySimpleType;
+import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.resource.CreateResourceStatus;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.core.pluginapi.content.ContentContext;
+import org.rhq.core.pluginapi.content.ContentServices;
+import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
+import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.core.pluginapi.inventory.DeleteResourceFacet;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
@@ -55,6 +62,7 @@ import org.rhq.modules.plugins.jbossas7.json.ReadAttribute;
import org.rhq.modules.plugins.jbossas7.json.ReadResource;
import org.rhq.modules.plugins.jbossas7.json.Result;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -62,7 +70,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet
+public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet,
+ CreateChildResourceFacet
{
final Log log = LogFactory.getLog(this.getClass());
@@ -178,7 +187,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
ObjectMapper mapper = new ObjectMapper();
Set<Map.Entry<String, PropertyDefinition>> entrySet = configDef.getPropertyDefinitions().entrySet();
- for (Map.Entry<String,PropertyDefinition> propDefEntry: entrySet) { // TODO all properties
+ for (Map.Entry<String,PropertyDefinition> propDefEntry: entrySet) {
PropertyDefinition propDef = propDefEntry.getValue();
JsonNode sub = json.findValue(propDef.getName());
if (propDef instanceof PropertyDefinitionSimple) {
@@ -187,7 +196,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
if (sub!=null)
propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
else {
- propertySimple = new PropertySimple(propDef.getName(),null); // TODO store it at all when it is null?
+ propertySimple = new PropertySimple(propDef.getName(),"- null -"); // TODO store it at all when it is null?
}
ret.put(propertySimple);
} else if (propDef instanceof PropertyDefinitionList) {
@@ -415,4 +424,70 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
if (!res.isSuccess())
throw new IllegalArgumentException("Delete for [" + path + "] failed: " + res.getFailureDescription());
}
+
+
+ @Override
+ public CreateResourceReport createResource(CreateResourceReport report) {
+
+
+ ResourcePackageDetails details = report.getPackageDetails();
+
+ ContentContext cctx = context.getContentContext();
+ ContentServices contentServices = cctx.getContentServices();
+ String resourceTypeName = report.getResourceType().getName();
+
+ ASUploadConnection uploadConnection = new ASUploadConnection(host,port);
+ OutputStream out = uploadConnection.getOutputStream(details.getFileName());
+ contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out);
+
+ JsonNode uploadResult = uploadConnection.finishUpload();
+ System.out.println(uploadResult);
+ if (ASConnection.isErrorReply(uploadResult)) {
+ report.setStatus(CreateResourceStatus.FAILURE);
+ report.setErrorMessage(ASConnection.getFailureDescription(uploadResult));
+
+ return report;
+ }
+
+ String fileName = details.getFileName();
+ String tmpName = fileName; // TODO figure out the tmp-name biz with the AS guys
+
+ JsonNode resultNode = uploadResult.get("result");
+ String hash = resultNode.get("BYTES_VALUE").getTextValue();
+ ASConnection connection = getASConnection();
+
+ Operation step1 = new Operation("add","deployment",tmpName);
+ step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+ step1.addAdditionalProperty("name", tmpName);
+ step1.addAdditionalProperty("runtime-name", fileName);
+
+ CompositeOperation cop = new CompositeOperation();
+ cop.addStep(step1);
+
+ /*
+ * We need to check here if this is an upload to /deployment only
+ * or if this should be deployed to a server group too
+ */
+ if (context.getResourceKey().contains("server-group=")) {
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.addAll(pathToAddress(context.getResourceKey()));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", tmpName));
+ Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+
+ cop.addStep(step2);
+ }
+
+ JsonNode result = connection.executeRaw(cop);
+ if (ASConnection.isErrorReply(result)) {
+ report.setErrorMessage(ASConnection.getFailureDescription(resultNode));
+ report.setStatus(CreateResourceStatus.FAILURE);
+ }
+ else {
+ report.setStatus(CreateResourceStatus.SUCCESS);
+ }
+
+ return report;
+
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index c2d1994..8c46247 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -157,64 +157,6 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
return null; // TODO: Customise this generated block
}
- @Override
- public CreateResourceReport createResource(CreateResourceReport report) {
-
-
- ResourcePackageDetails details = report.getPackageDetails();
-
- ContentContext cctx = context.getContentContext();
- ContentServices contentServices = cctx.getContentServices();
- String resourceTypeName = report.getResourceType().getName();
-
- ASUploadConnection uploadConnection = new ASUploadConnection(host,port);
- OutputStream out = uploadConnection.getOutputStream(details.getFileName());
- contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out);
-
- JsonNode uploadResult = uploadConnection.finishUpload();
- System.out.println(uploadResult);
- if (ASConnection.isErrorReply(uploadResult)) {
- report.setStatus(CreateResourceStatus.FAILURE);
- report.setErrorMessage(ASConnection.getFailureDescription(uploadResult));
-
- return report;
- }
-
- String fileName = details.getFileName();
- String tmpName = fileName; // TODO figure out the tmp-name biz with the AS guys
-
- JsonNode resultNode = uploadResult.get("result");
- String hash = resultNode.get("BYTES_VALUE").getTextValue();
- ASConnection connection = getASConnection();
-
- Operation step1 = new Operation("add","deployment",tmpName);
- step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
- step1.addAdditionalProperty("name", tmpName);
- step1.addAdditionalProperty("runtime-name", fileName);
-
- List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
- serverGroupAddress.addAll(pathToAddress(context.getResourceKey()));
- serverGroupAddress.add(new PROPERTY_VALUE("deployment", tmpName));
- Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
-
- CompositeOperation cop = new CompositeOperation();
- cop.addStep(step1);
- cop.addStep(step2);
-
- JsonNode result = connection.executeRaw(cop);
- if (ASConnection.isErrorReply(result)) {
- report.setErrorMessage(ASConnection.getFailureDescription(resultNode));
- report.setStatus(CreateResourceStatus.FAILURE);
- }
- else {
- report.setStatus(CreateResourceStatus.SUCCESS);
- }
-
- return report;
-
- }
-
-
private String serverGroupFromKey() {
String key1 = context.getResourceKey();
return key1.substring(key1.lastIndexOf("/")+1);
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index a699550..b6600ab 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -202,6 +202,7 @@
<configuration>
<c:group name="deployment" displayName="Deployment Options">
<c:simple-property name="runtimeName" required="true"/>
+ <c:simple-property name="alreadyUploaded" type="boolean" description="Was this already uploaded to the Domain? TODO"/>
</c:group>
</configuration>
</content>
@@ -237,6 +238,24 @@
</operation>
</server>
+ <service name="DomainDeployment"
+ class="BaseComponent"
+ discovery="SubsystemDiscovery"
+ createDeletePolicy="both"
+ creationDataType="content">
+ <plugin-configuration>
+ <c:simple-property name="path" default="deployment" readOnly="true"/>
+ </plugin-configuration>
+
+ <content name="file" category="deployable" isCreationType="true" description="Deployments on this domain">
+ </content>
+
+ <resource-configuration>
+ <c:simple-property name="name" readOnly="true"/>
+ <c:simple-property name="runtime-name" readOnly="true"/>
+ <c:simple-property name="hash" readOnly="true"/>
+ </resource-configuration>
+ </service>
</server>
<server name="JBossAS7-Standalone"
commit 187e9130ad1521cd4d20cb93d08d171024733da2
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Apr 15 12:11:24 2011 +0200
Support removing deployments from server groups.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 3403b29..8d47d9d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -47,6 +47,7 @@ import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
@@ -407,8 +408,11 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
@Override
public void deleteResource() throws Exception {
- // TODO: Customise this generated block
System.out.println("delete resource: " + path);
+ Operation op = new Operation("remove",pathToAddress(path));
+ ComplexResult res = (ComplexResult) connection.execute(op, true);
+ if (!res.isSuccess())
+ throw new IllegalArgumentException("Delete for [" + path + "] failed: " + res.getFailureDescription());
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 13560e7..a699550 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -186,14 +186,13 @@
<resource-configuration>
<c:simple-property name="profile" />
<c:simple-property name="socket-binding-group"/>
- <c:simple-property name="jvm"/>
- <c:simple-property name="deployment" required="false"/> <!-- TODO change structure. Or put below as resource? -->
+ <c:simple-property name="jvm" required="false"/>
</resource-configuration>
<service name="Deployment"
class="BaseComponent"
discovery="SubsystemDiscovery"
- createDeletePolicy="create-only"
+ createDeletePolicy="both"
creationDataType="content">
<plugin-configuration>
<c:simple-property name="path" default="deployment" readOnly="true"/>
commit c3eed4cad8cf3401ef726fc73a75d51acf51d6c3
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Apr 15 10:57:23 2011 +0200
Creation of deployments, managed servers (2nd way)
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 3a978b4..0de50b8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -174,12 +174,14 @@ public class ASConnection {
out.flush();
out.close();
- if (conn.getResponseCode()==HttpURLConnection.HTTP_OK) {
+ int responseCode = conn.getResponseCode();
+ if (responseCode ==HttpURLConnection.HTTP_OK) {
inputStream = conn.getInputStream();
} else {
inputStream = conn.getErrorStream();
}
+ if (inputStream!=null) {
br = new BufferedReader(new InputStreamReader(
inputStream));
@@ -200,6 +202,10 @@ public class ASConnection {
}
System.out.println("==> " + outcome);
return operationResult;
+ }
+ else {
+ System.err.println("IS was null and code was " + responseCode);
+ }
} catch (IOException e) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 6109c9f..3403b29 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -42,6 +42,7 @@ import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.core.pluginapi.inventory.DeleteResourceFacet;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
@@ -60,7 +61,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet
+public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet
{
final Log log = LogFactory.getLog(this.getClass());
@@ -404,4 +405,10 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return result;
}
+ @Override
+ public void deleteResource() throws Exception {
+ // TODO: Customise this generated block
+
+ System.out.println("delete resource: " + path);
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
index 8597d8f..9fa8396 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
@@ -105,7 +105,7 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
}
String logFile = getLogFileFromCommandLine(commandLine);
initLogEventSourcesConfigProp(logFile,config);
- String javaClazz = psr.getProcessInfo().getName();
+// String javaClazz = psr.getProcessInfo().getName();
/*
@@ -115,11 +115,11 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
*/
// config.put(new PropertySimple(JMXDiscoveryComponent.COMMAND_LINE_CONFIG_PROPERTY,
// javaClazz));
- config.put(new PropertySimple(JMXDiscoveryComponent.CONNECTION_TYPE,
- LocalVMTypeDescriptor.class.getName()));
-
- // TODO vmid will change when the detected server is bounced - how do we follow this?
- config.put(new PropertySimple(JMXDiscoveryComponent.VMID_CONFIG_PROPERTY,psr.getProcessInfo().getPid()));
+// config.put(new PropertySimple(JMXDiscoveryComponent.CONNECTION_TYPE,
+// LocalVMTypeDescriptor.class.getName()));
+//
+// // TODO vmid will change when the detected server is bounced - how do we follow this?
+// config.put(new PropertySimple(JMXDiscoveryComponent.VMID_CONFIG_PROPERTY,psr.getProcessInfo().getPid()));
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index 05f79d8..1d73822 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -125,6 +125,26 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
Map<String,Object> props = new HashMap<String, Object>();
props.put("queue-address",queueName);
operation = new Operation(op,address);
+ } else if (what.equals("managed-server")) {
+ String chost = parameters.getSimpleValue("hostname","");
+ String serverName = parameters.getSimpleValue("servername","");
+ String serverGroup = parameters.getSimpleValue("server-group","");
+ String socketBindings = parameters.getSimpleValue("socket-bindings","");
+ String portS = parameters.getSimpleValue("port-offset","0");
+ int port = Integer.parseInt(portS);
+ String autostartS = parameters.getSimpleValue("auto-start","false");
+ boolean autoStart = Boolean.getBoolean(autostartS);
+
+ address.add(new PROPERTY_VALUE("host", chost));
+ address.add(new PROPERTY_VALUE("server-config",serverName));
+ Map<String,Object> props = new HashMap<String, Object>();
+ props.put("name",serverName);
+ props.put("group",serverGroup);
+ props.put("socket-binding-group",socketBindings);
+ props.put("socket-binding-port-offset",port);
+ props.put("auto-start",autoStart);
+
+ operation = new Operation(op,address,props);
}
OperationResult operationResult = new OperationResult();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index 8bafbb4..c2d1994 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -91,7 +91,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
step1.addAdditionalProperty("name", fileName);
List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
- serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
+ serverGroupAddress.addAll(pathToAddress(context.getResourceKey()));
serverGroupAddress.add(new PROPERTY_VALUE("deployment", fileName));
Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
@@ -180,22 +180,21 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
return report;
}
- String fileName = report.getUserSpecifiedResourceName();
+ String fileName = details.getFileName();
+ String tmpName = fileName; // TODO figure out the tmp-name biz with the AS guys
JsonNode resultNode = uploadResult.get("result");
String hash = resultNode.get("BYTES_VALUE").getTextValue();
ASConnection connection = getASConnection();
- List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
- deploymentsAddress.add(new PROPERTY_VALUE("deployment", fileName));
- Operation step1 = new Operation("add",deploymentsAddress);
+ Operation step1 = new Operation("add","deployment",tmpName);
step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
- step1.addAdditionalProperty("name", fileName); // TODO set a random name here - or wait on AS to "fix" this
+ step1.addAdditionalProperty("name", tmpName);
step1.addAdditionalProperty("runtime-name", fileName);
List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
- serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
- serverGroupAddress.add(new PROPERTY_VALUE("deployment", fileName));
+ serverGroupAddress.addAll(pathToAddress(context.getResourceKey()));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", tmpName));
Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
CompositeOperation cop = new CompositeOperation();
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index f2c9a5e..13560e7 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -134,6 +134,30 @@
<c:simple-property name="name" description="Name of Group to add"/>
</parameters>
</operation>
+ <operation name="managed-server:add" displayName="Add managed server" description="Add a new managed server">
+ <parameters>
+ <c:simple-property name="servername" displayName="Name of the new server" required="true"/>
+ <c:simple-property name="hostname" displayName="Name of the host to put the server on" required="true"/>
+ <c:simple-property name="server-group" displayName="Server group to add to" required="true"/>
+ <c:simple-property name="socket-bindings" displayName="Socket bindings to base upon" default="standard-sockets" description="Socket bindings to base upon"/>
+ <c:simple-property name="port-offset" displayName="Port offset" default="0" type="integer" />
+ <c:simple-property name="auto-start" displayName="Autostart" default="false" type="boolean" />
+ </parameters>
+ <results>
+ <c:simple-property name="result" description="Outcome of the create server operation"/>
+ </results>
+ </operation>
+ <operation name="managed-server:remove" displayName="Remove managed server" description="Remove a managed server">
+ <parameters>
+ <c:simple-property name="servername" displayName="Name of the server to remove" required="true"/>
+ <c:simple-property name="hostname" displayName="Name of the host where the server is on" required="true"/>
+ </parameters>
+ <results>
+ <c:simple-property name="result" description="Outcome of the remove server operation"/>
+ </results>
+
+ </operation>
+
<server name="Profile"
description="One profile in a domain"
@@ -166,12 +190,16 @@
<c:simple-property name="deployment" required="false"/> <!-- TODO change structure. Or put below as resource? -->
</resource-configuration>
- <service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only" creationDataType="content">
+ <service name="Deployment"
+ class="BaseComponent"
+ discovery="SubsystemDiscovery"
+ createDeletePolicy="create-only"
+ creationDataType="content">
<plugin-configuration>
<c:simple-property name="path" default="deployment" readOnly="true"/>
</plugin-configuration>
- <content name="deployment" category="deployable" isCreationType="true" description="Deployments on this domain">
+ <content name="file" category="deployable" isCreationType="true" description="Deployments on this domain">
<configuration>
<c:group name="deployment" displayName="Deployment Options">
<c:simple-property name="runtimeName" required="true"/>
@@ -208,13 +236,6 @@
<c:simple-property name="result" description="Outcome of the delete server operation"/>
</results>
</operation>
-
-<!--
- <resource-configuration>
- <c:list-property name="server-config" />
- </resource-configuration>
--->
-
</server>
</server>
commit bdf889e91b51f59f5f17346bb6e78e86f4aebbaf
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Apr 14 16:38:34 2011 +0200
SocketBindingGroups and NetworkInterfaces are now detected via SubsystemDiscovery. Deprecate getLevelData()
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 54c734d..3a978b4 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -63,6 +63,7 @@ public class ASConnection {
}
+ @Deprecated
JsonNode getLevelData(@Nullable String base, boolean recursive, boolean includeMetrics) throws Exception{
String ops = null;
if (recursive)
@@ -72,24 +73,16 @@ public class ASConnection {
return getLevelData(base,ops);
}
- /**
- * Return the default data for base
- * @param base
- * @return
- * @throws Exception
- */
- JsonNode getLevelData(@Nullable String base) throws Exception {
- return getLevelData(base,"operation=resource-description&recursive&include-runtime=true");
- }
/**
- * Return the JSON-Ojbect for a certain path.
+ * Return the JSON-Object for a certain path.
*
* @param base Path to the object/subsystem. Can be null/"" for the base objects
* @param ops OperationDescription to run on the api can be null
* @return A JSONObject encoding the level plus sub levels provided
* @throws Exception If anything goes wrong
*/
+ @Deprecated
JsonNode getLevelData(@Nullable String base, @Nullable String ops) throws Exception {
URL url2;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 8ed6c96..6109c9f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -169,6 +169,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
List<PROPERTY_VALUE> address = pathToAddress(path);
Operation op = new ReadResource(address); // TOTO set recursive flag?
+ op.addAdditionalProperty("recursive","true");
JsonNode json = connection.executeRaw(op);
Configuration ret = new Configuration();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
deleted file mode 100644
index 1fc1e9b..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.modules.plugins.jbossas7;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.modules.plugins.jbossas7.json.Attribute;
-import org.rhq.modules.plugins.jbossas7.json.Domain;
-import org.rhq.modules.plugins.jbossas7.json.NetworkInterface;
-
-/**
- * Discover subsystems
- *
- * @author Heiko W. Rupp
- */
-@SuppressWarnings("unused")
-public class InterfaceDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
- throws Exception {
-
- Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
-
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
- mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
-
- BaseComponent parentComponent = context.getParentResourceComponent();
- ASConnection connection = parentComponent.getASConnection();
-
-
-
- JsonNode json = connection.getLevelData(null, null);
- if (!ASConnection.isErrorReply(json)) {
- Domain domain = mapper.readValue(json, new TypeReference<Domain>() {});
-
- for (Map.Entry<String,String> entry: domain.interfaces.entrySet()) {
-
- String key = entry.getKey();
- String path = "/interface/" + key;
- JsonNode subJson = connection.getLevelData(path);
-
- NetworkInterface networkInterface = mapper.readValue(subJson, new TypeReference<NetworkInterface>() {});
- networkInterface.name= key;
- for (Map.Entry<String,Attribute> nentry : networkInterface.attributes.entrySet()) {
- nentry.getValue().name = nentry.getKey();
-
- String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
- String name = resKey.substring(resKey.lastIndexOf("/") + 1);
-
- Configuration config = context.getDefaultPluginConfiguration();
-
- PropertySimple propertySimple = new PropertySimple("path",path);
- config.put(propertySimple);
-
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- path, // Key
- name, // Name
- null, // Version
- networkInterface.description, // Description
- config,
- null);
- details.add(detail);
- }
- }
-
- return details;
- }
-
- return Collections.emptySet();
- }
-
-}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
deleted file mode 100644
index 89472b8..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.modules.plugins.jbossas7;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.modules.plugins.jbossas7.json.Attribute;
-import org.rhq.modules.plugins.jbossas7.json.Domain;
-import org.rhq.modules.plugins.jbossas7.json.SocketBindingGroup;
-
-/**
- * Discover subsystems
- *
- * @author Heiko W. Rupp
- */
-@SuppressWarnings("unused")
-public class SocketBindingGroupDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
- throws Exception {
-
- Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
-
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
- mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
-
- BaseComponent parentComponent = context.getParentResourceComponent();
- ASConnection connection = parentComponent.getASConnection();
-
-
-
- JsonNode json = connection.getLevelData(null, null);
- if (!ASConnection.isErrorReply(json)) {
- Domain domain = mapper.readValue(json, new TypeReference<Domain>() {});
-
- for (Map.Entry<String,String> entry: domain.socketBindingGroup.entrySet()) {
-
- String key = entry.getKey();
- String path = "/socket-binding-group/" + key;
- JsonNode subJson = connection.getLevelData(path);
-
- SocketBindingGroup bindingGroup = mapper.readValue(subJson, new TypeReference<SocketBindingGroup>() {});
- bindingGroup.name= key;
-
- String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
- String name = resKey.substring(resKey.lastIndexOf("/") + 1);
-
- Configuration config = context.getDefaultPluginConfiguration();
-
- PropertySimple propertySimple = new PropertySimple("path",path);
- config.put(propertySimple);
-
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- path, // Key
- name, // Name
- null, // Version
- "SocketBinding Group", // Description
- config,
- null);
- details.add(detail);
- }
-
- return details;
- }
-
- return Collections.emptySet();
- }
-
-}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index a7abfe6..d5802a3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -70,6 +70,13 @@ public class Operation {
}
+ public Operation(String operation, String addressKey, String addressValue) {
+ this.operation = operation;
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>(1);
+ address.add(new PROPERTY_VALUE(addressKey, addressValue));
+ this.address = address;
+ }
+
public Operation() {
// needed for Jackson
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java
index c2eab45..bf1072c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java
@@ -26,7 +26,13 @@ import java.util.List;
*/
public class ReadResource extends Operation {
+ private static final String READ_RESOURCE = "read-resource";
+
public ReadResource(List<PROPERTY_VALUE> address) {
- super("read-resource", address);
+ super(READ_RESOURCE, address);
+ }
+
+ public ReadResource(String resourceType,String typeValue) {
+ super(READ_RESOURCE,resourceType,typeValue);
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index e75507a..f2c9a5e 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -558,7 +558,7 @@
</server>
<service name="NetworkInterface"
- discovery="InterfaceDiscovery"
+ discovery="SubsystemDiscovery"
class="BaseComponent"
description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
@@ -574,7 +574,7 @@
</service>
<service name="SocketBindingGroup"
- discovery="SocketBindingGroupDiscovery"
+ discovery="SubsystemDiscovery"
class="BaseComponent"
>
<runs-inside>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 34d722c..2ca9f91 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -180,6 +180,23 @@ public class OperationJsonTest {
assert aliases.get(0).equals("example.com");
}
+ public void arrayResult1() throws Exception {
+
+ String resultString = "{\"outcome\":\"success\",\"result\":[\"standard-sockets\",\"messaging-sockets\"],\"compensating-operation\":null}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ Result result = mapper.readValue(resultString,Result.class);
+
+ assert result != null;
+ assert result.getOutcome().equals("success");
+ assert result.isSuccess();
+ List<String> stringList = (List<String>) result.getResult();
+ assert stringList.size()==2;
+ assert stringList.get(0).equals("standard-sockets");
+ assert stringList.get(1).equals("messaging-sockets");
+
+ }
+
public void compensatingOp() throws Exception {
String resultString = "{\"outcome\" : \"success\", \"result\" : null, \"compensating-operation\" : {\"operation\" : \"remove\", \"address\" : [{\"deployment\" : \"test.war\"}]}}";
commit adcd6872d41e2c96a307afbc53590c8165b8474a
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Apr 14 11:36:34 2011 +0200
Some cleanup and changes in ASConnection
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index d58f0c9..54c734d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -45,16 +45,12 @@ import org.rhq.modules.plugins.jbossas7.json.Result;
public class ASConnection {
private final Log log = LogFactory.getLog(ASConnection.class);
- private int port;
- private String host;
URL url;
String urlString;
private StringBuilder builder;
private ObjectMapper mapper;
public ASConnection(String host, int port) {
- this.host = host;
- this.port = port;
try {
url = new URL("http",host,port,"/domain-api");
@@ -167,7 +163,7 @@ public class ASConnection {
* @return JsonNode that describes the result
* @param operation an Operation that should be run on the domain controller
*/
- public JsonNode execute(Operation operation) {
+ public JsonNode executeRaw(Operation operation) {
InputStream inputStream = null;
BufferedReader br=null;
@@ -187,30 +183,18 @@ public class ASConnection {
if (conn.getResponseCode()==HttpURLConnection.HTTP_OK) {
inputStream = conn.getInputStream();
-
- br = new BufferedReader(new InputStreamReader(
- inputStream));
- String line;
- builder = new StringBuilder();
- while ((line = br.readLine()) != null) {
- builder.append(line);
- }
- br.close();
+ } else {
+ inputStream = conn.getErrorStream();
}
- else {
- InputStream errorStream = conn.getErrorStream();
- if (errorStream!=null) {
- br = new BufferedReader(new InputStreamReader(errorStream));
- String line;
- builder = new StringBuilder();
- while ((line = br.readLine()) != null) {
- builder.append(line);
- }
- br.close();
- }
+
+
+ br = new BufferedReader(new InputStreamReader(
+ inputStream));
+ String line;
+ builder = new StringBuilder();
+ while ((line = br.readLine()) != null) {
+ builder.append(line);
}
- if (br!=null)
- br.close();
String outcome;
JsonNode operationResult=null;
@@ -227,13 +211,20 @@ public class ASConnection {
} catch (IOException e) {
log.error("Failed to get data: " + e.getMessage() );
+ } finally {
+ if (br!=null)
+ try {
+ br.close();
+ } catch (IOException e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ }
}
return null;
}
- public Result execute2(Operation op, boolean isComplex){
- JsonNode node = execute(op);
+ public Result execute(Operation op, boolean isComplex){
+ JsonNode node = executeRaw(op);
try {
Result res;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
index 63b7881..b369a95 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
@@ -18,7 +18,6 @@
*/
package org.rhq.modules.plugins.jbossas7;
-import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.Closeable;
@@ -29,8 +28,6 @@ import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
-import com.sun.org.apache.xerces.internal.impl.xpath.regex.REUtil;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
@@ -51,18 +48,26 @@ public class ASUploadConnection {
private static final String POST_REQUEST_METHOD = "POST";
- private static final String UPLOAD_URL = "http://localhost:9990/domain-api/add-content";
+ private static final String UPLOAD_URL_PATH = "/domain-api/add-content";
private final Log log = LogFactory.getLog(ASUploadConnection.class);
BufferedOutputStream os = null;
InputStream is = null;
private HttpURLConnection connection;
+ private String host;
+ private int port;
+
+ public ASUploadConnection(String dcHost, int port) {
+ this.host = dcHost;
+ this.port = port;
+ }
public OutputStream getOutputStream(String fileName) {
try {
// Create the HTTP connection to the upload URL
- connection = (HttpURLConnection) new URL(UPLOAD_URL).openConnection();
+ String url = "http://" + host + ":" + port + UPLOAD_URL_PATH;
+ connection = (HttpURLConnection) new URL(url).openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod(POST_REQUEST_METHOD);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 26e2b4a..8ed6c96 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -70,6 +70,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
ASConnection connection;
String path;
String key;
+ String host;
+ int port;
/**
* Return availability of this resource
@@ -91,9 +93,9 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
// TODO add code to start the resource / connection to it
String typeName = context.getResourceType().getName();
- String host = conf.getSimpleValue("hostname","localhost");
+ host = conf.getSimpleValue("hostname","localhost");
String portString = conf.getSimpleValue("port","9990");
- int port = Integer.parseInt(portString);
+ port = Integer.parseInt(portString);
connection = new ASConnection(host,port);
path = conf.getSimpleValue("path", null);
@@ -130,8 +132,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
Operation op = new ReadAttribute(pathToAddress(path),req.getName()); // TODO batching
- //JsonNode obj = connection.execute(op);
- Result res = connection.execute2(op, false);
+ //JsonNode obj = connection.executeRaw(op);
+ Result res = connection.execute(op, false);
if (!res.isSuccess())
continue;
@@ -167,7 +169,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
List<PROPERTY_VALUE> address = pathToAddress(path);
Operation op = new ReadResource(address); // TOTO set recursive flag?
- JsonNode json = connection.execute(op);
+ JsonNode json = connection.executeRaw(op);
Configuration ret = new Configuration();
ObjectMapper mapper = new ObjectMapper();
@@ -364,7 +366,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
NameValuePair nvp = new NameValuePair(entry.getKey(),entry.getValue().getStringValue());
Operation writeAttribute = new Operation("write-attribute",pathToAddress(getResultingPath()),nvp);
- JsonNode result= connection.execute(writeAttribute);
+ JsonNode result= connection.executeRaw(writeAttribute);
if(ASConnection.isErrorReply(result)) {
report.setStatus(ConfigurationUpdateStatus.FAILURE);
report.setErrorMessage(ASConnection.getFailureDescription(result));
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index 176e6ce..05f79d8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -19,7 +19,6 @@
package org.rhq.modules.plugins.jbossas7;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -51,7 +50,7 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
Operation getStatus = new Operation("read-attribute",address,"name","status");
JsonNode result = null;
try {
- result = connection.execute(getStatus);
+ result = connection.executeRaw(getStatus);
} catch (Exception e) {
log.warn(e.getMessage());
return AvailabilityType.DOWN;
@@ -130,7 +129,7 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
OperationResult operationResult = new OperationResult();
if (operation!=null) {
- JsonNode result = connection.execute(operation);
+ JsonNode result = connection.executeRaw(operation);
if (ASConnection.isErrorReply(result)) {
operationResult.setErrorMessage(ASConnection.getFailureDescription(result));
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
index 264716e..7f39a9f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
@@ -127,7 +127,7 @@ public class ManagedASDiscovery extends AbstractBaseDiscovery
List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
address.add(new PROPERTY_VALUE("server-group",serverGroup));
Operation op = new ReadResource(address);
- ComplexResult res = (ComplexResult) dcConnection.execute2(op,true);
+ ComplexResult res = (ComplexResult) dcConnection.execute(op, true);
if (res.isSuccess()) {
if (res.getResult().containsKey("socket-binding-group")) {
String sbg = (String) res.getResult().get("socket-binding-group");
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index b79c9a3..8bafbb4 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -26,8 +26,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.content.PackageDetailsKey;
@@ -53,11 +51,11 @@ import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
* Component dealing with server group specific things
* @author Heiko W. Rupp
*/
+@SuppressWarnings("unused")
public class ServerGroupComponent extends DomainComponent implements ContentFacet, CreateChildResourceFacet {
private static final String SUCCESS = "success";
private static final String OUTCOME = "outcome";
- private final Log log = LogFactory.getLog(ServerGroupComponent.class);
@Override
public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) {
@@ -74,7 +72,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
for (ResourcePackageDetails details : packages) {
- ASUploadConnection uploadConnection = new ASUploadConnection();
+ ASUploadConnection uploadConnection = new ASUploadConnection(host,port);
String fileName = details.getFileName();
OutputStream out = uploadConnection.getOutputStream(fileName);
contentServices.downloadPackageBits(cctx, details.getKey(), out, false);
@@ -101,7 +99,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
cop.addStep(step1);
cop.addStep(step2);
- JsonNode result = connection.execute(cop);
+ JsonNode result = connection.executeRaw(cop);
if (ASConnection.isErrorReply(result)) // TODO get failure message into response
response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE));
else
@@ -131,7 +129,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
List<PROPERTY_VALUE> serverGroupAddress = pathToAddress(path);
Operation op = new ReadChildrenNames(serverGroupAddress,"deployment"); // TODO read full packages not onyl names
- JsonNode node = connection.execute(op);
+ JsonNode node = connection.executeRaw(op);
if (ASConnection.isErrorReply(node))
return null;
@@ -169,9 +167,8 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
ContentServices contentServices = cctx.getContentServices();
String resourceTypeName = report.getResourceType().getName();
- ASUploadConnection uploadConnection = new ASUploadConnection();
+ ASUploadConnection uploadConnection = new ASUploadConnection(host,port);
OutputStream out = uploadConnection.getOutputStream(details.getFileName());
-// contentServices.downloadPackageBits(cctx,details.getKey(),out,false);
contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out);
JsonNode uploadResult = uploadConnection.finishUpload();
@@ -205,7 +202,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
cop.addStep(step1);
cop.addStep(step2);
- JsonNode result = connection.execute(cop);
+ JsonNode result = connection.executeRaw(cop);
if (ASConnection.isErrorReply(result)) {
report.setErrorMessage(ASConnection.getFailureDescription(resultNode));
report.setStatus(CreateResourceStatus.FAILURE);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index f233e3e..18ba3ba 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -98,7 +98,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
else {
List<PROPERTY_VALUE> addr ;
addr = parentComponent.pathToAddress(parentPath);
- json = connection.execute(new ReadChildrenNames(addr, childType));
+ json = connection.executeRaw(new ReadChildrenNames(addr, childType));
}
if (!ASConnection.isErrorReply(json)) {
if (recursive) {
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index a519e97..e4e9d70 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -42,8 +42,10 @@ public class UploadAndDeployTest {
static final String TEST_WAR = "test.war";
private static final String UPLOAD_FILE = "test-simple.war";
+ private static final String DC_HOST = "localhost";
+ private static final int DC_HTTP_PORT = 9990;
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L, enabled = true)
public void testUploadIndividualSteps() throws Exception {
String bytes_value = prepare();
@@ -51,7 +53,7 @@ public class UploadAndDeployTest {
System.out.println("sha: " + bytes_value);
System.out.println();
- ASConnection connection = new ASConnection("localhost",9990);
+ ASConnection connection = new ASConnection(DC_HOST, DC_HTTP_PORT);
List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
@@ -60,7 +62,7 @@ public class UploadAndDeployTest {
op.addAdditionalProperty("name", TEST_WAR); // this needs to be separate per upload
op.addAdditionalProperty("runtime-name", TEST_WAR);
System.out.flush();
- JsonNode ret = connection.execute(op);
+ JsonNode ret = connection.executeRaw(op);
System.out.println("Add to /deploy done " + ret);
System.out.flush();
@@ -73,7 +75,7 @@ public class UploadAndDeployTest {
op.addAdditionalProperty("runtime-name", TEST_WAR);
Operation deploy = new Operation("add",serverGroupAddress,"enabled","true");
System.out.flush();
- ret = connection.execute(deploy);
+ ret = connection.executeRaw(deploy);
System.out.println("Add to server group done: " + ret);
System.out.flush();
@@ -84,7 +86,7 @@ public class UploadAndDeployTest {
// Now tear down stuff again
Operation undeploy = new Operation("remove",serverGroupAddress);
- ret = connection.execute(undeploy);
+ ret = connection.executeRaw(undeploy);
assert ret.has("outcome") : "Ret not valied " + ret.toString();
assert ret.get("outcome").getTextValue().equals("success") : "remove from sg was no success " + ret.getTextValue();
@@ -93,7 +95,7 @@ public class UploadAndDeployTest {
// remove from domain
Operation remove = new Operation("remove",deploymentsAddress);
- ret = connection.execute(remove);
+ ret = connection.executeRaw(remove);
assert ret.has("outcome") : "Ret not valied " + ret.toString();
assert ret.get("outcome").getTextValue().equals("success") : "remove from domain was no success " + ret.getTextValue();
@@ -102,7 +104,7 @@ public class UploadAndDeployTest {
}
- @Test(timeOut = 60*1000L)
+ @Test(timeOut = 60*1000L, enabled = true)
public void testUploadComposite() throws Exception {
String bytes_value = prepare();
@@ -129,8 +131,8 @@ public class UploadAndDeployTest {
cop.addStep(step2);
- ASConnection connection = new ASConnection("localhost",9990);
- JsonNode ret = connection.execute(cop);
+ ASConnection connection = new ASConnection(DC_HOST, DC_HTTP_PORT);
+ JsonNode ret = connection.executeRaw(cop);
System.out.println(ret);
System.out.flush();
@@ -139,7 +141,7 @@ public class UploadAndDeployTest {
cop = new CompositeOperation();
cop.addStep(step3);
cop.addStep(step4);
- ret = connection.execute(cop);
+ ret = connection.executeRaw(cop);
System.out.println(ret);
System.out.flush();
@@ -148,8 +150,8 @@ public class UploadAndDeployTest {
}
private String prepare() throws IOException {
- ASUploadConnection conn = new ASUploadConnection();
- OutputStream os = conn.getOutputStream("test1.war");
+ ASUploadConnection conn = new ASUploadConnection(DC_HOST, DC_HTTP_PORT);
+ OutputStream os = conn.getOutputStream("test.war");
commit 66fcac2419b39494c40b2cd5a8901e06beaf502f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 13 17:25:39 2011 +0200
If no socket binding group is defined in host.xml, reach out to the domain controller and get it from there.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
index 2fa711c..264716e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
@@ -37,6 +37,10 @@ import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ProcessScanResult;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.system.ProcessInfo;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.ReadResource;
/**
* Discovery class for managed AS 7 instances.
@@ -79,10 +83,19 @@ public class ManagedASDiscovery extends AbstractBaseDiscovery
config.put(new PropertySimple("group",serverInfo.group));
config.put(new PropertySimple("port",managementHostPort.port));
config.put(new PropertySimple("hostname",managementHostPort.host));
- if (serverInfo.bindingGroup!=null)
+ if (serverInfo.bindingGroup!=null) {
config.put(new PropertySimple("socket-binding-group",serverInfo.bindingGroup));
- else
- config.put(new PropertySimple("socket-binding-group", "standard-sockets")); // TODO remove when AS has no more "undefined"
+ config.put(new PropertySimple("socket-binding-port-offset",serverInfo.portOffset));
+ }
+ else {
+ HostPort dcHP = getDomainControllerFromHostXml();
+ if (dcHP.port == 9999)
+ dcHP.port = 9990; // TODO Hack until JBAS-9306 is solved
+
+ ServerInfo dcInfo = getBindingsFromDC(dcHP, serverInfo.group);
+ config.put(new PropertySimple("socket-binding-group", dcInfo.bindingGroup));
+ config.put(new PropertySimple("socket-binding-port-offset",dcInfo.portOffset));
+ }
config.put(new PropertySimple("socket-binding-port-offset",serverInfo.portOffset));
@@ -109,6 +122,25 @@ public class ManagedASDiscovery extends AbstractBaseDiscovery
return discoveredResources;
}
+ private ServerInfo getBindingsFromDC(HostPort domainController, String serverGroup) {
+ ASConnection dcConnection = new ASConnection(domainController.host,domainController.port);
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
+ address.add(new PROPERTY_VALUE("server-group",serverGroup));
+ Operation op = new ReadResource(address);
+ ComplexResult res = (ComplexResult) dcConnection.execute2(op,true);
+ if (res.isSuccess()) {
+ if (res.getResult().containsKey("socket-binding-group")) {
+ String sbg = (String) res.getResult().get("socket-binding-group");
+
+ ServerInfo serverInfo = new ServerInfo();
+ serverInfo.bindingGroup = sbg;
+ return serverInfo;
+ }
+ }
+
+ return new ServerInfo();
+ }
+
/**
* Loop through the Process scans for ManagedAS and if found extract the logfile path.
* @param scans process scan results
commit f22bc3f1472bca5c05bab29319c02998048d0bcb
Merge: 7660aec e9639a9
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 13 13:22:16 2011 +0200
Merge branch 'master' into as7plugin
commit 7660aec86b71f0c90945bfacf8f9831af4de11dd
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 13 13:18:32 2011 +0200
BZ 693700 - prevent NPE for empty <c:list-property/>
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 8b9868a..fd2decc 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
@@ -450,15 +450,23 @@ public class ConfigurationMetadataManagerBean implements ConfigurationMetadataMa
* the member prop def for the list. If the member prop def is a nested structure the whole thing
* is replaced from the top.
*
- * @param exList the existing prop def list
+ * @param exList the existing prop def list
* @param newList the new prop def list
*/
private void replaceListProperty(PropertyDefinitionList exList, PropertyDefinitionList newList) {
PropertyDefinition doomedMemberDef = null;
+ if (newList.getMemberDefinition()==null) {
+ log.error("\n\n!! Member definition for new list property [" + newList.getName() + "] is null - check and fix the plugin descriptor\n");
+ return;
+ }
+
+ // We did not have a member definition before (which is wrong )
+ // we need to add it now
// only remove the existing member if it is a different entity
- if (exList.getMemberDefinition().getId() != newList.getMemberDefinition().getId()) {
- doomedMemberDef = exList.getMemberDefinition();
+ PropertyDefinition exListMemberDefinition = exList.getMemberDefinition();
+ if (exListMemberDefinition !=null && exListMemberDefinition.getId() != newList.getMemberDefinition().getId()) {
+ doomedMemberDef = exListMemberDefinition;
}
exList.setMemberDefinition(newList.getMemberDefinition());
commit 71fef20671e86e28c40c4ac5cf923d5a32971bcb
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 13 13:10:13 2011 +0200
Improve handling and detection of Domain and managed servers.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index cdf7edb..d58f0c9 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -226,7 +226,7 @@ public class ASConnection {
} catch (IOException e) {
- e.printStackTrace(); // TODO: Customise this generated block
+ log.error("Failed to get data: " + e.getMessage() );
}
return null;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
new file mode 100644
index 0000000..7a648c9
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
@@ -0,0 +1,230 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.system.ProcessInfo;
+
+/**
+ * Abstract base class for some discovery related functionality - especially
+ * in the area of processes and host.xml
+ * @author Heiko W. Rupp
+ */
+public abstract class AbstractBaseDiscovery<T extends ResourceComponent> implements ResourceDiscoveryComponent<T> {
+ static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
+ private static final String DJBOSS_SERVER_HOME_DIR = "-Djboss.home.dir";
+ static final int DEFAULT_MGMT_PORT = 9990;
+ protected Document hostXml;
+ protected final Log log = LogFactory.getLog(this.getClass());
+
+// private final Log log = LogFactory.getLog(AbstractBaseDiscovery.class);
+
+ protected void readHostXml(ProcessInfo processInfo) {
+ String hostXmlFile = getHostXmlFileLocation(processInfo);
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ try {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ InputStream is = new FileInputStream(hostXmlFile);
+ hostXml = builder.parse(is);
+ is.close();
+ } catch (Exception e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ }
+ }
+
+ /**
+ * Get the location of the host definition file (host.xml in domain mode, standalone.xml
+ * in standalone mode.
+ *
+ * @param processInfo ProcessInfo structure containing the ENV variables
+ * @return The path to the definition file.
+ */
+ private String getHostXmlFileLocation(ProcessInfo processInfo) {
+
+ String home = getHomeDirFromCommandLine(processInfo.getCommandLine());
+ StringBuilder builder = new StringBuilder(home);
+ builder.append("/domain");
+ builder.append("/configuration");
+ builder.append("/host.xml");
+ return builder.toString();
+
+ }
+
+ String getHomeDirFromCommandLine(String[] commandLine) {
+ for (String line: commandLine) {
+ if (line.startsWith(DJBOSS_SERVER_HOME_DIR))
+ return line.substring(DJBOSS_SERVER_HOME_DIR.length()+1);
+ }
+ return "";
+ }
+
+ String getLogFileFromCommandLine(String[] commandLine) {
+
+ for (String line: commandLine) {
+ if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
+ return line.substring(DORG_JBOSS_BOOT_LOG_FILE.length());
+ }
+ return "";
+ }
+
+ protected HostPort getManagementPortFromHostXml() {
+ Element host = hostXml.getDocumentElement();
+ NodeList interfaceParent = host.getElementsByTagName("management-interfaces");
+ if (interfaceParent ==null || interfaceParent.getLength()==0) {
+ log.warn("No <management-interfaces> found in host.xml");
+ return new HostPort();
+ }
+ NodeList mgmtInterfaces = interfaceParent.item(0).getChildNodes();
+ if (mgmtInterfaces==null || mgmtInterfaces.getLength()==0) {
+ log.warn("No <*-interface> found in host.xml");
+ return new HostPort();
+ }
+ for (int i = 0 ; i < mgmtInterfaces.getLength(); i++) {
+ if (!(mgmtInterfaces.item(i) instanceof Element))
+ continue;
+
+ Element mgmtInterface = (Element) mgmtInterfaces.item(i);
+ if (mgmtInterface.getNodeName().equals("http-interface")) {
+ String tmp = mgmtInterface.getAttribute("port");
+ int port = Integer.valueOf(tmp);
+ HostPort hp = new HostPort();
+ hp.isLocal=true;
+ hp.port = port;
+
+ String nIf = mgmtInterface.getAttribute("interface");
+ String hostName = getInterface(nIf);
+ hp.host = hostName;
+ return hp;
+ }
+ }
+ return new HostPort();
+ }
+
+ private String getInterface(String nIf) {
+ Element host = hostXml.getDocumentElement();
+ NodeList interfaceParent = host.getElementsByTagName("interfaces");
+ if (interfaceParent ==null || interfaceParent.getLength()==0) {
+ log.warn("No <interfaces> found in host.xml");
+ return null;
+ }
+ NodeList mgmtInterfaces = interfaceParent.item(0).getChildNodes();
+ if (mgmtInterfaces==null || mgmtInterfaces.getLength()==0) {
+ log.warn("No <*-interface> found in host.xml");
+ return null;
+ }
+ for (int i = 0 ; i < mgmtInterfaces.getLength(); i++) {
+ if (!(mgmtInterfaces.item(i) instanceof Element))
+ continue;
+ Element mgmtInterface = (Element) mgmtInterfaces.item(i);
+ if (mgmtInterface.getNodeName().equals("interface")) {
+ String name = mgmtInterface.getAttribute("name");
+ if (!name.equals(nIf))
+ continue;
+
+ NodeList nl = mgmtInterface.getChildNodes();
+ if (nl!=null) {
+ for (int j = 0 ; j < nl.getLength(); j++) {
+ if (!(nl.item(j) instanceof Element))
+ continue;
+
+ String nodeName = nl.item(j).getNodeName();
+ if (nodeName.equals("any-ipv4-address"))
+ return "0.0.0.0";
+
+ String x = ((Element) nl.item(j)).getAttribute("value");
+ return x;
+
+ // TODO check for <any> and so on
+ }
+ }
+ }
+
+ }
+ return null; // TODO: Customise this generated block
+ }
+
+ protected String findHostName() {
+ String hostName = hostXml.getDocumentElement().getAttribute("name");
+ return hostName;
+ }
+
+ protected HostPort getDomainControllerFromHostXml() {
+
+ Element host = hostXml.getDocumentElement();
+ NodeList dcParent = host.getElementsByTagName("domain-controller");
+ if (dcParent==null || dcParent.getLength()==0)
+ return new HostPort(false);
+ NodeList interfs = dcParent.item(0).getChildNodes();
+ for (int i = 0; i < interfs.getLength(); i++) {
+ if (!(interfs.item(i)instanceof Element))
+ continue;
+
+ Element interf = (Element) interfs.item(i);
+ if (interf.getNodeName().equals("local"))
+ return new HostPort();
+
+ // not local, so get the remote
+ HostPort hp = new HostPort(false);
+ hp.host = interf.getAttribute("host");
+ hp.port = Integer.parseInt(interf.getAttribute("port"));
+ return hp;
+ }
+
+ return new HostPort(false);
+ }
+
+ protected static class HostPort {
+ String host;
+ int port;
+ boolean isLocal = true;
+
+ public HostPort() {
+ host = "localhost";
+ port = DEFAULT_MGMT_PORT;
+ isLocal = true;
+ }
+
+ public HostPort(boolean local) {
+ this();
+ isLocal = local;
+ }
+
+ @Override
+ public String toString() {
+ return "HostPort{" +
+ "host='" + host + '\'' +
+ ", port=" + port +
+ ", isLocal=" + isLocal +
+ '}';
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 43509b8..26e2b4a 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -101,7 +101,6 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
-// Object o = connection.getLevelData("", false); // BASE entries
myServerName = context.getResourceKey().substring(context.getResourceKey().lastIndexOf("/")+1);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
index 07c1522..667b3ee 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
@@ -18,29 +18,28 @@
*/
package org.rhq.modules.plugins.jbossas7;
-import java.util.Collections;
import java.util.HashSet;
-import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ProcessScanResult;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.core.system.ProcessInfo;
/**
- * Discover the domain
+ * Discover the domain. This is done by scanning for host controllers.
+ * If they are also DC, the domain-controller element points to local.
*
* @author Heiko W. Rupp
*/
@SuppressWarnings("unused")
-public class DomainDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+public class DomainDiscovery extends AbstractBaseDiscovery<BaseComponent> {
private final Log log = LogFactory.getLog(this.getClass());
@@ -49,50 +48,45 @@ public class DomainDiscovery implements ResourceDiscoveryComponent<BaseComponent
Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
- mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
- // TODO get next from some host.xml file
- String host = "localhost";
- String portString = "9990";
- int port = Integer.parseInt(portString);
- ASConnection connection = new ASConnection(host,port);
+ List<ProcessScanResult> scans = context.getAutoDiscoveredProcesses();
+ for (ProcessScanResult psr : scans) {
- Configuration config = context.getDefaultPluginConfiguration();
+ // get the HostController, to find host.xml
+ String psName = psr.getProcessScan().getName();
+ if (!psName.equals("HostController"))
+ continue;
+ // Now we have the host controller, lets get the host.xml file
+ // and obtain the domain controller info from there
+ ProcessInfo processInfo = psr.getProcessInfo();
+ readHostXml(processInfo);
+ HostPort dcHp = getDomainControllerFromHostXml();
- // A domain has a server group so check for it.
- boolean found = false;
- JsonNode json = connection.getLevelData(null,null);
- if (!ASConnection.isErrorReply(json)) {
-
- Iterator<String> fields = json.getFieldNames();
- while (fields.hasNext()) {
- String field = fields.next();
- if (field.equals("server-group"))
- found=true;
-
- }
-
- if (found) {
-
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- "Domain", // Key
- "Domain", // Name
- null, // Version
- context.getResourceType().getDescription(), // Description
- config,
- null);
- details.add(detail);
+ if (!dcHp.isLocal) {
+ log.info("Domain controller is not local, but at " + dcHp);
+ continue;
}
- return details;
+ // Ok, this is a domain controller, so we can return a Domain resource.
+
+ // Get the management port and save for later use
+ HostPort managementHostPort = getManagementPortFromHostXml();
+ Configuration config = context.getDefaultPluginConfiguration();
+ config.put(new PropertySimple("port",managementHostPort.port));
+ config.put(new PropertySimple("hostname",managementHostPort.host));
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ "Domain", // Key
+ "Domain", // Name
+ null, // Version
+ context.getResourceType().getDescription(), // Description
+ config,
+ null);
+ details.add(detail);
}
-
- return Collections.emptySet();
+ return details;
}
-
-}
+}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
index 86e3b99..2fa711c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
@@ -19,20 +19,12 @@
package org.rhq.modules.plugins.jbossas7;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -43,7 +35,6 @@ import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ProcessScanResult;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.system.ProcessInfo;
@@ -52,18 +43,10 @@ import org.rhq.core.system.ProcessInfo;
*
* @author Heiko W. Rupp
*/
-public class ManagedASDiscovery implements ResourceDiscoveryComponent
+public class ManagedASDiscovery extends AbstractBaseDiscovery
{
- static final String DJBOSS_SERVER_BASE_DIR = "-Djboss.server.base.dir=";
- static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
- static final String DLOGGING_CONFIGURATION = "-Dlogging.configuration=";
- static final int DEFAULT_MGMT_PORT = 9990;
- private final Log log = LogFactory.getLog(this.getClass());
- private Document hostXml;
- private static final String DJBOSS_SERVER_HOME_DIR = "-Djboss.home.dir";
-
/**
* Run the auto-discovery
*/
@@ -85,7 +68,7 @@ public class ManagedASDiscovery implements ResourceDiscoveryComponent
ProcessInfo processInfo = psr.getProcessInfo();
readHostXml(processInfo);
String hostName = findHostName();
- int port = getManagementPortFromHostXml();
+ HostPort managementHostPort = getManagementPortFromHostXml();
List<ServerInfo> serverNames = getServersFromHostXml();
@@ -94,7 +77,15 @@ public class ManagedASDiscovery implements ResourceDiscoveryComponent
Configuration config = discoveryContext.getDefaultPluginConfiguration();
config.put(new PropertySimple("domainHost",hostName));
config.put(new PropertySimple("group",serverInfo.group));
- config.put(new PropertySimple("port",port));
+ config.put(new PropertySimple("port",managementHostPort.port));
+ config.put(new PropertySimple("hostname",managementHostPort.host));
+ if (serverInfo.bindingGroup!=null)
+ config.put(new PropertySimple("socket-binding-group",serverInfo.bindingGroup));
+ else
+ config.put(new PropertySimple("socket-binding-group", "standard-sockets")); // TODO remove when AS has no more "undefined"
+ config.put(new PropertySimple("socket-binding-port-offset",serverInfo.portOffset));
+
+
// TODO this fails for the downed servers.
// get from the domain or other place as soon as the domain provides it.
@@ -140,32 +131,6 @@ public class ManagedASDiscovery implements ResourceDiscoveryComponent
}
}
- private int getManagementPortFromHostXml() {
- Element host = hostXml.getDocumentElement();
- NodeList interfaceParent = host.getElementsByTagName("management-interfaces");
- if (interfaceParent ==null || interfaceParent.getLength()==0) {
- log.warn("No <management-interfaces> found in host.xml");
- return DEFAULT_MGMT_PORT;
- }
- NodeList mgmtInterfaces = interfaceParent.item(0).getChildNodes();
- if (mgmtInterfaces==null || mgmtInterfaces.getLength()==0) {
- log.warn("No <*-interface> found in host.xml");
- return DEFAULT_MGMT_PORT;
- }
- for (int i = 0 ; i < mgmtInterfaces.getLength(); i++) {
- if (!(mgmtInterfaces.item(i) instanceof Element))
- continue;
-
- Element mgmtInterface = (Element) mgmtInterfaces.item(i);
- if (mgmtInterface.getNodeName().equals("http-interface")) {
- String tmp = mgmtInterface.getAttribute("port");
- int port = Integer.valueOf(tmp);
- return port;
- }
- }
- return DEFAULT_MGMT_PORT;
- }
-
private List<ServerInfo> getServersFromHostXml() {
Element host = hostXml.getDocumentElement();
@@ -193,70 +158,30 @@ public class ManagedASDiscovery implements ResourceDiscoveryComponent
autoStart = "false";
info.autoStart = Boolean.getBoolean(autoStart);
- result.add(info);
- }
-
- return result;
- }
+ // Look for <socket-binding-group ref="standard-sockets" port-offset="250"/>
+ NodeList sbgs = server.getChildNodes();
+ if (sbgs!=null) {
+ for (int j = 0 ; j < sbgs.getLength(); j++) {
+ if (!(sbgs.item(j) instanceof Element))
+ continue;
+ Element sbg = (Element) sbgs.item(j);
+ if (!sbg.getNodeName().equals("socket-binding-group"))
+ continue;
- private String findHostName() {
- String hostName = hostXml.getDocumentElement().getAttribute("name");
- return hostName;
- }
+ info.bindingGroup = sbg.getAttribute("ref");
+ String portOffset = sbg.getAttribute("port-offset");
+ if (portOffset!=null && !portOffset.isEmpty())
+ info.portOffset = Integer.parseInt(portOffset);
- private void readHostXml(ProcessInfo processInfo) {
- String hostXmlFile = getHostXmlFileLocation(processInfo);
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- try {
- DocumentBuilder builder = factory.newDocumentBuilder();
- InputStream is = new FileInputStream(hostXmlFile);
- hostXml = builder.parse(is);
- is.close();
- } catch (Exception e) {
- e.printStackTrace(); // TODO: Customise this generated block
+ }
+ }
+ result.add(info);
}
- }
-
- /**
- * Get the location of the host definition file (host.xml in domain mode, standalone.xml
- * in standalone mode.
- *
- * @param processInfo ProcessInfo structure containing the ENV variables
- * @return The path to the definition file.
- */
- private String getHostXmlFileLocation(ProcessInfo processInfo) {
-
- String home = getHomeDirFromCommandLine(processInfo.getCommandLine());
- StringBuilder builder = new StringBuilder(home);
- builder.append("/domain");
- builder.append("/configuration");
- builder.append("/host.xml");
- return builder.toString();
-
- }
-
-
- String getHomeDirFromCommandLine(String[] commandLine) {
- for (String line: commandLine) {
- if (line.startsWith(DJBOSS_SERVER_HOME_DIR))
- return line.substring(DJBOSS_SERVER_HOME_DIR.length()+1);
- }
- return "";
+ return result;
}
-//-Dorg.jboss.boot.log.file=/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/log/server-manager/boot.log
-//-Dlogging.configuration=file:/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/configuration/logging.properties
-
- String getLogFileFromCommandLine(String[] commandLine) {
-
- for (String line: commandLine) {
- if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
- return line.substring(DORG_JBOSS_BOOT_LOG_FILE.length());
- }
- return "";
- }
private void initLogEventSourcesConfigProp(String fileName, Configuration pluginConfiguration) {
@@ -278,12 +203,12 @@ public class ManagedASDiscovery implements ResourceDiscoveryComponent
}
}
- private class ServerInfo {
+ private static class ServerInfo {
String name;
String group;
boolean autoStart;
-
-
+ int portOffset;
+ String bindingGroup;
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 099d1b9..e75507a 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -114,6 +114,15 @@
<subcategory name="Web"/>
</subcategories>
+ <plugin-configuration>
+ <c:simple-property name="hostname" default="localhost" displayName="Management host" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" displayName="Management port" required="true"/>
+ </plugin-configuration>
+
+ <!-- Scan for host controller is intentional -->
+ <process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
+
+
<operation name="server-group:add" displayName="Add ServerGroup" description="Add a server group to the Domain.">
<parameters>
<c:simple-property name="name" description="Name of Group to add"/>
@@ -251,10 +260,12 @@
class="DomainComponent"
>
<plugin-configuration>
- <c:simple-property name="hostname" default="localhost" required="true"/>
- <c:simple-property name="port" default="9990" type="integer" required="true"/>
+ <c:simple-property name="hostname" default="localhost" displayName="Management host" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" displayName="Management port" required="true"/>
<c:simple-property name="domainHost" readOnly="true" description="Hostname in the domain"/>
<c:simple-property name="group" readOnly="true" displayName="Server Group" description="Server Group this instance belongs to."/>
+ <c:simple-property name="socket-binding-group" readOnly="true" displayName="Socket binding group" description="Socket bindngs to use"/>
+ <c:simple-property name="socket-binding-port-offset" readOnly="true" displayName="Port Offset" type="integer" default="0" description="Offset to the base ports"/>
&logSources;
</plugin-configuration>
commit c629ea66985a1d2f161ba625f8622024e121a23e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 13 13:09:23 2011 +0200
Improve Result handling.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
index 2d011fd..a87a6f8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
@@ -18,11 +18,15 @@
*/
package org.rhq.modules.plugins.jbossas7.json;
+import java.util.List;
+import java.util.Map;
+
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
/**
- * {"outcome" : "success", "result" : "no metrics available", "compensating-operation" : null}
+ * Counterpart of a result JSON object like e.g.:
+ * <pre>{"outcome" : "success", "result" : "no metrics available", "compensating-operation" : null}</pre>
* @author Heiko W. Rupp
*/
public class Result {
@@ -30,7 +34,13 @@ public class Result {
private String outcome;
private Object result;
@JsonProperty("compensating-operation")
- private Object compensatingOperation;
+ private Operation compensatingOperation;
+ @JsonProperty("failure-description")
+ private List<Map<String, String>> failureDescription;
+ @JsonProperty("host-failure-description") // TODO JBAS-9182
+ private List<Map<String, String>> hostFailureDescription;
+ @JsonProperty("domain-failure-description") // TODO JBAS-9182
+ private List<Map<String, String>> domainFailureDescription;
@JsonIgnore
private boolean success = false;
@@ -60,11 +70,35 @@ public class Result {
this.result = result;
}
- public Object getCompensatingOperation() {
+ public Operation getCompensatingOperation() {
return compensatingOperation;
}
- public void setCompensatingOperation(Object compensatingOperation) {
+ public void setCompensatingOperation(Operation compensatingOperation) {
this.compensatingOperation = compensatingOperation;
}
+
+ public List<Map<String, String>> getFailureDescription() {
+ return failureDescription;
+ }
+
+ public void setFailureDescription(List<Map<String, String>> failureDescription) {
+ this.failureDescription = failureDescription;
+ }
+
+ public List<Map<String, String>> getHostFailureDescription() {
+ return hostFailureDescription;
+ }
+
+ public void setHostFailureDescription(List<Map<String, String>> hostFailureDescription) {
+ this.hostFailureDescription = hostFailureDescription;
+ }
+
+ public List<Map<String, String>> getDomainFailureDescription() {
+ return domainFailureDescription;
+ }
+
+ public void setDomainFailureDescription(List<Map<String, String>> domainFailureDescription) {
+ this.domainFailureDescription = domainFailureDescription;
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 64d9d30..34d722c 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -141,6 +141,23 @@ public class OperationJsonTest {
assert result != null;
assert result.getOutcome().equals("success");
assert result.isSuccess();
+ assert result.getFailureDescription() == null;
+ }
+ public void simpleResultWithFailure() throws Exception {
+
+ String resultString = "{\"outcome\" : \"failed\", \"failure-description\" : [{ \"java.util.NoSuchElementException\" : \"No child 'profile' exists\" }]}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ Result result = mapper.readValue(resultString,Result.class);
+
+ assert result != null;
+ assert result.getOutcome().equals("failed");
+ assert !result.isSuccess();
+
+ assert result.getResult() == null;
+ assert result.getCompensatingOperation() == null;
+ assert result.getFailureDescription() != null;
+ assert result.getFailureDescription().size() == 1;
}
public void complexResult1() throws Exception {
@@ -162,4 +179,24 @@ public class OperationJsonTest {
assert aliases.size()==1;
assert aliases.get(0).equals("example.com");
}
+
+ public void compensatingOp() throws Exception {
+
+ String resultString = "{\"outcome\" : \"success\", \"result\" : null, \"compensating-operation\" : {\"operation\" : \"remove\", \"address\" : [{\"deployment\" : \"test.war\"}]}}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ Result result = mapper.readValue(resultString,Result.class);
+
+ assert result != null;
+ assert result.getOutcome().equals("success");
+ assert result.isSuccess();
+
+ assert result.getCompensatingOperation()!=null;
+
+ Operation op = result.getCompensatingOperation();
+
+ assert op.getOperation().equals("remove");
+
+ }
+
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index 11e25ad..a519e97 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -43,6 +43,7 @@ public class UploadAndDeployTest {
static final String TEST_WAR = "test.war";
private static final String UPLOAD_FILE = "test-simple.war";
+ @Test(timeOut = 60*1000L)
public void testUploadIndividualSteps() throws Exception {
String bytes_value = prepare();
@@ -101,6 +102,7 @@ public class UploadAndDeployTest {
}
+ @Test(timeOut = 60*1000L)
public void testUploadComposite() throws Exception {
String bytes_value = prepare();
commit 721b38accafbd2b609810dc2f6ad2665aa0e21cc
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Apr 12 14:10:32 2011 +0200
Transition resource path from /type/value/type.. to type=value pairs.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 9037537..cdf7edb 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -27,8 +27,6 @@ import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -36,9 +34,9 @@ import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.jetbrains.annotations.Nullable;
-import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
-import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.Result;
/**
* Provide connections to the AS and reading / writing date from/to it.
@@ -52,6 +50,7 @@ public class ASConnection {
URL url;
String urlString;
private StringBuilder builder;
+ private ObjectMapper mapper;
public ASConnection(String host, int port) {
this.host = host;
@@ -63,6 +62,8 @@ public class ASConnection {
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e.getMessage());
}
+
+ mapper = new ObjectMapper();
}
@@ -131,11 +132,6 @@ public class ASConnection {
return tree;
}
- JsonNode getAttributeValue(@Nullable String base, @Nullable String attributeName) throws Exception {
- String op = "operation=attribute&name=" + attributeName;
- return getLevelData(base,op);
- }
-
static boolean isErrorReply(JsonNode in) {
if (in == null)
@@ -181,8 +177,6 @@ public class ASConnection {
conn.setRequestMethod("POST");
OutputStream out = conn.getOutputStream();
- ObjectMapper mapper = new ObjectMapper();
-
String result = mapper.writeValueAsString(operation);
System.out.println("Json to send: " + result);
System.out.flush();
@@ -238,6 +232,22 @@ public class ASConnection {
return null;
}
+ public Result execute2(Operation op, boolean isComplex){
+ JsonNode node = execute(op);
+
+ try {
+ Result res;
+ if (isComplex)
+ res = mapper.readValue(node,ComplexResult.class);
+ else
+ res = mapper.readValue(node,Result.class);
+ return res;
+ } catch (IOException e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ return null;
+ }
+ }
+
private URL getBaseUrl(String base, String ops) throws MalformedURLException {
String spec;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 28b94f9..43509b8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -33,6 +33,7 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinition;
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.PropertySimpleType;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
@@ -45,11 +46,12 @@ import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
-import org.rhq.core.pluginapi.operation.OperationFacet;
-import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.ReadAttribute;
+import org.rhq.modules.plugins.jbossas7.json.ReadResource;
+import org.rhq.modules.plugins.jbossas7.json.Result;
import java.util.ArrayList;
import java.util.Collections;
@@ -58,8 +60,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.sun.org.apache.xml.internal.security.utils.Base64;
-
public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet
{
final Log log = LogFactory.getLog(this.getClass());
@@ -129,14 +129,24 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
for (MeasurementScheduleRequest req : metrics) {
- JsonNode obj = connection.getAttributeValue(key, req.getName()); // TODO batching
- String val = obj.getValueAsText();
+ Operation op = new ReadAttribute(pathToAddress(path),req.getName()); // TODO batching
+ //JsonNode obj = connection.execute(op);
+ Result res = connection.execute2(op, false);
+ if (!res.isSuccess())
+ continue;
+
+ String val = (String) res.getResult();
+
if (req.getDataType()== DataType.MEASUREMENT) {
- Double d = Double.parseDouble(val);
- MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
- report.addData(data);
+ try {
+ Double d = Double.parseDouble(val);
+ MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
+ report.addData(data);
+ } catch (NumberFormatException e) {
+ log.warn("Non numeric input for [" + req.getName() + "] : [" + val + "]");
+ }
} else if (req.getDataType()== DataType.TRAIT) {
MeasurementDataTrait data = new MeasurementDataTrait(req,val);
report.addData(data);
@@ -154,15 +164,18 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- String myPath = getResultingPath();
-
+// String myPath = getResultingPath();
- JsonNode json = connection.getLevelData(myPath,true,false);
+ List<PROPERTY_VALUE> address = pathToAddress(path);
+ Operation op = new ReadResource(address); // TOTO set recursive flag?
+ JsonNode json = connection.execute(op);
Configuration ret = new Configuration();
ObjectMapper mapper = new ObjectMapper();
- for (PropertyDefinition propDef: configDef.getNonGroupedProperties()) {
+ Set<Map.Entry<String, PropertyDefinition>> entrySet = configDef.getPropertyDefinitions().entrySet();
+ for (Map.Entry<String,PropertyDefinition> propDefEntry: entrySet) { // TODO all properties
+ PropertyDefinition propDef = propDefEntry.getValue();
JsonNode sub = json.findValue(propDef.getName());
if (propDef instanceof PropertyDefinitionSimple) {
PropertySimple propertySimple;
@@ -285,6 +298,16 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
}
ret.put(propertyList);
+ } // end List of ..
+ else if (propDef instanceof PropertyDefinitionMap) {
+ PropertyDefinitionMap mapDef = (PropertyDefinitionMap) propDef;
+ Map<String,PropertyDefinition> memberDefMap = mapDef.getPropertyDefinitions();
+ for (Map.Entry<String,PropertyDefinition> maEntry : memberDefMap.entrySet()) {
+ JsonNode valueNode = json.findValue(maEntry.getKey());
+ System.out.println(valueNode);
+ PropertySimple p = putProperty(valueNode,maEntry.getValue());
+ ret.put(p);
+ }
}
}
@@ -292,6 +315,31 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return ret;
}
+ PropertySimple putProperty(JsonNode value, PropertyDefinition def) {
+ String name = def.getName();
+ PropertySimpleType type = ((PropertyDefinitionSimple) def).getType();
+ PropertySimple ps;
+ switch (type) {
+ case BOOLEAN:
+ ps = new PropertySimple(name,value.getBooleanValue());
+ break;
+ case FLOAT:
+ case DOUBLE:
+ ps = new PropertySimple(name,value.getDoubleValue());
+ break;
+ case INTEGER:
+ ps = new PropertySimple(name,value.getIntValue());
+ break;
+ case LONG:
+ ps = new PropertySimple(name,value.getLongValue());
+ break;
+ default:
+ ps = new PropertySimple(name,value.getTextValue());
+ }
+
+ return ps;
+ }
+
protected String getResultingPath() {
ResourceComponent parentResourceComponent = context.getParentResourceComponent();
String parentPath =null;
@@ -302,10 +350,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
if (parentPath!=null) {
- if (parentPath.endsWith("/") || path.startsWith("/"))
- myPath = parentPath + path;
- else
- myPath = parentPath + "/" + path;
+ myPath = parentPath + "," + path;
}
else
myPath = path;
@@ -329,21 +374,29 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
- protected List<PROPERTY_VALUE> pathToAddress(String path) {
+ /**
+ * Convert a path in the form key=value,key=value... to a List of properties.
+ * @param path Path to translate
+ * @return List of properties
+ */
+ public List<PROPERTY_VALUE> pathToAddress(String path) {
if (path==null || path.isEmpty())
return Collections.emptyList();
- if (path.endsWith("/"))
- path = path.substring(0,path.length()-1);
-
- if (path.startsWith("/"))
- path = path.substring(1);
-
List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
- String[] components = path.split("/");
- for (int i = 0; i < components.length ; i+=2) {
- PROPERTY_VALUE valuePair = new PROPERTY_VALUE(components[i],components[i+1]);
- result.add(valuePair);
+ String[] components = path.split(",");
+ for (String component : components) {
+ String tmp = component.trim();
+
+ if (tmp.contains("=")) {
+ // strip / from the start of the key if it happens to be there
+ if (tmp.startsWith("/"))
+ tmp = tmp.substring(1);
+
+ String[] pair = tmp.split("=");
+ PROPERTY_VALUE valuePair = new PROPERTY_VALUE(pair[0], pair[1]);
+ result.add(valuePair);
+ }
}
return result;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
index 7608b9c..07c1522 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
@@ -21,7 +21,6 @@ package org.rhq.modules.plugins.jbossas7;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -29,13 +28,11 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.modules.plugins.jbossas7.json.Subsystem;
/**
* Discover the domain
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index ff7048b..b79c9a3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -128,8 +128,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
@Override
public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
- List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
- serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
+ List<PROPERTY_VALUE> serverGroupAddress = pathToAddress(path);
Operation op = new ReadChildrenNames(serverGroupAddress,"deployment"); // TODO read full packages not onyl names
JsonNode node = connection.execute(op);
@@ -194,7 +193,8 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
deploymentsAddress.add(new PROPERTY_VALUE("deployment", fileName));
Operation step1 = new Operation("add",deploymentsAddress);
step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
- step1.addAdditionalProperty("name", fileName);
+ step1.addAdditionalProperty("name", fileName); // TODO set a random name here - or wait on AS to "fix" this
+ step1.addAdditionalProperty("runtime-name", fileName);
List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index b6619b8..f233e3e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -63,26 +63,31 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
Configuration config = context.getDefaultPluginConfiguration();
String cpath = config.getSimpleValue("path", null);
+ if (cpath==null) {
+ log.error("Path plugin config is null for ResourceType [" + context.getResourceType().getName() +"].");
+ return details;
+ }
+
+
boolean recursive = false;
String parentPath = parentComponent.getPath();
String path;
- if (cpath!=null && cpath.endsWith("/*")) {
- path = cpath.substring(0,cpath.length()-2);
+ String childType = null;
+ if (!cpath.contains("=")) { // NO = -> no sub path, but a type
recursive = true;
+ childType = cpath;
+
}
+
+ if (parentPath==null || parentPath.isEmpty())
+ path = "";
else
- path = cpath;
-
- if (parentPath!=null && !parentPath.isEmpty()) {
- if (recursive)
- path = parentPath;
- else if (parentPath.endsWith("/") || path.startsWith("/"))
- path = parentPath + path;
- else
- path = parentPath + "/" + path;
- }
+ path = parentPath;
+
+ if (cpath.contains("="))
+ path += "," + cpath;
System.out.println("total path: [" + path + "]");
@@ -93,19 +98,12 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
else {
List<PROPERTY_VALUE> addr ;
addr = parentComponent.pathToAddress(parentPath);
- String childType = cpath.substring(0, cpath.length() - 2);
- if (childType.startsWith("/"))
- childType = childType.substring(1);
json = connection.execute(new ReadChildrenNames(addr, childType));
}
if (!ASConnection.isErrorReply(json)) {
if (recursive) {
- int i = path.lastIndexOf("/");
- String subPath = path.substring(i+1);
JsonNode subNode = json.findPath("result");
- if (subNode==null || subNode.isNull())
- subNode = json.get(subPath); // TODO clean this up. to get the 'key' in a path from the AS we need to use get()
if (subNode!=null && subNode.isContainerNode()){
@@ -116,24 +114,24 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String val = node.getTextValue();
- String newPath = cpath.replaceAll("\\*",val);
+ String newPath = cpath + "=" + val;
Configuration config2 = context.getDefaultPluginConfiguration();
- PropertySimple pathProp = new PropertySimple("path",newPath);
- config2.put(pathProp);
+
String resKey;
- String childType = cpath.substring(0, cpath.length() - 2);
- if (childType.startsWith("/"))
- childType = childType.substring(1);
- resKey = context.getParentResourceContext().getResourceKey() + "/" +childType + "/" + val;
- String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+ if (path==null||path.isEmpty())
+ resKey = newPath;
+ else
+ resKey = path + "," +childType + "=" + val;
+ PropertySimple pathProp = new PropertySimple("path",resKey);
+ config2.put(pathProp);
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
context.getResourceType(), // DataType
resKey, // Key
- name, // Name
+ val, // Name
null, // Version
"TODO", // subsystem.description, // TODO Description
config2,
@@ -155,7 +153,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String resKey = path;
- String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+ String name = resKey.substring(resKey.lastIndexOf("=") + 1);
Configuration config2 = context.getDefaultPluginConfiguration();
PropertySimple pathProp = new PropertySimple("path",path);
config2.put(pathProp);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ComplexResult.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ComplexResult.java
new file mode 100644
index 0000000..134026d
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ComplexResult.java
@@ -0,0 +1,40 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.Map;
+
+import org.rhq.modules.plugins.jbossas7.json.Result;
+
+/**
+ * A result object with a complex 'result' member
+ * @author Heiko W. Rupp
+ */
+public class ComplexResult extends Result {
+
+ private Map<String,Object> result;
+
+ public Map<String, Object> getResult() {
+ return result;
+ }
+
+ public void setResult(Map<String, Object> result) {
+ this.result = result;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadAttribute.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadAttribute.java
new file mode 100644
index 0000000..773e862
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadAttribute.java
@@ -0,0 +1,32 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.List;
+
+/**
+ * Read Attribute operation
+ * @author Heiko W. Rupp
+ */
+public class ReadAttribute extends Operation {
+
+ public ReadAttribute(List<PROPERTY_VALUE> address, String name) {
+ super("read-attribute",address,"name",name);
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
new file mode 100644
index 0000000..2d011fd
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Result.java
@@ -0,0 +1,70 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * {"outcome" : "success", "result" : "no metrics available", "compensating-operation" : null}
+ * @author Heiko W. Rupp
+ */
+public class Result {
+
+ private String outcome;
+ private Object result;
+ @JsonProperty("compensating-operation")
+ private Object compensatingOperation;
+ @JsonIgnore
+ private boolean success = false;
+
+ public Result() {
+
+ }
+
+ public String getOutcome() {
+ return outcome;
+ }
+
+ public void setOutcome(String outcome) {
+ this.outcome = outcome;
+ if (outcome.equalsIgnoreCase("success"))
+ success = true;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public Object getResult() {
+ return result;
+ }
+
+ public void setResult(Object result) {
+ this.result = result;
+ }
+
+ public Object getCompensatingOperation() {
+ return compensatingOperation;
+ }
+
+ public void setCompensatingOperation(Object compensatingOperation) {
+ this.compensatingOperation = compensatingOperation;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 435f58f..099d1b9 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -108,6 +108,12 @@
class="DomainComponent"
description="An AS7 management profile">
+ <subcategories>
+ <subcategory name="Integration" />
+ <subcategory name="Core"/>
+ <subcategory name="Web"/>
+ </subcategories>
+
<operation name="server-group:add" displayName="Add ServerGroup" description="Add a server group to the Domain.">
<parameters>
<c:simple-property name="name" description="Name of Group to add"/>
@@ -126,7 +132,7 @@
class="BaseComponent">
<plugin-configuration>
- <c:simple-property name="path" default="/profile/*" readOnly="true"/>
+ <c:simple-property name="path" default="profile" readOnly="true"/>
</plugin-configuration>
</server>
<server name="ServerGroup"
@@ -137,7 +143,7 @@
<!-- TODO move operation to createDeletePolicy="create-only" -->
<plugin-configuration>
- <c:simple-property name="path" default="/server-group/*" readOnly="true"/>
+ <c:simple-property name="path" default="server-group" readOnly="true"/>
</plugin-configuration>
@@ -153,7 +159,7 @@
<service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only" creationDataType="content">
<plugin-configuration>
- <c:simple-property name="path" default="/deployment/*" readOnly="true"/>
+ <c:simple-property name="path" default="deployment" readOnly="true"/>
</plugin-configuration>
<content name="deployment" category="deployable" isCreationType="true" description="Deployments on this domain">
@@ -172,7 +178,7 @@
class="DomainComponent"
>
<plugin-configuration>
- <c:simple-property name="path" default="/host/*" readOnly="true"/>
+ <c:simple-property name="path" default="host" readOnly="true"/>
</plugin-configuration>
<operation name="server:add" displayName="Create server" description="Add a new server to this host.">
@@ -307,7 +313,7 @@
</runs-inside>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
+ <c:simple-property name="path" readOnly="true" default="subsystem=messaging"/>
</plugin-configuration>
<operation name="destination:add" displayName="Add destination" description="Add a Queue or Topic">
@@ -363,7 +369,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="queue/*"/>
+ <c:simple-property name="path" readOnly="true" default="queue"/>
</plugin-configuration>
<resource-configuration>
<c:simple-property name="queue-address" required="true"/>
@@ -386,7 +392,7 @@
</runs-inside>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/jms"/>
+ <c:simple-property name="path" readOnly="true" default="subsystem=jms"/>
</plugin-configuration>
<service name="Queue"
@@ -394,7 +400,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="queue/*"/>
+ <c:simple-property name="path" readOnly="true" default="queue"/>
</plugin-configuration>
</service>
<service name="Topic"
@@ -402,7 +408,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="topic/*"/>
+ <c:simple-property name="path" readOnly="true" default="topic"/>
</plugin-configuration>
</service>
<service name="Connection-Factory"
@@ -410,7 +416,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="connection-factory/*"/>
+ <c:simple-property name="path" readOnly="true" default="connection-factory"/>
</plugin-configuration>
</service>
@@ -428,7 +434,7 @@
</runs-inside>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/web"/>
+ <c:simple-property name="path" readOnly="true" default="subsystem=web"/>
</plugin-configuration>
<service name="Connector"
@@ -436,7 +442,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/connector/*"/>
+ <c:simple-property name="path" readOnly="true" default="connector"/>
</plugin-configuration>
@@ -459,7 +465,7 @@
discovery="SubsystemDiscovery"
class="BaseComponent">
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/virtual-server/*"/>
+ <c:simple-property name="path" readOnly="true" default="virtual-server"/>
</plugin-configuration>
<resource-configuration>
@@ -487,7 +493,7 @@
</runs-inside>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/datasources"/>
+ <c:simple-property name="path" readOnly="true" default="subsystem=datasources"/>
</plugin-configuration>
<service name="DataSource"
@@ -497,7 +503,7 @@
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="data-source/*"/>
+ <c:simple-property name="path" readOnly="true" default="data-source"/>
</plugin-configuration>
<resource-configuration>
@@ -523,7 +529,7 @@
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="xa-data-source/*"/>
+ <c:simple-property name="path" readOnly="true" default="xa-data-source"/>
</plugin-configuration>
</service>
@@ -534,7 +540,7 @@
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="jdbc-driver/*"/>
+ <c:simple-property name="path" readOnly="true" default="jdbc-driver"/>
</plugin-configuration>
</service>
@@ -552,7 +558,7 @@
</runs-inside>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/"/>
+ <c:simple-property name="path" readOnly="true" default="interface"/>
</plugin-configuration>
</service>
@@ -567,7 +573,7 @@
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/socket-binding-group/"/>
+ <c:simple-property name="path" readOnly="true" default="socket-binding-group"/>
</plugin-configuration>
<resource-configuration>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 9110fbd..64d9d30 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -26,9 +26,11 @@ import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.testng.annotations.Test;
+import org.rhq.modules.plugins.jbossas7.json.ComplexResult;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.Result;
/**
* @author Heiko W. Rupp
@@ -116,4 +118,48 @@ public class OperationJsonTest {
System.out.println(result);
}
+
+ public void simpleResult() throws Exception {
+
+ String resultString = "{\"outcome\" : \"success\", \"result\" : \"no metrics available\", \"compensating-operation\" : null}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ Result result = mapper.readValue(resultString,Result.class);
+
+ assert result != null;
+ assert result.getOutcome().equals("success");
+ assert result.isSuccess();
+ }
+
+ public void simpleResult2() throws Exception {
+
+ String resultString = "{\"outcome\" : \"success\", \"result\" : \"DISABLED\", \"compensating-operation\" : null}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ Result result = mapper.readValue(resultString,Result.class);
+
+ assert result != null;
+ assert result.getOutcome().equals("success");
+ assert result.isSuccess();
+ }
+
+ public void complexResult1() throws Exception {
+
+ String resultString = " {\"outcome\" : \"success\", \"result\" : {\"alias\" : [\"example.com\"], \"access-log\" : null, \"rewrite\" : null}, \"compensating-operation\" : null}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ ComplexResult result = mapper.readValue(resultString,ComplexResult.class);
+
+ assert result != null;
+ assert result.getOutcome().equals("success");
+ assert result.isSuccess();
+ assert result.getResult().size()==3;
+ String rewrite = (String) result.getResult().get("rewrite");
+ assert rewrite == null;
+
+ List<String> aliases = (List<String>) result.getResult().get("alias");
+ assert aliases != null;
+ assert aliases.size()==1;
+ assert aliases.get(0).equals("example.com");
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java
new file mode 100644
index 0000000..a59b05e
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/PathHandlingTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Test handling of path elements.
+ * A path to a resource consists of pairs type=value that are
+ * separated by commas
+ * @author Heiko W. Rupp
+ */
+@Test
+public class PathHandlingTest {
+
+ public void buildPath1() throws Exception {
+
+ String path = "/subsystem=jms,profile=default,queue=foo";
+
+ BaseComponent bc = new BaseComponent();
+ List<PROPERTY_VALUE> list = bc.pathToAddress(path);
+
+ int found = 0;
+ for (PROPERTY_VALUE p : list) {
+ if (p.getKey().equals("subsystem")) {
+ assert p.getValue().equals("jms");
+ found++;
+ }
+ if (p.getKey().equals("queue")) {
+ found++;
+ assert p.getValue().equals("foo");
+ }
+ }
+ assert found == 2 : "did not find both keys, but " + found;
+ }
+
+ public void buildPath2() throws Exception {
+
+ String path = "/subsystem=jms,profile=default,queue=java:/foo";
+
+ BaseComponent bc = new BaseComponent();
+ List<PROPERTY_VALUE> list = bc.pathToAddress(path);
+
+ assert list.size()==3 : "We don't have 3 components, but " + list.size();
+ for (PROPERTY_VALUE p : list) {
+ if (p.getKey().equals("subsystem"))
+ assert p.getValue().equals("jms");
+ if (p.getKey().equals("queue"))
+ assert p.getValue().equals("java:/foo") : "Queue value is wrong: " + p.getValue();
+
+ }
+ }
+
+ public void buildIncomplete() throws Exception {
+
+ String path = "/subsystem=jms,profile=default,queue=java:/foo,topic";
+
+ BaseComponent bc = new BaseComponent();
+ List<PROPERTY_VALUE> list = bc.pathToAddress(path);
+
+ assert list.size()==3 : "We don't have 3 components, but " + list.size();
+ int found = 0;
+ for (PROPERTY_VALUE p : list) {
+ if (p.getKey().equals("subsystem")) {
+ assert p.getValue().equals("jms");
+ found++;
+ }
+ if (p.getKey().equals("queue")) {
+ assert p.getValue().equals("java:/foo") : "Queue value is wrong: " + p.getValue();
+ found++;
+ }
+ }
+ assert found == 2 : "did not find both keys, but " + found;
+ }
+}
commit 5522a71fd7559bf707094665c020095c3fc6add7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Apr 11 15:01:01 2011 +0200
Better resource detection and keying, Creation of deployments.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 491fb77..9037537 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -137,7 +137,7 @@ public class ASConnection {
}
- boolean isErrorReply(JsonNode in) {
+ static boolean isErrorReply(JsonNode in) {
if (in == null)
return true;
@@ -154,7 +154,7 @@ public class ASConnection {
reasonNode = in.findValue("host-failure-descriptions"); // TODO JBAS-9182
String reason = reasonNode.getTextValue();
- log.info(reason);
+// log.info(reason);
return true;
}
@@ -262,7 +262,7 @@ public class ASConnection {
return url2;
}
- public String getFailureDescription(JsonNode jsonNode) {
+ public static String getFailureDescription(JsonNode jsonNode) {
if (jsonNode==null)
return "getFailureDescription: -input was null-";
JsonNode node = jsonNode.findValue("failure-description");
@@ -273,7 +273,7 @@ public class ASConnection {
return node.getValueAsText();
}
- public String getSuccessDescription(JsonNode jsonNode) {
+ public static String getSuccessDescription(JsonNode jsonNode) {
if (jsonNode==null)
return "No message found";
JsonNode node = jsonNode.findValue("result");
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 644fc24..28b94f9 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -62,7 +62,7 @@ import com.sun.org.apache.xml.internal.security.utils.Base64;
public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet
{
- private final Log log = LogFactory.getLog(this.getClass());
+ final Log log = LogFactory.getLog(this.getClass());
ResourceContext context;
Configuration conf;
@@ -321,9 +321,9 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
NameValuePair nvp = new NameValuePair(entry.getKey(),entry.getValue().getStringValue());
Operation writeAttribute = new Operation("write-attribute",pathToAddress(getResultingPath()),nvp);
JsonNode result= connection.execute(writeAttribute);
- if(connection.isErrorReply(result)) {
+ if(ASConnection.isErrorReply(result)) {
report.setStatus(ConfigurationUpdateStatus.FAILURE);
- report.setErrorMessage(connection.getFailureDescription(result));
+ report.setErrorMessage(ASConnection.getFailureDescription(result));
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index 21005a9..176e6ce 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -49,11 +49,17 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
address.add(new PROPERTY_VALUE("host",host));
address.add(new PROPERTY_VALUE("server-config",myServerName));
Operation getStatus = new Operation("read-attribute",address,"name","status");
- JsonNode result = connection.execute(getStatus);
- if (connection.isErrorReply(result))
+ JsonNode result = null;
+ try {
+ result = connection.execute(getStatus);
+ } catch (Exception e) {
+ log.warn(e.getMessage());
+ return AvailabilityType.DOWN;
+ }
+ if (ASConnection.isErrorReply(result))
return AvailabilityType.DOWN;
- String msg = connection.getSuccessDescription(result);
+ String msg = ASConnection.getSuccessDescription(result);
if (msg.contains("STARTED"))
return AvailabilityType.UP;
else
@@ -126,11 +132,11 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
if (operation!=null) {
JsonNode result = connection.execute(operation);
- if (connection.isErrorReply(result)) {
- operationResult.setErrorMessage(connection.getFailureDescription(result));
+ if (ASConnection.isErrorReply(result)) {
+ operationResult.setErrorMessage(ASConnection.getFailureDescription(result));
}
else {
- operationResult.setSimpleResult(connection.getSuccessDescription(result));
+ operationResult.setSimpleResult(ASConnection.getSuccessDescription(result));
}
}
else {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
index ad09c77..7608b9c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
@@ -69,7 +69,7 @@ public class DomainDiscovery implements ResourceDiscoveryComponent<BaseComponent
// A domain has a server group so check for it.
boolean found = false;
JsonNode json = connection.getLevelData(null,null);
- if (!connection.isErrorReply(json)) {
+ if (!ASConnection.isErrorReply(json)) {
Iterator<String> fields = json.getFieldNames();
while (fields.hasNext()) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
index 021b10c..1fc1e9b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
@@ -64,7 +64,7 @@ public class InterfaceDiscovery implements ResourceDiscoveryComponent<BaseCompon
JsonNode json = connection.getLevelData(null, null);
- if (!connection.isErrorReply(json)) {
+ if (!ASConnection.isErrorReply(json)) {
Domain domain = mapper.readValue(json, new TypeReference<Domain>() {});
for (Map.Entry<String,String> entry: domain.interfaces.entrySet()) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index 0e26e7d..ff7048b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -55,6 +55,8 @@ import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
*/
public class ServerGroupComponent extends DomainComponent implements ContentFacet, CreateChildResourceFacet {
+ private static final String SUCCESS = "success";
+ private static final String OUTCOME = "outcome";
private final Log log = LogFactory.getLog(ServerGroupComponent.class);
@Override
@@ -77,9 +79,9 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
OutputStream out = uploadConnection.getOutputStream(fileName);
contentServices.downloadPackageBits(cctx, details.getKey(), out, false);
JsonNode uploadResult = uploadConnection.finishUpload();
- if (uploadResult.has("outcome")) {
- String outcome = uploadResult.get("outcome").getTextValue();
- if (outcome.equals("success")) { // Upload was successful, so now add the file to the server group
+ if (uploadResult.has(OUTCOME)) {
+ String outcome = uploadResult.get(OUTCOME).getTextValue();
+ if (outcome.equals(SUCCESS)) { // Upload was successful, so now add the file to the server group
JsonNode resultNode = uploadResult.get("result");
String hash = resultNode.get("BYTES_VALUE").getTextValue();
ASConnection connection = getASConnection();
@@ -100,7 +102,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
cop.addStep(step2);
JsonNode result = connection.execute(cop);
- if (connection.isErrorReply(result)) // TODO get failure message into response
+ if (ASConnection.isErrorReply(result)) // TODO get failure message into response
response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE));
else
response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.SUCCESS));
@@ -131,7 +133,7 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
Operation op = new ReadChildrenNames(serverGroupAddress,"deployment"); // TODO read full packages not onyl names
JsonNode node = connection.execute(op);
- if (connection.isErrorReply(node))
+ if (ASConnection.isErrorReply(node))
return null;
JsonNode result = node.get("result");
@@ -168,16 +170,49 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
ContentServices contentServices = cctx.getContentServices();
String resourceTypeName = report.getResourceType().getName();
- ASUploadConnection connection = new ASUploadConnection();
- OutputStream out = connection.getOutputStream(details.getFileName());
+ ASUploadConnection uploadConnection = new ASUploadConnection();
+ OutputStream out = uploadConnection.getOutputStream(details.getFileName());
// contentServices.downloadPackageBits(cctx,details.getKey(),out,false);
contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out);
- JsonNode result = connection.finishUpload();
- System.out.println(result);
+ JsonNode uploadResult = uploadConnection.finishUpload();
+ System.out.println(uploadResult);
+ if (ASConnection.isErrorReply(uploadResult)) {
+ report.setStatus(CreateResourceStatus.FAILURE);
+ report.setErrorMessage(ASConnection.getFailureDescription(uploadResult));
+ return report;
+ }
+
+ String fileName = report.getUserSpecifiedResourceName();
+
+ JsonNode resultNode = uploadResult.get("result");
+ String hash = resultNode.get("BYTES_VALUE").getTextValue();
+ ASConnection connection = getASConnection();
+
+ List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
+ deploymentsAddress.add(new PROPERTY_VALUE("deployment", fileName));
+ Operation step1 = new Operation("add",deploymentsAddress);
+ step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+ step1.addAdditionalProperty("name", fileName);
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", fileName));
+ Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+
+ CompositeOperation cop = new CompositeOperation();
+ cop.addStep(step1);
+ cop.addStep(step2);
- report.setStatus(CreateResourceStatus.SUCCESS) ;
+ JsonNode result = connection.execute(cop);
+ if (ASConnection.isErrorReply(result)) {
+ report.setErrorMessage(ASConnection.getFailureDescription(resultNode));
+ report.setStatus(CreateResourceStatus.FAILURE);
+ }
+ else {
+ report.setStatus(CreateResourceStatus.SUCCESS);
+ }
return report;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
index 4411f8c..89472b8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
@@ -64,7 +64,7 @@ public class SocketBindingGroupDiscovery implements ResourceDiscoveryComponent<B
JsonNode json = connection.getLevelData(null, null);
- if (!connection.isErrorReply(json)) {
+ if (!ASConnection.isErrorReply(json)) {
Domain domain = mapper.readValue(json, new TypeReference<Domain>() {});
for (Map.Entry<String,String> entry: domain.socketBindingGroup.entrySet()) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index e351237..b6619b8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -98,7 +98,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
childType = childType.substring(1);
json = connection.execute(new ReadChildrenNames(addr, childType));
}
- if (!connection.isErrorReply(json)) {
+ if (!ASConnection.isErrorReply(json)) {
if (recursive) {
int i = path.lastIndexOf("/");
String subPath = path.substring(i+1);
@@ -130,13 +130,12 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
-
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
context.getResourceType(), // DataType
resKey, // Key
name, // Name
null, // Version
- "TODO", // subsystem.description, // Description
+ "TODO", // subsystem.description, // TODO Description
config2,
null);
details.add(detail);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
index 8c5b37c..23d10bb 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
@@ -27,7 +27,7 @@ import java.util.List;
public class ReadChildrenNames extends Operation {
/**
- * Reas children names of a given type below a given address
+ * Read children names of a given type below a given address
* @param address Address to look at e.g. /profile/default/subsystem/messaging
* @param childType e.g. queue
*/
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java
new file mode 100644
index 0000000..c2eab45
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadResource.java
@@ -0,0 +1,32 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.List;
+
+/**
+ * Reads data for one AS 7 resource
+ * @author Heiko W. Rupp
+ */
+public class ReadResource extends Operation {
+
+ public ReadResource(List<PROPERTY_VALUE> address) {
+ super("read-resource", address);
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index e3bd676..435f58f 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -150,10 +150,20 @@
<c:simple-property name="jvm"/>
<c:simple-property name="deployment" required="false"/> <!-- TODO change structure. Or put below as resource? -->
</resource-configuration>
- <service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only">
+
+ <service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only" creationDataType="content">
<plugin-configuration>
<c:simple-property name="path" default="/deployment/*" readOnly="true"/>
</plugin-configuration>
+
+ <content name="deployment" category="deployable" isCreationType="true" description="Deployments on this domain">
+ <configuration>
+ <c:group name="deployment" displayName="Deployment Options">
+ <c:simple-property name="runtimeName" required="true"/>
+ </c:group>
+ </configuration>
+ </content>
+
</service>
</server>
<server name="Host"
@@ -489,6 +499,21 @@
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="data-source/*"/>
</plugin-configuration>
+
+ <resource-configuration>
+ <c:map-property name="configuration">
+ <c:simple-property name="connection-url"/>
+ <c:simple-property name="driver-class"/>
+ <c:simple-property name="jndi-name"/>
+ <c:simple-property name="driver"/>
+ <c:simple-property name="pool-name"/>
+ <c:simple-property name="use-java-context" type="boolean"/>
+ <c:simple-property name="enabled" type="boolean"/>
+ <c:simple-property name="user-name"/>
+ <c:simple-property name="password"/>
+ <!-- TODO more when they become available in the AS -->
+ </c:map-property>
+ </resource-configuration>
</service>
<service name="XADataSource"
commit 13237c98e08a967eb8ffe7c397f9bf8e6cf0110f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Apr 11 11:39:40 2011 +0200
Small reformat + cleanup
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 0182077..e351237 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -107,51 +107,48 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
if (subNode==null || subNode.isNull())
subNode = json.get(subPath); // TODO clean this up. to get the 'key' in a path from the AS we need to use get()
-// Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
if (subNode!=null && subNode.isContainerNode()){
- Iterator<JsonNode> iter = subNode.getElements();
-// if (subsystemMap==null) {
-// log.warn("SubsystemMap was null for path [" + path + "] and subPath ["+ subPath + "] and subNode [" + subNode + "]");
-// return Collections.emptySet();
-// }
+ Iterator<JsonNode> iter = subNode.getElements();
while (iter.hasNext()) {
JsonNode node = iter.next();
- String val = node.getTextValue();
+ String val = node.getTextValue();
- String newPath = cpath.replaceAll("\\*",val);
- Configuration config2 = context.getDefaultPluginConfiguration();
- PropertySimple pathProp = new PropertySimple("path",newPath);
- config2.put(pathProp);
+ String newPath = cpath.replaceAll("\\*",val);
+ Configuration config2 = context.getDefaultPluginConfiguration();
+ PropertySimple pathProp = new PropertySimple("path",newPath);
+ config2.put(pathProp);
- String resKey;
- String childType = cpath.substring(0, cpath.length() - 2);
- if (childType.startsWith("/"))
- childType = childType.substring(1);
+ String resKey;
+ String childType = cpath.substring(0, cpath.length() - 2);
+ if (childType.startsWith("/"))
+ childType = childType.substring(1);
- resKey = context.getParentResourceContext().getResourceKey() + "/" +childType + "/" + val;
- String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+ resKey = context.getParentResourceContext().getResourceKey() + "/" +childType + "/" + val;
+ String name = resKey.substring(resKey.lastIndexOf("/") + 1);
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- resKey, // Key
- name, // Name
- null, // Version
- "TODO", // subsystem.description, // Description
- config2,
- null);
- details.add(detail);
- }
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ resKey, // Key
+ name, // Name
+ null, // Version
+ "TODO", // subsystem.description, // Description
+ config2,
+ null);
+ details.add(detail);
+ }
}
else {
- System.out.println("subnode was no array");
- if (subNode==null)
+ if (subNode==null) {
log.error("subNode was null for " + path + " and type " + context.getResourceType().getName());
+ }
+ else if (!subNode.isNull())
+ log.info("subnode was no container");
}
}
commit 9129e2b888dd8131ee9e816bb45afb484c8a52ef
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Apr 11 11:26:57 2011 +0200
Create correct resource key looking at types.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 747aff0..0182077 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -76,11 +76,14 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
path = cpath;
if (parentPath!=null && !parentPath.isEmpty()) {
- if (parentPath.endsWith("/") || path.startsWith("/"))
+ if (recursive)
+ path = parentPath;
+ else if (parentPath.endsWith("/") || path.startsWith("/"))
path = parentPath + path;
else
path = parentPath + "/" + path;
}
+
System.out.println("total path: [" + path + "]");
@@ -105,7 +108,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
subNode = json.get(subPath); // TODO clean this up. to get the 'key' in a path from the AS we need to use get()
// Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
- if (subNode!=null && subNode.isArray()) {
+ if (subNode!=null && subNode.isContainerNode()){
Iterator<JsonNode> iter = subNode.getElements();
// if (subsystemMap==null) {
@@ -123,13 +126,19 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
PropertySimple pathProp = new PropertySimple("path",newPath);
config2.put(pathProp);
- String resKey = context.getParentResourceContext().getResourceKey() + "/" + val;
+ String resKey;
+ String childType = cpath.substring(0, cpath.length() - 2);
+ if (childType.startsWith("/"))
+ childType = childType.substring(1);
+
+ resKey = context.getParentResourceContext().getResourceKey() + "/" +childType + "/" + val;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
context.getResourceType(), // DataType
- path + "/" + val, // Key
+ resKey, // Key
name, // Name
null, // Version
"TODO", // subsystem.description, // Description
commit 1e328a1a6e156566cc5d28be7449915c6fdd5df1
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Apr 8 19:12:53 2011 +0200
Re-activate the undeployment
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
index e477886..11e25ad 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -80,8 +80,7 @@ public class UploadAndDeployTest {
assert ret.get("outcome").getTextValue().equals("success") : "add to sg was no success " + ret.getTextValue();
- // Now teat down stuff again
-/*
+ // Now tear down stuff again
Operation undeploy = new Operation("remove",serverGroupAddress);
ret = connection.execute(undeploy);
@@ -100,10 +99,8 @@ public class UploadAndDeployTest {
System.out.flush();
-*/
}
- @Test(enabled = false)
public void testUploadComposite() throws Exception {
String bytes_value = prepare();
commit afa28b8660dbcd8c0041475a3d41e765f038dd08
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Apr 8 19:06:10 2011 +0200
Upload and deployment of files into server groups.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 0c6d516..491fb77 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -185,6 +185,7 @@ public class ASConnection {
String result = mapper.writeValueAsString(operation);
System.out.println("Json to send: " + result);
+ System.out.flush();
mapper.writeValue(out, operation);
out.flush();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
index f3e9ee0..63b7881 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
@@ -20,9 +20,11 @@ package org.rhq.modules.plugins.jbossas7;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -32,6 +34,7 @@ import com.sun.org.apache.xerces.internal.impl.xpath.regex.REUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
/**
* Connection for uploading of content.
@@ -53,7 +56,7 @@ public class ASUploadConnection {
private final Log log = LogFactory.getLog(ASUploadConnection.class);
BufferedOutputStream os = null;
- BufferedInputStream is = null;
+ InputStream is = null;
private HttpURLConnection connection;
public OutputStream getOutputStream(String fileName) {
@@ -78,12 +81,35 @@ public class ASUploadConnection {
}
public JsonNode finishUpload() {
+ JsonNode tree = null;
try {
os.write(buildPostRequestFooter());
os.flush();
- is = new BufferedInputStream(connection.getInputStream());
- // TODO read from IN
+ int code = connection.getResponseCode();
+ if (code==500)
+ is = connection.getErrorStream();
+ else
+ is = connection.getInputStream();
+
+ if (is != null) {
+ BufferedReader in = new BufferedReader(new InputStreamReader(is));
+ String line;
+ StringBuilder builder = new StringBuilder();
+ while ((line = in.readLine()) != null) {
+ builder.append(line);
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String s = builder.toString();
+ if (s!=null)
+ tree = mapper.readTree(s);
+ else
+ System.out.println("- no result received from InputStream -");
+ }
+ else
+ System.out.println("- no InputStream available -");
} catch (IOException e) {
e.printStackTrace(); // TODO: Customise this generated block
@@ -93,7 +119,7 @@ public class ASUploadConnection {
closeQuietly(os);
}
- return null;
+ return tree;
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
index 9650731..0e26e7d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -20,6 +20,9 @@ package org.rhq.modules.plugins.jbossas7;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -27,7 +30,10 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
+import org.rhq.core.domain.content.PackageDetailsKey;
import org.rhq.core.domain.content.PackageType;
+import org.rhq.core.domain.content.transfer.ContentResponseResult;
+import org.rhq.core.domain.content.transfer.DeployIndividualPackageResponse;
import org.rhq.core.domain.content.transfer.DeployPackageStep;
import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
import org.rhq.core.domain.content.transfer.RemovePackagesResponse;
@@ -38,6 +44,10 @@ import org.rhq.core.pluginapi.content.ContentFacet;
import org.rhq.core.pluginapi.content.ContentServices;
import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
+import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
/**
* Component dealing with server group specific things
@@ -58,17 +68,54 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
ContentContext cctx = context.getContentContext();
- String uploadUrl = "http://localhost:9990/domain-api/add-content";
+ DeployPackagesResponse response = new DeployPackagesResponse();
for (ResourcePackageDetails details : packages) {
+
ASUploadConnection uploadConnection = new ASUploadConnection();
- OutputStream out = uploadConnection.getOutputStream(details.getFileName());
+ String fileName = details.getFileName();
+ OutputStream out = uploadConnection.getOutputStream(fileName);
contentServices.downloadPackageBits(cctx, details.getKey(), out, false);
- JsonNode result = uploadConnection.finishUpload();
+ JsonNode uploadResult = uploadConnection.finishUpload();
+ if (uploadResult.has("outcome")) {
+ String outcome = uploadResult.get("outcome").getTextValue();
+ if (outcome.equals("success")) { // Upload was successful, so now add the file to the server group
+ JsonNode resultNode = uploadResult.get("result");
+ String hash = resultNode.get("BYTES_VALUE").getTextValue();
+ ASConnection connection = getASConnection();
+
+ List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
+ deploymentsAddress.add(new PROPERTY_VALUE("deployment", fileName));
+ Operation step1 = new Operation("add",deploymentsAddress);
+ step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash));
+ step1.addAdditionalProperty("name", fileName);
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", fileName));
+ Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+
+ CompositeOperation cop = new CompositeOperation();
+ cop.addStep(step1);
+ cop.addStep(step2);
+
+ JsonNode result = connection.execute(cop);
+ if (connection.isErrorReply(result)) // TODO get failure message into response
+ response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE));
+ else
+ response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.SUCCESS));
+ }
+ else
+ response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE));
+ }
+ else {
+ response.addPackageResponse(
+ new DeployIndividualPackageResponse(details.getKey(), ContentResponseResult.FAILURE));
+ }
}
- return null; // TODO: Customise this generated block
+ return response;
}
@Override
@@ -78,7 +125,32 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
@Override
public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
- return null; // TODO: Customise this generated block
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group",serverGroupFromKey()));
+
+ Operation op = new ReadChildrenNames(serverGroupAddress,"deployment"); // TODO read full packages not onyl names
+ JsonNode node = connection.execute(op);
+ if (connection.isErrorReply(node))
+ return null;
+
+ JsonNode result = node.get("result");
+ Iterator<JsonNode> iter = result.getElements();
+ Set<ResourcePackageDetails> details = new HashSet<ResourcePackageDetails>();
+ while (iter.hasNext()) {
+ JsonNode jNode = iter.next();
+ String file = jNode.getTextValue();
+ String t;
+ if (file.contains("."))
+ t = file.substring(file.lastIndexOf(".")+1);
+ else
+ t = "-none-";
+
+ ResourcePackageDetails detail = new ResourcePackageDetails(new PackageDetailsKey(file,"1.0",t,"all"));
+ details.add(detail);
+ }
+ return details;
+
}
@Override
@@ -110,4 +182,10 @@ public class ServerGroupComponent extends DomainComponent implements ContentFace
return report;
}
+
+
+ private String serverGroupFromKey() {
+ String key1 = context.getResourceKey();
+ return key1.substring(key1.lastIndexOf("/")+1);
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 9aea097..747aff0 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -68,7 +68,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String parentPath = parentComponent.getPath();
String path;
- if (cpath.endsWith("/*")) {
+ if (cpath!=null && cpath.endsWith("/*")) {
path = cpath.substring(0,cpath.length()-2);
recursive = true;
}
@@ -105,7 +105,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
subNode = json.get(subPath); // TODO clean this up. to get the 'key' in a path from the AS we need to use get()
// Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
- if (subNode.isArray()) {
+ if (subNode!=null && subNode.isArray()) {
Iterator<JsonNode> iter = subNode.getElements();
// if (subsystemMap==null) {
@@ -139,7 +139,10 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
}
}
else {
+
System.out.println("subnode was no array");
+ if (subNode==null)
+ log.error("subNode was null for " + path + " and type " + context.getResourceType().getName());
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index e538c94..a7abfe6 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -67,7 +67,6 @@ public class Operation {
public Operation(String operation, List<PROPERTY_VALUE> address) {
this.operation = operation;
this.address = address;
- additionalProperties = Collections.emptyMap();
}
@@ -76,7 +75,7 @@ public class Operation {
}
@JsonAnySetter
- public void addAdditionalProperty(String key, String value) {
+ public void addAdditionalProperty(String key, Object value) {
if (additionalProperties == null)
additionalProperties = new HashMap<String, Object>();
additionalProperties.put(key,value);
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 258da2c..e3bd676 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -150,7 +150,11 @@
<c:simple-property name="jvm"/>
<c:simple-property name="deployment" required="false"/> <!-- TODO change structure. Or put below as resource? -->
</resource-configuration>
- <service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only"/>
+ <service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only">
+ <plugin-configuration>
+ <c:simple-property name="path" default="/deployment/*" readOnly="true"/>
+ </plugin-configuration>
+ </service>
</server>
<server name="Host"
description="Host involved in this domain"
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 5ba843f..9110fbd 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -84,6 +84,7 @@ public class OperationJsonTest {
props.put("someBool",true);
Operation operation = new Operation("add",address,props);
+ operation.addAdditionalProperty("foo","bar");
ObjectMapper mapper = new ObjectMapper();
@@ -97,8 +98,22 @@ public class OperationJsonTest {
assert op.getOperation().equals(operation.getOperation()) : "Operation is " + op.getOperation();
assert op.getAdditionalProperties().containsKey("someBool") : "Key someBool not found ";
Object someBool = op.getAdditionalProperties().get("someBool");
- assert Boolean.valueOf((String) someBool) : "someBool was not true";
+ assert Boolean.valueOf((Boolean) someBool) : "someBool was not true";
+ }
+
+ public void addPropsTest() throws Exception {
+ List<PROPERTY_VALUE> address=new ArrayList<PROPERTY_VALUE>(2);
+ PROPERTY_VALUE part = new PROPERTY_VALUE("/server-group","newOne");
+ address.add(part);
+
+ Operation operation = new Operation("add",address);
+ operation.addAdditionalProperty("foo","bar");
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String result = mapper.writeValueAsString(operation);
+ System.out.println(result);
}
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
new file mode 100644
index 0000000..e477886
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/UploadAndDeployTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.jackson.JsonNode;
+import org.testng.annotations.Test;
+
+import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Test uploading and deploying to the domain
+ * To use it, domain server must be up and running locally and
+ * the UPLOAD_FILE must point to a valid archive in the resources directory.
+ * @author Heiko W. Rupp
+ */
+@Test
+public class UploadAndDeployTest {
+
+ static final String TEST_WAR = "test.war";
+ private static final String UPLOAD_FILE = "test-simple.war";
+
+ public void testUploadIndividualSteps() throws Exception {
+
+ String bytes_value = prepare();
+
+ System.out.println("sha: " + bytes_value);
+
+ System.out.println();
+ ASConnection connection = new ASConnection("localhost",9990);
+
+ List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
+ deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ Operation op = new Operation("add",deploymentsAddress);
+ op.addAdditionalProperty("hash",new PROPERTY_VALUE("BYTES_VALUE",bytes_value));
+ op.addAdditionalProperty("name", TEST_WAR); // this needs to be separate per upload
+ op.addAdditionalProperty("runtime-name", TEST_WAR);
+ System.out.flush();
+ JsonNode ret = connection.execute(op);
+ System.out.println("Add to /deploy done " + ret);
+ System.out.flush();
+
+ assert ret.toString().contains("success") : ret;
+
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group","main-server-group"));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ op.addAdditionalProperty("runtime-name", TEST_WAR);
+ Operation deploy = new Operation("add",serverGroupAddress,"enabled","true");
+ System.out.flush();
+ ret = connection.execute(deploy);
+ System.out.println("Add to server group done: " + ret);
+ System.out.flush();
+
+ assert ret.has("outcome") : "Ret not valied " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "add to sg was no success " + ret.getTextValue();
+
+
+ // Now teat down stuff again
+/*
+
+ Operation undeploy = new Operation("remove",serverGroupAddress);
+ ret = connection.execute(undeploy);
+
+ assert ret.has("outcome") : "Ret not valied " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "remove from sg was no success " + ret.getTextValue();
+
+
+ // remove from domain
+
+ Operation remove = new Operation("remove",deploymentsAddress);
+ ret = connection.execute(remove);
+
+ assert ret.has("outcome") : "Ret not valied " + ret.toString();
+ assert ret.get("outcome").getTextValue().equals("success") : "remove from domain was no success " + ret.getTextValue();
+
+ System.out.flush();
+
+*/
+ }
+
+ @Test(enabled = false)
+ public void testUploadComposite() throws Exception {
+
+ String bytes_value = prepare();
+
+
+ List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
+ deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ Operation step1 = new Operation("add",deploymentsAddress);
+ step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", bytes_value));
+ step1.addAdditionalProperty("name", TEST_WAR);
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group","main-server-group"));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+
+
+ Operation step3 = new Operation("remove",serverGroupAddress);
+
+ Operation step4 = new Operation("remove",deploymentsAddress);
+
+ CompositeOperation cop = new CompositeOperation();
+ cop.addStep(step1);
+ cop.addStep(step2);
+
+
+ ASConnection connection = new ASConnection("localhost",9990);
+ JsonNode ret = connection.execute(cop);
+ System.out.println(ret);
+ System.out.flush();
+
+ Thread.sleep(1000);
+
+ cop = new CompositeOperation();
+ cop.addStep(step3);
+ cop.addStep(step4);
+ ret = connection.execute(cop);
+
+ System.out.println(ret);
+ System.out.flush();
+
+
+ }
+
+ private String prepare() throws IOException {
+ ASUploadConnection conn = new ASUploadConnection();
+ OutputStream os = conn.getOutputStream("test1.war");
+
+
+
+ InputStream fis = getClass().getClassLoader().getResourceAsStream(UPLOAD_FILE);
+ int b;
+ while ((b = fis.read())!=-1) {
+ os.write(b);
+ }
+ fis.close();
+ JsonNode node = conn.finishUpload();
+ System.out.println(node);
+ assert node.has("outcome") : "No outcome from upload";
+ String outcome = node.get("outcome").getTextValue();
+ assert outcome.equals("success") : "Upload was no success" + outcome;
+
+ JsonNode resultNode = node.get("result");
+ return resultNode.get("BYTES_VALUE").getTextValue();
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/test/resources/test-simple.war b/modules/plugins/jboss-as-7/src/test/resources/test-simple.war
new file mode 100644
index 0000000..bd427b1
Binary files /dev/null and b/modules/plugins/jboss-as-7/src/test/resources/test-simple.war differ
commit 6e262803ae8e328cc397a75d00404ea844f5fb54
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Apr 8 16:34:39 2011 +0200
Add composite operations
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/CompositeOperation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/CompositeOperation.java
new file mode 100644
index 0000000..98cc214
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/CompositeOperation.java
@@ -0,0 +1,64 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * A composite operation contains multiple steps of a
+ * task that requires many individual operations to complete
+ * @author Heiko W. Rupp
+ */
+public class CompositeOperation extends Operation {
+
+
+
+ @JsonProperty
+ List<Operation> steps = new ArrayList<Operation>();
+
+ OperationHeaders operationHeaders;
+
+ public CompositeOperation(List<Operation> steps) {
+ super("composite",new ArrayList<PROPERTY_VALUE>());
+ this.steps = steps;
+ }
+
+ public CompositeOperation() {
+ super("composite",new ArrayList<PROPERTY_VALUE>());
+ }
+
+ public void addStep(Operation step) {
+ steps.add(step);
+ }
+
+ public void setOperationHeaders(OperationHeaders headers) {
+ operationHeaders = headers;
+ }
+
+ private class OperationHeaders {
+ @JsonProperty("in-series")
+ List<PROPERTY_VALUE>inSeries = Collections.emptyList();
+ @JsonProperty("rollback-across-groups")
+ boolean rollbackAcrossGroups;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/CompositeOperationTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/CompositeOperationTest.java
new file mode 100644
index 0000000..dddbe51
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/CompositeOperationTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.testng.annotations.Test;
+
+import org.rhq.modules.plugins.jbossas7.json.CompositeOperation;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Test composite operations
+ * @author Heiko W. Rupp
+ */
+@Test
+public class CompositeOperationTest {
+
+ public void serializationTest() throws Exception {
+
+ List<PROPERTY_VALUE> address=new ArrayList<PROPERTY_VALUE>(3);
+ PROPERTY_VALUE part = new PROPERTY_VALUE("subsystem","web");
+ address.add(part);
+ part = new PROPERTY_VALUE("connector","http");
+ address.add(part);
+ part = new PROPERTY_VALUE("profile","default");
+ address.add(part);
+
+ CompositeOperation op = new CompositeOperation();
+
+ Operation step1 = new Operation("add", address);
+ op.addStep(step1);
+
+ Operation step2 = new Operation("deploy", address);
+ op.addStep(step2);
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String result = mapper.writeValueAsString(op);
+
+ System.out.println(result);
+
+ assert result.contains("http");
+
+ }
+
+ public void serializationTest2() throws Exception {
+
+
+ List<PROPERTY_VALUE> deploymentsAddress = new ArrayList<PROPERTY_VALUE>(1);
+ String TEST_WAR = "test.war";
+ deploymentsAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ Operation step1 = new Operation("add",deploymentsAddress);
+ String bytes_value = "123";
+ step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", bytes_value));
+ step1.addAdditionalProperty("name", TEST_WAR);
+
+ List<PROPERTY_VALUE> serverGroupAddress = new ArrayList<PROPERTY_VALUE>(1);
+ serverGroupAddress.add(new PROPERTY_VALUE("server-group","main-server-group"));
+ serverGroupAddress.add(new PROPERTY_VALUE("deployment", TEST_WAR));
+ Operation step2 = new Operation("add",serverGroupAddress,"enabled","true");
+
+
+ Operation step3 = new Operation("remove",serverGroupAddress);
+
+ Operation step4 = new Operation("remove",deploymentsAddress);
+
+ CompositeOperation cop = new CompositeOperation();
+ cop.addStep(step1);
+ cop.addStep(step2);
+ cop.addStep(step3);
+ cop.addStep(step4);
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String result = mapper.writeValueAsString(cop);
+ System.out.println(result);
+ System.out.flush();
+
+ JsonNode node = mapper.readTree(result);
+
+ assert node.has("operation");
+ assert !node.get("operation").isNull() : "Operations was null, but should not be " + result;
+ assert node.get("operation").getTextValue().equals("composite") : node;
+
+ }
+}
commit 1054ae44f1831fc3c7787bd118d4d5e7c1ad725b
Merge: 7bda199 7b91cb2
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 6 21:52:03 2011 +0200
Merge branch 'master' into as7plugin
commit 7bda199733e460362365e15793cc607b25acff48
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 6 21:49:39 2011 +0200
Improve detection of child resources
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 5dbd0b3..644fc24 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -52,6 +52,7 @@ import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -329,6 +330,9 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
protected List<PROPERTY_VALUE> pathToAddress(String path) {
+ if (path==null || path.isEmpty())
+ return Collections.emptyList();
+
if (path.endsWith("/"))
path = path.substring(0,path.length()-1);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index a06a296..21005a9 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -114,8 +114,11 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
} else if (what.equals("destination")) {
address.addAll(pathToAddress(getPath()));
String newName = parameters.getSimpleValue("name","");
- String type = parameters.getSimpleValue("type","Queue").toLowerCase();
- address.add(new PROPERTY_VALUE(type,newName));
+// String type = parameters.getSimpleValue("type","Queue").toLowerCase();
+// address.add(new PROPERTY_VALUE(type,newName));
+ String queueName = parameters.getSimpleValue("queue-address","");
+ Map<String,Object> props = new HashMap<String, Object>();
+ props.put("queue-address",queueName);
operation = new Operation(op,address);
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 1c498d1..9aea097 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -23,11 +23,13 @@ import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.modules.plugins.jbossas7.json.Subsystem;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
import java.util.Collections;
import java.util.HashSet;
-import java.util.Map;
+import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -35,7 +37,6 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
/**
* Discover subsystems
@@ -83,47 +84,63 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
System.out.println("total path: [" + path + "]");
- JsonNode json = connection.getLevelData(path,recursive, false);
+ JsonNode json ;
+ if (!recursive)
+ json = connection.getLevelData(path,recursive, false);
+ else {
+ List<PROPERTY_VALUE> addr ;
+ addr = parentComponent.pathToAddress(parentPath);
+ String childType = cpath.substring(0, cpath.length() - 2);
+ if (childType.startsWith("/"))
+ childType = childType.substring(1);
+ json = connection.execute(new ReadChildrenNames(addr, childType));
+ }
if (!connection.isErrorReply(json)) {
if (recursive) {
int i = path.lastIndexOf("/");
String subPath = path.substring(i+1);
- JsonNode subNode = json.findPath(subPath);
+ JsonNode subNode = json.findPath("result");
if (subNode==null || subNode.isNull())
subNode = json.get(subPath); // TODO clean this up. to get the 'key' in a path from the AS we need to use get()
- Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
+// Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
+ if (subNode.isArray()) {
- if (subsystemMap==null) {
- log.warn("SubsystemMap was null for path [" + path + "] and subPath ["+ subPath + "] and subNode [" + subNode + "]");
- return Collections.emptySet();
- }
+ Iterator<JsonNode> iter = subNode.getElements();
+// if (subsystemMap==null) {
+// log.warn("SubsystemMap was null for path [" + path + "] and subPath ["+ subPath + "] and subNode [" + subNode + "]");
+// return Collections.emptySet();
+// }
+ while (iter.hasNext()) {
+ JsonNode node = iter.next();
+ String val = node.getTextValue();
- for (Map.Entry<String,Subsystem> entry: subsystemMap.entrySet()) {
- String key = entry.getKey();
- Subsystem subsystem = entry.getValue();
- String newPath = cpath.replaceAll("\\*",key);
+ String newPath = cpath.replaceAll("\\*",val);
Configuration config2 = context.getDefaultPluginConfiguration();
PropertySimple pathProp = new PropertySimple("path",newPath);
config2.put(pathProp);
- String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
+ String resKey = context.getParentResourceContext().getResourceKey() + "/" + val;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
context.getResourceType(), // DataType
- path + "/" + key, // Key
+ path + "/" + val, // Key
name, // Name
null, // Version
- subsystem.description, // Description
+ "TODO", // subsystem.description, // Description
config2,
null);
details.add(detail);
}
+ }
+ else {
+ System.out.println("subnode was no array");
+ }
}
else {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java
index b2c8223..efe389b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java
@@ -59,4 +59,11 @@ public class PROPERTY_VALUE implements Serializable{
this.value = value;
}
+ @Override
+ public String toString() {
+ return "PROPERTY_VALUE{" +
+ "key='" + key + '\'' +
+ ", value='" + value + '\'' +
+ '}';
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
new file mode 100644
index 0000000..8c5b37c
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/ReadChildrenNames.java
@@ -0,0 +1,37 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.List;
+
+/**
+ * Operation that reads children of a given type from an address
+ * @author Heiko W. Rupp
+ */
+public class ReadChildrenNames extends Operation {
+
+ /**
+ * Reas children names of a given type below a given address
+ * @param address Address to look at e.g. /profile/default/subsystem/messaging
+ * @param childType e.g. queue
+ */
+ public ReadChildrenNames(List<PROPERTY_VALUE> address, String childType) {
+ super("read-children-names",address,"child-type",childType);
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 6741bb3..258da2c 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -51,7 +51,7 @@
version="4.0.0-SNAPSHOT"
>
- <depends plugin="JMX" useClasses="true"/>
+<!-- <depends plugin="JMX" useClasses="true"/> -->
<!-- TODO I think we should introduce an abstract AS7 plugin that contains some base functionality and then
@@ -284,6 +284,7 @@
<server name="Messaging"
discovery="SubsystemDiscovery"
class="DomainComponent"
+ description="The underlying HornetQ based messaging subsystem"
singleton="true"
>
<runs-inside>
@@ -298,12 +299,15 @@
<operation name="destination:add" displayName="Add destination" description="Add a Queue or Topic">
<parameters>
<c:simple-property name="name" description="Name of the Destination" required="true"/>
+ <c:simple-property name="queue-address" description="The queue address defines what address is used for routing messages." required="true"/>
<c:simple-property name="type" description="Type of Destination to create" default="Queue">
<c:property-options>
<c:option value="Queue"/>
<c:option value="Topic"/>
</c:property-options>
</c:simple-property>
+ <c:simple-property name="filter" description="The queue message filter definition."/>
+ <c:simple-property name="durable" description="Defines whether the queue is durable." type="boolean" default="false"/>
</parameters>
<results>
<c:simple-property name="operationResult"/>
@@ -329,7 +333,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/acceptor"/>
+ <c:simple-property name="path" readOnly="true" default="acceptor"/>
</plugin-configuration>
</service>
<service name="MessagingConnector"
@@ -337,17 +341,65 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/connector"/>
+ <c:simple-property name="path" readOnly="true" default="connector"/>
</plugin-configuration>
</service>
- <service name="Queue"
+ <service name="HQueue"
discovery="SubsystemDiscovery"
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/queue/*"/>
+ <c:simple-property name="path" readOnly="true" default="queue/*"/>
+ </plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="queue-address" required="true"/>
+ <c:simple-property name="filter" />
+ <c:simple-property name="durable" type="boolean"/>
+ </resource-configuration>
+
+ </service>
+ </server>
+
+ <server name="JMS"
+ discovery="SubsystemDiscovery"
+ class="DomainComponent"
+ description="The JMS messaging subsystem"
+ singleton="true"
+ >
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/jms"/>
+ </plugin-configuration>
+
+ <service name="Queue"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="queue/*"/>
</plugin-configuration>
</service>
+ <service name="Topic"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="topic/*"/>
+ </plugin-configuration>
+ </service>
+ <service name="Connection-Factory"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="connection-factory/*"/>
+ </plugin-configuration>
+ </service>
+
</server>
<server name="JBossWeb"
@@ -377,9 +429,9 @@
<metric property="bytesSent" measurementType="trendsup"/>
<metric property="bytesReceived" measurementType="trendsup"/>
<metric property="processingTime" measurementType="trendsup"/>
- <metric property="errorCount" measurementType="trendsup"/>
+ <metric property="errorCount" measurementType="trendsup" displayType="summary"/>
<metric property="maxTime" />
- <metric property="requestCount" measurementType="trendsup"/>
+ <metric property="requestCount" measurementType="trendsup" displayType="summary"/>
<resource-configuration>
<c:simple-property name="protocol" required="false" description="The web connector protocol."/>
@@ -431,7 +483,7 @@
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/data-source/*"/>
+ <c:simple-property name="path" readOnly="true" default="data-source/*"/>
</plugin-configuration>
</service>
@@ -442,7 +494,7 @@
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/xa-data-source/*"/>
+ <c:simple-property name="path" readOnly="true" default="xa-data-source/*"/>
</plugin-configuration>
</service>
@@ -453,7 +505,7 @@
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/jdbc-driver/*"/>
+ <c:simple-property name="path" readOnly="true" default="jdbc-driver/*"/>
</plugin-configuration>
</service>
commit f2dc89709b73b7506403f04ff36dc894a44232f5
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Apr 6 12:28:18 2011 +0200
Detect Managed AS through hosts.xml , start with deployments.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
new file mode 100644
index 0000000..f3e9ee0
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java
@@ -0,0 +1,144 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import com.sun.org.apache.xerces.internal.impl.xpath.regex.REUtil;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+
+/**
+ * Connection for uploading of content.
+ * Partially taken from https://github.com/jbossas/jboss-as/blob/master/testsuite/smoke/src/test/...
+ *
+ * @author Jonathan Pearlin (of the original code)
+ * @author Heiko W. Rupp
+ */
+public class ASUploadConnection {
+
+ private static final String BOUNDARY = "-----------------------------261773107125236";
+
+ private static final String CRLF = "\r\n";
+
+ private static final String POST_REQUEST_METHOD = "POST";
+
+ private static final String UPLOAD_URL = "http://localhost:9990/domain-api/add-content";
+
+ private final Log log = LogFactory.getLog(ASUploadConnection.class);
+
+ BufferedOutputStream os = null;
+ BufferedInputStream is = null;
+ private HttpURLConnection connection;
+
+ public OutputStream getOutputStream(String fileName) {
+ try {
+ // Create the HTTP connection to the upload URL
+ connection = (HttpURLConnection) new URL(UPLOAD_URL).openConnection();
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+ connection.setRequestMethod(POST_REQUEST_METHOD);
+
+ // Grab the test WAR file and get a stream to its contents to be included in the POST.
+ os = new BufferedOutputStream(connection.getOutputStream());
+ os.write(buildPostRequestHeader(fileName));
+
+ return os;
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public JsonNode finishUpload() {
+ try {
+ os.write(buildPostRequestFooter());
+ os.flush();
+
+ is = new BufferedInputStream(connection.getInputStream());
+ // TODO read from IN
+
+ } catch (IOException e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ }
+ finally {
+ closeQuietly(is);
+ closeQuietly(os);
+ }
+
+ return null;
+ }
+
+
+ private byte[] buildPostRequestHeader(String fileName) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(buildPostRequestHeaderSection("form-data; name=\"test1\"", "", "test1"));
+ builder.append(buildPostRequestHeaderSection("form-data; name=\"test2\"", "", "test2"));
+ builder.append(buildPostRequestHeaderSection("form-data; name=\"file\"; filename=\""+fileName+"\"", "application/octet-stream", ""));
+ return builder.toString().getBytes();
+ }
+
+ private String buildPostRequestHeaderSection(final String contentDisposition, final String contentType, final String content) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(BOUNDARY);
+ builder.append(CRLF);
+ if(contentDisposition != null && contentDisposition.length() > 0) {
+ builder.append(String.format("Content-Disposition: %s", contentDisposition));
+ }
+ builder.append(CRLF);
+ if(contentType != null && contentType.length() > 0) {
+ builder.append(String.format("Content-Type: %s", contentType));
+ }
+ builder.append(CRLF);
+ if(content != null && content.length() > 0) {
+ builder.append(content);
+ }
+ builder.append(CRLF);
+ return builder.toString();
+ }
+
+ private byte[] buildPostRequestFooter() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(CRLF);
+ builder.append(BOUNDARY);
+ builder.append("--");
+ builder.append(CRLF);
+ return builder.toString().getBytes();
+ }
+
+
+ private void closeQuietly(final Closeable closeable) {
+ if(closeable != null) {
+ try {
+ closeable.close();
+ } catch (final IOException e) {}
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
index 5ea4bd7..8597d8f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
@@ -1,3 +1,21 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.modules.plugins.jbossas7;
import java.io.File;
@@ -58,12 +76,9 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
String serverNameFull;
String serverName;
String psName = psr.getProcessScan().getName();
- if (psName.equals("ProcessManager")) {
- serverNameFull = "ProcessManager";
- serverName = "ProcessManager";
- } else if (psName.equals("ASManager")) {
- serverName = "ASManager";
- serverNameFull = "ASManager";
+ if (psName.equals("ProcessController")) {
+ serverNameFull = "ProcessController";
+ serverName = "ProcessController";
} else if (psName.equals("HostController")) {
serverName = "HostController";
serverNameFull = "HostController";
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
new file mode 100644
index 0000000..86e3b99
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASDiscovery.java
@@ -0,0 +1,289 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ProcessScanResult;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.core.system.ProcessInfo;
+
+/**
+ * Discovery class for managed AS 7 instances.
+ *
+ * @author Heiko W. Rupp
+ */
+public class ManagedASDiscovery implements ResourceDiscoveryComponent
+
+{
+
+ static final String DJBOSS_SERVER_BASE_DIR = "-Djboss.server.base.dir=";
+ static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
+ static final String DLOGGING_CONFIGURATION = "-Dlogging.configuration=";
+ static final int DEFAULT_MGMT_PORT = 9990;
+ private final Log log = LogFactory.getLog(this.getClass());
+ private Document hostXml;
+ private static final String DJBOSS_SERVER_HOME_DIR = "-Djboss.home.dir";
+
+ /**
+ * Run the auto-discovery
+ */
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception {
+ Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>();
+
+
+ List<ProcessScanResult> scans = discoveryContext.getAutoDiscoveredProcesses();
+
+ for (ProcessScanResult psr : scans) {
+
+ // get the HostController, as this is an indicator for managed AS
+ String psName = psr.getProcessScan().getName();
+ if (!psName.equals("HostController"))
+ continue;
+
+ // Now we have the host controller, lets get the host.xml file
+ // and obtain the servers from there.
+ ProcessInfo processInfo = psr.getProcessInfo();
+ readHostXml(processInfo);
+ String hostName = findHostName();
+ int port = getManagementPortFromHostXml();
+
+
+ List<ServerInfo> serverNames = getServersFromHostXml();
+ for (ServerInfo serverInfo : serverNames) {
+
+ Configuration config = discoveryContext.getDefaultPluginConfiguration();
+ config.put(new PropertySimple("domainHost",hostName));
+ config.put(new PropertySimple("group",serverInfo.group));
+ config.put(new PropertySimple("port",port));
+
+ // TODO this fails for the downed servers.
+ // get from the domain or other place as soon as the domain provides it.
+ initLogFile(scans, serverInfo.name, config, getHomeDirFromCommandLine(processInfo.getCommandLine()));
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ discoveryContext.getResourceType(), // ResourceType
+ hostName + "/" + serverInfo.name, // key
+ serverInfo.name, // Name
+ null, // TODO real version - get from Domain as soon as it is provided
+ "Managed AS 7 instance", // Description
+ config,
+ null
+ );
+
+ // Add to return values
+ discoveredResources.add(detail);
+ log.info("Discovered new ... " + discoveryContext.getResourceType() + ", " + serverInfo);
+ }
+ }
+ return discoveredResources;
+ }
+
+ /**
+ * Loop through the Process scans for ManagedAS and if found extract the logfile path.
+ * @param scans process scan results
+ * @param name server name to look for
+ * @param config config to put the info in
+ * @param basePath
+ */
+ private void initLogFile(List<ProcessScanResult> scans, String name, Configuration config, String basePath) {
+
+ for (ProcessScanResult psr : scans) {
+ if (!psr.getProcessScan().getName().equals("ManagedAS"))
+ continue;
+
+ String[] commandLine = psr.getProcessInfo().getCommandLine();
+
+ String logFile = basePath + File.separator + getLogFileFromCommandLine(commandLine);
+
+ if (logFile.contains(name))
+ initLogEventSourcesConfigProp(logFile,config);
+ }
+ }
+
+ private int getManagementPortFromHostXml() {
+ Element host = hostXml.getDocumentElement();
+ NodeList interfaceParent = host.getElementsByTagName("management-interfaces");
+ if (interfaceParent ==null || interfaceParent.getLength()==0) {
+ log.warn("No <management-interfaces> found in host.xml");
+ return DEFAULT_MGMT_PORT;
+ }
+ NodeList mgmtInterfaces = interfaceParent.item(0).getChildNodes();
+ if (mgmtInterfaces==null || mgmtInterfaces.getLength()==0) {
+ log.warn("No <*-interface> found in host.xml");
+ return DEFAULT_MGMT_PORT;
+ }
+ for (int i = 0 ; i < mgmtInterfaces.getLength(); i++) {
+ if (!(mgmtInterfaces.item(i) instanceof Element))
+ continue;
+
+ Element mgmtInterface = (Element) mgmtInterfaces.item(i);
+ if (mgmtInterface.getNodeName().equals("http-interface")) {
+ String tmp = mgmtInterface.getAttribute("port");
+ int port = Integer.valueOf(tmp);
+ return port;
+ }
+ }
+ return DEFAULT_MGMT_PORT;
+ }
+
+ private List<ServerInfo> getServersFromHostXml() {
+
+ Element host = hostXml.getDocumentElement();
+ NodeList serversElement = host.getElementsByTagName("servers");
+ if (serversElement ==null || serversElement.getLength()==0) {
+ log.warn("No <servers> found in host.xml");
+ return Collections.emptyList();
+ }
+ NodeList servers = serversElement.item(0).getChildNodes();
+ if (servers==null || servers.getLength()==0) {
+ log.warn("No <server> found in host.xml");
+ return Collections.emptyList();
+ }
+ List<ServerInfo> result = new ArrayList<ServerInfo>();
+ for (int i = 0 ; i < servers.getLength(); i++) {
+ if (!(servers.item(i) instanceof Element))
+ continue;
+
+ ServerInfo info = new ServerInfo();
+ Element server = (Element) servers.item(i);
+ info.name = server.getAttribute("name");
+ info.group = server.getAttribute("group");
+ String autoStart = server.getAttribute("autoStart");
+ if (autoStart==null || autoStart.isEmpty())
+ autoStart = "false";
+ info.autoStart = Boolean.getBoolean(autoStart);
+
+ result.add(info);
+ }
+
+ return result;
+ }
+
+
+ private String findHostName() {
+ String hostName = hostXml.getDocumentElement().getAttribute("name");
+ return hostName;
+ }
+
+ private void readHostXml(ProcessInfo processInfo) {
+ String hostXmlFile = getHostXmlFileLocation(processInfo);
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ try {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ InputStream is = new FileInputStream(hostXmlFile);
+ hostXml = builder.parse(is);
+ is.close();
+ } catch (Exception e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ }
+ }
+
+ /**
+ * Get the location of the host definition file (host.xml in domain mode, standalone.xml
+ * in standalone mode.
+ *
+ * @param processInfo ProcessInfo structure containing the ENV variables
+ * @return The path to the definition file.
+ */
+ private String getHostXmlFileLocation(ProcessInfo processInfo) {
+
+ String home = getHomeDirFromCommandLine(processInfo.getCommandLine());
+ StringBuilder builder = new StringBuilder(home);
+ builder.append("/domain");
+ builder.append("/configuration");
+ builder.append("/host.xml");
+ return builder.toString();
+
+ }
+
+
+
+ String getHomeDirFromCommandLine(String[] commandLine) {
+ for (String line: commandLine) {
+ if (line.startsWith(DJBOSS_SERVER_HOME_DIR))
+ return line.substring(DJBOSS_SERVER_HOME_DIR.length()+1);
+ }
+ return "";
+ }
+
+//-Dorg.jboss.boot.log.file=/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/log/server-manager/boot.log
+//-Dlogging.configuration=file:/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/configuration/logging.properties
+
+ String getLogFileFromCommandLine(String[] commandLine) {
+
+ for (String line: commandLine) {
+ if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
+ return line.substring(DORG_JBOSS_BOOT_LOG_FILE.length());
+ }
+ return "";
+ }
+
+ private void initLogEventSourcesConfigProp(String fileName, Configuration pluginConfiguration) {
+
+ PropertyList logEventSources = pluginConfiguration
+ .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
+
+ if (logEventSources==null)
+ return;
+
+ File serverLogFile = new File(fileName);
+
+ if (serverLogFile.exists() && !serverLogFile.isDirectory()) {
+ PropertyMap serverLogEventSource = new PropertyMap("logEventSource");
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, serverLogFile));
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
+ logEventSources.add(serverLogEventSource);
+ }
+ }
+
+ private class ServerInfo {
+ String name;
+ String group;
+ boolean autoStart;
+
+
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
new file mode 100644
index 0000000..9650731
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java
@@ -0,0 +1,113 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+
+import org.rhq.core.domain.content.PackageType;
+import org.rhq.core.domain.content.transfer.DeployPackageStep;
+import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
+import org.rhq.core.domain.content.transfer.RemovePackagesResponse;
+import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
+import org.rhq.core.domain.resource.CreateResourceStatus;
+import org.rhq.core.pluginapi.content.ContentContext;
+import org.rhq.core.pluginapi.content.ContentFacet;
+import org.rhq.core.pluginapi.content.ContentServices;
+import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
+import org.rhq.core.pluginapi.inventory.CreateResourceReport;
+
+/**
+ * Component dealing with server group specific things
+ * @author Heiko W. Rupp
+ */
+public class ServerGroupComponent extends DomainComponent implements ContentFacet, CreateChildResourceFacet {
+
+ private final Log log = LogFactory.getLog(ServerGroupComponent.class);
+
+ @Override
+ public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) {
+ return null; // TODO: Customise this generated block
+ }
+
+ @Override
+ public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages,
+ ContentServices contentServices) {
+
+ ContentContext cctx = context.getContentContext();
+
+ String uploadUrl = "http://localhost:9990/domain-api/add-content";
+
+ for (ResourcePackageDetails details : packages) {
+ ASUploadConnection uploadConnection = new ASUploadConnection();
+ OutputStream out = uploadConnection.getOutputStream(details.getFileName());
+ contentServices.downloadPackageBits(cctx, details.getKey(), out, false);
+ JsonNode result = uploadConnection.finishUpload();
+ }
+
+
+ return null; // TODO: Customise this generated block
+ }
+
+ @Override
+ public RemovePackagesResponse removePackages(Set<ResourcePackageDetails> packages) {
+ return null; // TODO: Customise this generated block
+ }
+
+ @Override
+ public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
+ return null; // TODO: Customise this generated block
+ }
+
+ @Override
+ public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) {
+ return null; // TODO: Customise this generated block
+ }
+
+ @Override
+ public CreateResourceReport createResource(CreateResourceReport report) {
+
+
+ ResourcePackageDetails details = report.getPackageDetails();
+
+ ContentContext cctx = context.getContentContext();
+ ContentServices contentServices = cctx.getContentServices();
+ String resourceTypeName = report.getResourceType().getName();
+
+ ASUploadConnection connection = new ASUploadConnection();
+ OutputStream out = connection.getOutputStream(details.getFileName());
+// contentServices.downloadPackageBits(cctx,details.getKey(),out,false);
+ contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out);
+
+ JsonNode result = connection.finishUpload();
+ System.out.println(result);
+
+
+ report.setStatus(CreateResourceStatus.SUCCESS) ;
+
+ return report;
+
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 02b4bf8..6741bb3 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -71,7 +71,7 @@
&logSources;
</plugin-configuration>
- <process-scan name="ProcessManager" query="process|basename|match=^java.*,arg|org.jboss.as.process-controller|match=.*"/>
+ <process-scan name="ProcessController" query="process|basename|match=^java.*,arg|org.jboss.as.process-controller|match=.*"/>
<operation name="dummyOperation">
@@ -93,7 +93,7 @@
&logSources;
</plugin-configuration>
- <process-scan name="ProcessManager" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
+ <process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
<operation name="dummyOperation">
@@ -132,16 +132,25 @@
<server name="ServerGroup"
description="Server groups on this domain"
discovery="SubsystemDiscovery"
- class="ServerGroupComponent">
+ class="ServerGroupComponent"
+ >
+ <!-- TODO move operation to createDeletePolicy="create-only" -->
+
<plugin-configuration>
<c:simple-property name="path" default="/server-group/*" readOnly="true"/>
</plugin-configuration>
+
+
+ <content name="deployment" category="deployable" isCreationType="true" description="Deployments on this domain">
+ </content>
+
<resource-configuration>
<c:simple-property name="profile" />
<c:simple-property name="socket-binding-group"/>
<c:simple-property name="jvm"/>
<c:simple-property name="deployment" required="false"/> <!-- TODO change structure. Or put below as resource? -->
</resource-configuration>
+ <service name="Deployment" class="BaseComponent" discovery="SubsystemDiscovery" createDeletePolicy="create-only"/>
</server>
<server name="Host"
description="Host involved in this domain"
@@ -171,9 +180,11 @@
</results>
</operation>
+<!--
<resource-configuration>
<c:list-property name="server-config" />
</resource-configuration>
+-->
</server>
@@ -216,16 +227,20 @@
</server>
<server name="JBossAS-Managed"
- discovery="BaseProcessDiscovery"
+ discovery="ManagedASDiscovery"
class="DomainComponent"
>
<plugin-configuration>
<c:simple-property name="hostname" default="localhost" required="true"/>
<c:simple-property name="port" default="9990" type="integer" required="true"/>
+ <c:simple-property name="domainHost" readOnly="true" description="Hostname in the domain"/>
+ <c:simple-property name="group" readOnly="true" displayName="Server Group" description="Server Group this instance belongs to."/>
&logSources;
</plugin-configuration>
+ <!-- Scan for host controller is intentional -->
+ <process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
<process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
<operation name="server:start" description="Start this server instance." displayName="Start">
@@ -330,7 +345,7 @@
class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/queue/"/>
+ <c:simple-property name="path" readOnly="true" default="/queue/*"/>
</plugin-configuration>
</service>
</server>
@@ -383,7 +398,9 @@
<resource-configuration>
<c:simple-property name="access-log"/>
- <c:list-property name="alias" description="The virtual server aliases"/>
+ <c:list-property name="alias" description="The virtual server aliases">
+ <c:simple-property name="alias"/>
+ </c:list-property>
<c:simple-property name="rewrite"/>
</resource-configuration>
commit 3b22a190f79b18c80c485f6f5b86c0a7f0b179e2
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Apr 5 21:45:49 2011 +0200
Make sure the input stream is closed. Otherwise we are keeping too many connections open and AS will choke on us.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 97788ae..0c6d516 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -173,6 +173,8 @@ public class ASConnection {
*/
public JsonNode execute(Operation operation) {
+ InputStream inputStream = null;
+ BufferedReader br=null;
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
@@ -188,23 +190,22 @@ public class ASConnection {
out.flush();
out.close();
- InputStream inputStream;
if (conn.getResponseCode()==HttpURLConnection.HTTP_OK) {
inputStream = conn.getInputStream();
- BufferedReader in = new BufferedReader(new InputStreamReader(
+ br = new BufferedReader(new InputStreamReader(
inputStream));
String line;
builder = new StringBuilder();
- while ((line = in.readLine()) != null) {
+ while ((line = br.readLine()) != null) {
builder.append(line);
}
- in.close();
+ br.close();
}
else {
InputStream errorStream = conn.getErrorStream();
if (errorStream!=null) {
- BufferedReader br = new BufferedReader(new InputStreamReader(errorStream));
+ br = new BufferedReader(new InputStreamReader(errorStream));
String line;
builder = new StringBuilder();
while ((line = br.readLine()) != null) {
@@ -213,6 +214,9 @@ public class ASConnection {
br.close();
}
}
+ if (br!=null)
+ br.close();
+
String outcome;
JsonNode operationResult=null;
if (builder!=null) {
commit 5f9a6b6cbe98d47ef75deac36e7a81b5cc73b427
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Sat Apr 2 09:24:27 2011 +0200
Allow creation and removal of Messaging destinations.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index bd0b458..97788ae 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -150,6 +150,9 @@ public class ASConnection {
JsonNode reasonNode = in.findValue("failure-description");
if (reasonNode==null)
reasonNode = in.findValue("domain-failure-description");// TODO JBAS-9182
+ if (reasonNode==null)
+ reasonNode = in.findValue("host-failure-descriptions"); // TODO JBAS-9182
+
String reason = reasonNode.getTextValue();
log.info(reason);
return true;
@@ -260,6 +263,8 @@ public class ASConnection {
JsonNode node = jsonNode.findValue("failure-description");
if (node==null)
node = jsonNode.findValue("domain-failure-description"); // TODO JBAS-9182
+ if (node==null)
+ node = jsonNode.findValue("host-failure-descriptions"); // TODO JBAS-9182
return node.getValueAsText();
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index b53dd74..a06a296 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -78,16 +78,16 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
String op = name.substring(colonPos+1);
Operation operation=null;
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
+
if (what.equals("server-group")) {
String groupName = parameters.getSimpleValue("name",null);
String profile = parameters.getSimpleValue("profile","default");
- List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>(1);
address.add(new PROPERTY_VALUE("server-group",groupName));
operation = new Operation(op,address,"profile",profile);
} else if (what.equals("server")) {
- List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
if (context.getResourceType().getName().equals("JBossAS-Managed")) {
String host = conf.getSimpleValue("domainHost","local");
@@ -99,17 +99,24 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
address.addAll(pathToAddress(getPath()));
String serverName = parameters.getSimpleValue("name",null);
address.add(new PROPERTY_VALUE("server-config",serverName));
- Map<String,String> props = new HashMap<String, String>();
+ Map<String,Object> props = new HashMap<String, Object>();
String serverGroup = parameters.getSimpleValue("group",null);
- props.put("name",serverName);
props.put("group",serverGroup);
-// boolean autoStart = parameters.getSimple("auto-start").getBooleanValue();
-// props.put("auto-start",String.valueOf(autoStart));
- // TODO put more properties in
+ if (op.equals("add")) {
+ props.put("name",serverName);
+ boolean autoStart = parameters.getSimple("auto-start").getBooleanValue();
+ props.put("auto-start",autoStart);
+ // TODO put more properties in
+ }
operation = new Operation(op,address,props);
}
-
+ } else if (what.equals("destination")) {
+ address.addAll(pathToAddress(getPath()));
+ String newName = parameters.getSimpleValue("name","");
+ String type = parameters.getSimpleValue("type","Queue").toLowerCase();
+ address.add(new PROPERTY_VALUE(type,newName));
+ operation = new Operation(op,address);
}
OperationResult operationResult = new OperationResult();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index b577407..1c498d1 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -95,6 +95,12 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
+ if (subsystemMap==null) {
+ log.warn("SubsystemMap was null for path [" + path + "] and subPath ["+ subPath + "] and subNode [" + subNode + "]");
+ return Collections.emptySet();
+ }
+
+
for (Map.Entry<String,Subsystem> entry: subsystemMap.entrySet()) {
String key = entry.getKey();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index 92abbae..e538c94 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -38,28 +38,28 @@ public class Operation {
private String operation;
@JsonProperty
private List<PROPERTY_VALUE> address = Collections.emptyList();
- private Map<String,String> additionalProperties;
+ private Map<String,Object> additionalProperties;
public Operation(String operation, List<PROPERTY_VALUE> address, NameValuePair payload) {
this.operation = operation;
this.address = address;
- additionalProperties = new HashMap<String,String>(2);
+ additionalProperties = new HashMap<String,Object>(2);
additionalProperties.put("name",payload.name);
additionalProperties.put("value",payload.value);
}
- public Operation(String operation, List<PROPERTY_VALUE> address, Map<String,String> payload) {
+ public Operation(String operation, List<PROPERTY_VALUE> address, Map<String,Object> payload) {
this.operation = operation;
this.address = address;
this.additionalProperties = payload;
}
- public Operation(String operation, List<PROPERTY_VALUE> address, String key, String value) {
+ public Operation(String operation, List<PROPERTY_VALUE> address, String key, Object value) {
this.operation = operation;
this.address = address;
- additionalProperties = new HashMap<String,String>(1);
+ additionalProperties = new HashMap<String,Object>(1);
additionalProperties.put(key,value);
}
@@ -78,30 +78,30 @@ public class Operation {
@JsonAnySetter
public void addAdditionalProperty(String key, String value) {
if (additionalProperties == null)
- additionalProperties = new HashMap<String, String>();
+ additionalProperties = new HashMap<String, Object>();
additionalProperties.put(key,value);
}
- public void setAdditionalProperties(Map<String, String> additionalProperties) {
+ public void setAdditionalProperties(Map<String, Object> additionalProperties) {
this.additionalProperties = additionalProperties;
}
@JsonAnyGetter
- public Map<String,String> getAdditionalProperties() {
+ public Map<String,Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonIgnore
public String getName() {
- return getProperty("name");
+ return (String) getProperty("name");
}
@JsonIgnore
public String getValue() {
- return getProperty("value");
+ return (String) getProperty("value");
}
- private String getProperty(String key) {
+ private Object getProperty(String key) {
if (additionalProperties.containsKey(key))
return additionalProperties.get(key);
else
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index e77a2ca..02b4bf8 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -132,7 +132,7 @@
<server name="ServerGroup"
description="Server groups on this domain"
discovery="SubsystemDiscovery"
- class="BaseComponent">
+ class="ServerGroupComponent">
<plugin-configuration>
<c:simple-property name="path" default="/server-group/*" readOnly="true"/>
</plugin-configuration>
@@ -156,7 +156,7 @@
<parameters>
<c:simple-property name="name" description="Name of this new server" required="true"/>
<c:simple-property name="group" displayName="Server Group" description="Server group to put this sever in" default="" required="false"/>
- <c:simple-property name="auto-start" displayName="Autostart" description="Should this server start at boot?" type="boolean" default="false" required="false"/>
+ <c:simple-property name="auto-start" displayName="Autostart" description="Should this server start at boot?" type="boolean" default="false" required="true"/>
</parameters>
<results>
<c:simple-property name="result" description="Outcome of the create server operation"/>
@@ -228,9 +228,21 @@
<process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
- <operation name="server:start" description="Start this server instance." displayName="Start"/>
- <operation name="server:stop" description="Stop this server instance." displayName="Stop"/>
- <operation name="server:restart" description="Restart this server instance." displayName="Restart"/>
+ <operation name="server:start" description="Start this server instance." displayName="Start">
+ <results>
+ <c:simple-property name="operationResult"/>
+ </results>
+ </operation>
+ <operation name="server:stop" description="Stop this server instance." displayName="Stop">
+ <results>
+ <c:simple-property name="operationResult"/>
+ </results>
+ </operation>
+ <operation name="server:restart" description="Restart this server instance." displayName="Restart">
+ <results>
+ <c:simple-property name="operationResult"/>
+ </results>
+ </operation>
@@ -256,7 +268,7 @@
<server name="Messaging"
discovery="SubsystemDiscovery"
- class="BaseComponent"
+ class="DomainComponent"
singleton="true"
>
<runs-inside>
@@ -268,6 +280,29 @@
<c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
</plugin-configuration>
+ <operation name="destination:add" displayName="Add destination" description="Add a Queue or Topic">
+ <parameters>
+ <c:simple-property name="name" description="Name of the Destination" required="true"/>
+ <c:simple-property name="type" description="Type of Destination to create" default="Queue">
+ <c:property-options>
+ <c:option value="Queue"/>
+ <c:option value="Topic"/>
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ <results>
+ <c:simple-property name="operationResult"/>
+ </results>
+ </operation>
+ <operation name="destination:remove" displayName="Remove Destination" description="Remove a destination">
+ <parameters>
+ <c:simple-property name="name" description="Name of the Destination" required="true"/>
+ </parameters>
+ <results>
+ <c:simple-property name="operationResult"/>
+ </results>
+ </operation>
+
<resource-configuration>
<c:simple-property name="journal-min-files" />
<c:simple-property name="journal-type" />
@@ -281,10 +316,23 @@
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/acceptor"/>
</plugin-configuration>
-
-
</service>
-
+ <service name="MessagingConnector"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/connector"/>
+ </plugin-configuration>
+ </service>
+ <service name="Queue"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/queue/"/>
+ </plugin-configuration>
+ </service>
</server>
<server name="JBossWeb"
@@ -344,6 +392,56 @@
</server>
+ <server name="Datasources"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/datasources"/>
+ </plugin-configuration>
+
+ <service name="DataSource"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/data-source/*"/>
+ </plugin-configuration>
+ </service>
+
+ <service name="XADataSource"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/xa-data-source/*"/>
+ </plugin-configuration>
+ </service>
+
+ <service name="JdbcDriver"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/jdbc-driver/*"/>
+ </plugin-configuration>
+ </service>
+
+ </server>
+
<service name="NetworkInterface"
discovery="InterfaceDiscovery"
class="BaseComponent"
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 929a87c..5ba843f 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -79,8 +79,9 @@ public class OperationJsonTest {
PROPERTY_VALUE part = new PROPERTY_VALUE("/server-group","newOne");
address.add(part);
- Map<String,String> props = new HashMap<String, String>();
+ Map<String,Object> props = new HashMap<String, Object>();
props.put("profile","default");
+ props.put("someBool",true);
Operation operation = new Operation("add",address,props);
@@ -94,6 +95,10 @@ public class OperationJsonTest {
Operation op = mapper.readValue(result,Operation.class);
assert op.getOperation().equals(operation.getOperation()) : "Operation is " + op.getOperation();
+ assert op.getAdditionalProperties().containsKey("someBool") : "Key someBool not found ";
+ Object someBool = op.getAdditionalProperties().get("someBool");
+ assert Boolean.valueOf((String) someBool) : "someBool was not true";
+
}
}
commit a3fdac16d1b0301ca4771c61ba7f7517d2880117
Merge: 7122b59 080e1d7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 31 12:56:44 2011 +0200
Merge branch 'master' into as7plugin
commit 7122b59f83eab6785068f46224f4d601373f26ef
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 31 12:24:46 2011 +0200
Start support for adding and removal of server instances.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 470722d..bd0b458 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -210,11 +210,19 @@ public class ASConnection {
br.close();
}
}
- String outcome = builder.toString();
+ String outcome;
+ JsonNode operationResult=null;
+ if (builder!=null) {
+ outcome= builder.toString();
+ operationResult = mapper.readTree(outcome);
+ }
+ else {
+ outcome="- no response from server -";
+ }
System.out.println("==> " + outcome);
- JsonNode operationResult = mapper.readTree(outcome);
return operationResult;
+
} catch (IOException e) {
e.printStackTrace(); // TODO: Customise this generated block
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index 460aebf..b53dd74 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -20,7 +20,9 @@ package org.rhq.modules.plugins.jbossas7;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.codehaus.jackson.JsonNode;
@@ -87,12 +89,27 @@ public class DomainComponent extends BaseComponent implements OperationFacet{
} else if (what.equals("server")) {
List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
- String host = conf.getSimpleValue("domainHost","local");
-
- address.add(new PROPERTY_VALUE("host",host));
- address.add(new PROPERTY_VALUE("server-config",myServerName));
+ if (context.getResourceType().getName().equals("JBossAS-Managed")) {
+ String host = conf.getSimpleValue("domainHost","local");
+ address.add(new PROPERTY_VALUE("host",host));
+ address.add(new PROPERTY_VALUE("server-config",myServerName));
+ operation = new Operation(op,address);
+ }
+ else if (context.getResourceType().getName().equals("Host")) {
+ address.addAll(pathToAddress(getPath()));
+ String serverName = parameters.getSimpleValue("name",null);
+ address.add(new PROPERTY_VALUE("server-config",serverName));
+ Map<String,String> props = new HashMap<String, String>();
+ String serverGroup = parameters.getSimpleValue("group",null);
+ props.put("name",serverName);
+ props.put("group",serverGroup);
+// boolean autoStart = parameters.getSimple("auto-start").getBooleanValue();
+// props.put("auto-start",String.valueOf(autoStart));
+ // TODO put more properties in
+
+ operation = new Operation(op,address,props);
+ }
- operation = new Operation(op,address);
}
OperationResult operationResult = new OperationResult();
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 9994339..e77a2ca 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -120,7 +120,6 @@
</parameters>
</operation>
-
<server name="Profile"
description="One profile in a domain"
discovery="SubsystemDiscovery"
@@ -147,12 +146,31 @@
<server name="Host"
description="Host involved in this domain"
discovery="SubsystemDiscovery"
- class="BaseComponent"
+ class="DomainComponent"
>
<plugin-configuration>
<c:simple-property name="path" default="/host/*" readOnly="true"/>
</plugin-configuration>
+ <operation name="server:add" displayName="Create server" description="Add a new server to this host.">
+ <parameters>
+ <c:simple-property name="name" description="Name of this new server" required="true"/>
+ <c:simple-property name="group" displayName="Server Group" description="Server group to put this sever in" default="" required="false"/>
+ <c:simple-property name="auto-start" displayName="Autostart" description="Should this server start at boot?" type="boolean" default="false" required="false"/>
+ </parameters>
+ <results>
+ <c:simple-property name="result" description="Outcome of the create server operation"/>
+ </results>
+ </operation>
+ <operation name="server:remove" displayName="Delete server" description="Deletes a server on this host.">
+ <parameters>
+ <c:simple-property name="name" description="Name of this new server" required="true"/>
+ </parameters>
+ <results>
+ <c:simple-property name="result" description="Outcome of the delete server operation"/>
+ </results>
+ </operation>
+
<resource-configuration>
<c:list-property name="server-config" />
</resource-configuration>
@@ -210,9 +228,10 @@
<process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
- <operation name="server:start" description="Start this server instance."/>
- <operation name="server:stop" description="Stop this server instance."/>
- <operation name="server:restart" description="Restart this server instance."/>
+ <operation name="server:start" description="Start this server instance." displayName="Start"/>
+ <operation name="server:stop" description="Stop this server instance." displayName="Stop"/>
+ <operation name="server:restart" description="Restart this server instance." displayName="Restart"/>
+
</server>
commit f2aa9b3dfbe8d6c2cc7b8239a753fe1f7023142a
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 31 08:30:04 2011 +0200
Get availability for a managed server from the domain.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
index bfed04a..460aebf 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -25,6 +25,7 @@ import java.util.List;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.Operation;
@@ -38,6 +39,29 @@ import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
public class DomainComponent extends BaseComponent implements OperationFacet{
@Override
+ public AvailabilityType getAvailability() {
+
+ if (context.getResourceType().getName().equals("JBossAS-Managed")) {
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>(2);
+ String host = conf.getSimpleValue("domainHost","local");
+ address.add(new PROPERTY_VALUE("host",host));
+ address.add(new PROPERTY_VALUE("server-config",myServerName));
+ Operation getStatus = new Operation("read-attribute",address,"name","status");
+ JsonNode result = connection.execute(getStatus);
+ if (connection.isErrorReply(result))
+ return AvailabilityType.DOWN;
+
+ String msg = connection.getSuccessDescription(result);
+ if (msg.contains("STARTED"))
+ return AvailabilityType.UP;
+ else
+ return AvailabilityType.DOWN;
+ }
+
+ return super.getAvailability(); // TODO: Customise this generated block
+ }
+
+ @Override
public OperationResult invokeOperation(String name,
Configuration parameters) throws InterruptedException, Exception {
commit 397d5539988b798e49d2dc6e3f896c125274e0bc
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 30 21:42:40 2011 +0200
Support start/stop/restart of servers.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 401887b..470722d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -199,7 +199,6 @@ public class ASConnection {
in.close();
}
else {
- System.out.println(conn.getResponseCode());
InputStream errorStream = conn.getErrorStream();
if (errorStream!=null) {
BufferedReader br = new BufferedReader(new InputStreamReader(errorStream));
@@ -254,6 +253,12 @@ public class ASConnection {
if (node==null)
node = jsonNode.findValue("domain-failure-description"); // TODO JBAS-9182
return node.getValueAsText();
+ }
+ public String getSuccessDescription(JsonNode jsonNode) {
+ if (jsonNode==null)
+ return "No message found";
+ JsonNode node = jsonNode.findValue("result");
+ return node.getValueAsText();
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 3b025f3..5dbd0b3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -291,7 +291,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return ret;
}
- private String getResultingPath() {
+ protected String getResultingPath() {
ResourceComponent parentResourceComponent = context.getParentResourceComponent();
String parentPath =null;
String myPath;
@@ -328,7 +328,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
- private List<PROPERTY_VALUE> pathToAddress(String path) {
+ protected List<PROPERTY_VALUE> pathToAddress(String path) {
if (path.endsWith("/"))
path = path.substring(0,path.length()-1);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
index c38e297..5ea4bd7 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
@@ -1,12 +1,19 @@
package org.rhq.modules.plugins.jbossas7;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.support.metadata.LocalVMTypeDescriptor;
+import org.w3c.dom.Document;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertyList;
@@ -17,6 +24,7 @@ import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ProcessScanResult;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.core.system.ProcessInfo;
import org.rhq.plugins.jmx.JMXDiscoveryComponent;
@@ -29,6 +37,7 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
static final String DJBOSS_SERVER_BASE_DIR = "-Djboss.server.base.dir=";
static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
+ static final String DLOGGING_CONFIGURATION = "-Dlogging.configuration=";
private final Log log = LogFactory.getLog(this.getClass());
/**
@@ -69,6 +78,10 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
tmp = tmp.substring( i + 8);
tmp = tmp.substring(0,tmp.indexOf("/"));
serverNameFull = tmp;
+
+ String host = findHost(psr.getProcessInfo(),true);
+ config.put(new PropertySimple("domainHost",host));
+
}
serverName = serverNameFull.substring(serverNameFull.lastIndexOf("/")+1);
if (serverName.isEmpty())
@@ -114,7 +127,49 @@ public class BaseProcessDiscovery implements ResourceDiscoveryComponent
}
- String getBaseDirFromCommandLine(String[] commandLine) {
+ private String findHost(ProcessInfo processInfo,boolean isDomain) {
+ String hostXmlFile = getHostXmlFileLocation(processInfo, isDomain);
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ String hostName = null;
+ try {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ InputStream is = new FileInputStream(hostXmlFile);
+ Document document = builder.parse(is); // TODO keep this around
+ hostName = document.getDocumentElement().getAttribute("name");
+ is.close();
+ } catch (Exception e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ }
+ if (hostName==null)
+ hostName="local"; // Fallback to the installation default
+ return hostName;
+ }
+
+ /**
+ * Get the location of the host definition file (host.xml in domain mode, standalone.xml
+ * in standalone mode.
+ * @param processInfo ProcessInfo structure containing the ENV variables
+ * @param isDomain Are we looking for host.xml (=isDomain) or not
+ * @return The path to the definition file.
+ */
+ private String getHostXmlFileLocation(ProcessInfo processInfo, boolean isDomain) {
+
+ String home = processInfo.getEnvironmentVariable("jboss.home.dir");
+ StringBuilder builder = new StringBuilder(home);
+ if (isDomain)
+ builder.append("/domain");
+ else
+ builder.append("/standalone");
+ builder.append("/configuration");
+ if (isDomain)
+ builder.append("/host.xml");
+ else
+ builder.append("/standalone.xml");
+ return builder.toString();
+
+ }
+
+ String getBaseDirFromCommandLine(String[] commandLine) {
for (String line: commandLine) {
if (line.startsWith(DJBOSS_SERVER_BASE_DIR))
return line.substring(DJBOSS_SERVER_BASE_DIR.length());
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
new file mode 100644
index 0000000..bfed04a
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainComponent.java
@@ -0,0 +1,91 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.codehaus.jackson.JsonNode;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.pluginapi.operation.OperationFacet;
+import org.rhq.core.pluginapi.operation.OperationResult;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Common stuff for the Domain
+ * @author Heiko W. Rupp
+ */
+@SuppressWarnings("unused")
+public class DomainComponent extends BaseComponent implements OperationFacet{
+
+ @Override
+ public OperationResult invokeOperation(String name,
+ Configuration parameters) throws InterruptedException, Exception {
+
+ if (!name.contains(":")) {
+ OperationResult badName = new OperationResult("Operation name did not contain a ':'");
+ badName.setErrorMessage("Operation name did not contain a ':'");
+ return badName;
+ }
+
+ int colonPos = name.indexOf(':');
+ String what = name.substring(0, colonPos);
+ String op = name.substring(colonPos+1);
+ Operation operation=null;
+
+ if (what.equals("server-group")) {
+ String groupName = parameters.getSimpleValue("name",null);
+ String profile = parameters.getSimpleValue("profile","default");
+
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>(1);
+ address.add(new PROPERTY_VALUE("server-group",groupName));
+
+ operation = new Operation(op,address,"profile",profile);
+ } else if (what.equals("server")) {
+ List<PROPERTY_VALUE> address = new ArrayList<PROPERTY_VALUE>();
+
+ String host = conf.getSimpleValue("domainHost","local");
+
+ address.add(new PROPERTY_VALUE("host",host));
+ address.add(new PROPERTY_VALUE("server-config",myServerName));
+
+ operation = new Operation(op,address);
+ }
+
+ OperationResult operationResult = new OperationResult();
+ if (operation!=null) {
+ JsonNode result = connection.execute(operation);
+
+ if (connection.isErrorReply(result)) {
+ operationResult.setErrorMessage(connection.getFailureDescription(result));
+ }
+ else {
+ operationResult.setSimpleResult(connection.getSuccessDescription(result));
+ }
+ }
+ else {
+ operationResult.setErrorMessage("No valid operation was given");
+ }
+ // TODO throw an exception if the operation failed?
+ return operationResult;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index 898f176..92abbae 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -64,6 +64,13 @@ public class Operation {
}
+ public Operation(String operation, List<PROPERTY_VALUE> address) {
+ this.operation = operation;
+ this.address = address;
+ additionalProperties = Collections.emptyMap();
+
+ }
+
public Operation() {
// needed for Jackson
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 6af7de6..9994339 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -199,7 +199,7 @@
<server name="JBossAS-Managed"
discovery="BaseProcessDiscovery"
- class="BaseComponent"
+ class="DomainComponent"
>
<plugin-configuration>
<c:simple-property name="hostname" default="localhost" required="true"/>
@@ -210,6 +210,11 @@
<process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
+ <operation name="server:start" description="Start this server instance."/>
+ <operation name="server:stop" description="Stop this server instance."/>
+ <operation name="server:restart" description="Restart this server instance."/>
+
+
</server>
commit 63147effa639ef08f8cff763393efbafcd3a8607
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 30 12:17:21 2011 +0200
Make executing of Operations more generic and implement add/remove of serverGroups.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 192a54f..401887b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -148,6 +148,8 @@ public class ASConnection {
outcome = outcomeNode.getTextValue();
if (outcome.equals("failed")) {
JsonNode reasonNode = in.findValue("failure-description");
+ if (reasonNode==null)
+ reasonNode = in.findValue("domain-failure-description");// TODO JBAS-9182
String reason = reasonNode.getTextValue();
log.info(reason);
return true;
@@ -163,11 +165,10 @@ public class ASConnection {
/**
* Execute an operation against the domain api
- * @param path Node to manipulate
- * @param operationName operation to run
- * @param attributeValue attribute-name-value pair
+ * @return JsonNode that describes the result
+ * @param operation an Operation that should be run on the domain controller
*/
- public JsonNode execute(String path, String operationName, NameValuePair attributeValue) {
+ public JsonNode execute(Operation operation) {
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
@@ -177,8 +178,6 @@ public class ASConnection {
ObjectMapper mapper = new ObjectMapper();
- Operation operation = new Operation(operationName,pathToAddress(path),attributeValue);
-
String result = mapper.writeValueAsString(operation);
System.out.println("Json to send: " + result);
mapper.writeValue(out, operation);
@@ -224,22 +223,6 @@ public class ASConnection {
return null;
}
- private List<PROPERTY_VALUE> pathToAddress(String path) {
- if (path.endsWith("/"))
- path = path.substring(0,path.length()-1);
-
- if (path.startsWith("/"))
- path = path.substring(1);
-
- List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
- String[] components = path.split("/");
- for (int i = 0; i < components.length ; i+=2) {
- PROPERTY_VALUE valuePair = new PROPERTY_VALUE(components[i],components[i+1]);
- result.add(valuePair);
- }
-
- return result;
- }
private URL getBaseUrl(String base, String ops) throws MalformedURLException {
String spec;
@@ -268,6 +251,8 @@ public class ASConnection {
if (jsonNode==null)
return "getFailureDescription: -input was null-";
JsonNode node = jsonNode.findValue("failure-description");
+ if (node==null)
+ node = jsonNode.findValue("domain-failure-description"); // TODO JBAS-9182
return node.getValueAsText();
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 788531b..3b025f3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -45,9 +45,13 @@ import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pluginapi.operation.OperationFacet;
+import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -149,22 +153,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- ResourceComponent parentResourceComponent = context.getParentResourceComponent();
- String parentPath =null;
- String myPath;
- if (parentResourceComponent instanceof BaseComponent) {
- BaseComponent parentComponent = (BaseComponent) parentResourceComponent;
- parentPath = parentComponent.getPath();
- }
-
- if (parentPath!=null) {
- if (parentPath.endsWith("/") || path.startsWith("/"))
- myPath = parentPath + path;
- else
- myPath = parentPath + "/" + path;
- }
- else
- myPath = path;
+ String myPath = getResultingPath();
JsonNode json = connection.getLevelData(myPath,true,false);
@@ -302,6 +291,26 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
return ret;
}
+ private String getResultingPath() {
+ ResourceComponent parentResourceComponent = context.getParentResourceComponent();
+ String parentPath =null;
+ String myPath;
+ if (parentResourceComponent instanceof BaseComponent) {
+ BaseComponent parentComponent = (BaseComponent) parentResourceComponent;
+ parentPath = parentComponent.getPath();
+ }
+
+ if (parentPath!=null) {
+ if (parentPath.endsWith("/") || path.startsWith("/"))
+ myPath = parentPath + path;
+ else
+ myPath = parentPath + "/" + path;
+ }
+ else
+ myPath = path;
+ return myPath;
+ }
+
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
@@ -309,7 +318,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
for (Map.Entry<String, PropertySimple> entry : conf.getSimpleProperties().entrySet()) {
NameValuePair nvp = new NameValuePair(entry.getKey(),entry.getValue().getStringValue());
- JsonNode result= connection.execute(key,"write-attribute",nvp); // TODO path / key handling
+ Operation writeAttribute = new Operation("write-attribute",pathToAddress(getResultingPath()),nvp);
+ JsonNode result= connection.execute(writeAttribute);
if(connection.isErrorReply(result)) {
report.setStatus(ConfigurationUpdateStatus.FAILURE);
report.setErrorMessage(connection.getFailureDescription(result));
@@ -317,4 +327,22 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
}
+
+ private List<PROPERTY_VALUE> pathToAddress(String path) {
+ if (path.endsWith("/"))
+ path = path.substring(0,path.length()-1);
+
+ if (path.startsWith("/"))
+ path = path.substring(1);
+
+ List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
+ String[] components = path.split("/");
+ for (int i = 0; i < components.length ; i+=2) {
+ PROPERTY_VALUE valuePair = new PROPERTY_VALUE(components[i],components[i+1]);
+ result.add(valuePair);
+ }
+
+ return result;
+ }
+
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index 642b41f..898f176 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -20,10 +20,14 @@ package org.rhq.modules.plugins.jbossas7.json;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import org.codehaus.jackson.annotate.JsonAnyGetter;
+import org.codehaus.jackson.annotate.JsonAnySetter;
+import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.annotate.JsonValue;
/**
* Operation to run on the server
@@ -31,23 +35,71 @@ import org.codehaus.jackson.annotate.JsonValue;
*/
public class Operation {
+ private String operation;
+ @JsonProperty
+ private List<PROPERTY_VALUE> address = Collections.emptyList();
+ private Map<String,String> additionalProperties;
+
+
public Operation(String operation, List<PROPERTY_VALUE> address, NameValuePair payload) {
this.operation = operation;
this.address = address;
- this.name = payload.name;
- this.value = payload.value;
+ additionalProperties = new HashMap<String,String>(2);
+ additionalProperties.put("name",payload.name);
+ additionalProperties.put("value",payload.value);
+
+ }
+
+ public Operation(String operation, List<PROPERTY_VALUE> address, Map<String,String> payload) {
+ this.operation = operation;
+ this.address = address;
+ this.additionalProperties = payload;
+ }
+
+ public Operation(String operation, List<PROPERTY_VALUE> address, String key, String value) {
+ this.operation = operation;
+ this.address = address;
+ additionalProperties = new HashMap<String,String>(1);
+ additionalProperties.put(key,value);
+
}
public Operation() {
// needed for Jackson
}
- private String operation;
- @JsonProperty
- private List<PROPERTY_VALUE> address = Collections.emptyList();
+ @JsonAnySetter
+ public void addAdditionalProperty(String key, String value) {
+ if (additionalProperties == null)
+ additionalProperties = new HashMap<String, String>();
+ additionalProperties.put(key,value);
+ }
- private String name;
- private String value;
+ public void setAdditionalProperties(Map<String, String> additionalProperties) {
+ this.additionalProperties = additionalProperties;
+ }
+
+ @JsonAnyGetter
+ public Map<String,String> getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ @JsonIgnore
+ public String getName() {
+ return getProperty("name");
+ }
+
+ @JsonIgnore
+ public String getValue() {
+ return getProperty("value");
+ }
+
+ private String getProperty(String key) {
+ if (additionalProperties.containsKey(key))
+ return additionalProperties.get(key);
+ else
+ return null;
+ }
public String getOperation() {
return operation;
@@ -72,58 +124,5 @@ public class Operation {
return address;
}
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getValue() {
- return value;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
-
- /*
- [localhost:9999 /subsystem=web/connector=http] :write-attribute(name=socket-binding,value=jndi)
- yield JSON to send:
- {
- "operation" : "write-attribute",
- "name" : "socket-binding",
- "value" : "jndi",
- "address" : [
- {
- "PROPERTY_VALUE" : {
- "subsystem" : "web"
- }
- },
- {
- "PROPERTY_VALUE" : {
- "connector" : "http"
- }
- }
- ]
- }
- */
-
-// @JsonValue
-// public String toString() {
-// StringBuilder b = new StringBuilder();
-// b.append('{');
-// b.append("\"operation\":\"").append(operation).append("\",");
-// b.append("\"address\":");
-// if (address!=null && !address.isEmpty())
-// b.append(address);
-// else
-// b.append("[]");
-// b.append(',');
-// b.append(payload);
-// b.append("}");
-// return b.toString();
-// }
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index ee6b21f..6af7de6 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -105,9 +105,21 @@
<server name="Domain"
discovery="DomainDiscovery"
- class="BaseComponent"
+ class="DomainComponent"
description="An AS7 management profile">
+ <operation name="server-group:add" displayName="Add ServerGroup" description="Add a server group to the Domain.">
+ <parameters>
+ <c:simple-property name="name" description="Name of Group to add"/>
+ <c:simple-property name="profile" description="Profile to add this group to"/>
+ </parameters>
+ </operation>
+ <operation name="server-group:remove" displayName="Remove ServerGroup" description="Remove a server group from the Domain.">
+ <parameters>
+ <c:simple-property name="name" description="Name of Group to add"/>
+ </parameters>
+ </operation>
+
<server name="Profile"
description="One profile in a domain"
@@ -125,7 +137,6 @@
<plugin-configuration>
<c:simple-property name="path" default="/server-group/*" readOnly="true"/>
</plugin-configuration>
-
<resource-configuration>
<c:simple-property name="profile" />
<c:simple-property name="socket-binding-group"/>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 4909595..929a87c 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -19,7 +19,9 @@
package org.rhq.modules.plugins.jbossas7;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.testng.annotations.Test;
@@ -70,4 +72,28 @@ public class OperationJsonTest {
assert pv.getKey().equals("myKey") : "Key is " + pv.getKey();
assert pv.getValue().equals("myValue"): "Value is " + pv.getValue();
}
+
+ public void anyPayloadTest() throws Exception {
+
+ List<PROPERTY_VALUE> address=new ArrayList<PROPERTY_VALUE>(2);
+ PROPERTY_VALUE part = new PROPERTY_VALUE("/server-group","newOne");
+ address.add(part);
+
+ Map<String,String> props = new HashMap<String, String>();
+ props.put("profile","default");
+
+ Operation operation = new Operation("add",address,props);
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String result = mapper.writeValueAsString(operation);
+ System.out.println(result);
+
+ assert !result.contains("name") : "Result contains a name property but should not : " + result;
+ assert !result.contains("null") : "Result contains null values but should not : " + result;
+
+ Operation op = mapper.readValue(result,Operation.class);
+ assert op.getOperation().equals(operation.getOperation()) : "Operation is " + op.getOperation();
+
+ }
}
commit bb592ab259599fcb931b681ec083cce7ed492b9f
Merge: 80b2237 7a161e2
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 29 17:30:04 2011 +0200
Merge branch 'master' into as7plugin
commit 80b2237cc9bb9fb01cd04c30dd3e13ee8f1e9244
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 29 13:36:38 2011 +0200
Rename class to better reflect its purpose.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
deleted file mode 100644
index 7c55233..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package org.rhq.modules.plugins.jbossas7;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.mc4j.ems.connection.support.metadata.LocalVMTypeDescriptor;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertyList;
-import org.rhq.core.domain.configuration.PropertyMap;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ProcessScanResult;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.plugins.jmx.JMXDiscoveryComponent;
-
-
-/**
- * Discovery class
- */
-public class BaseDiscovery implements ResourceDiscoveryComponent
-
-{
-
- static final String DJBOSS_SERVER_BASE_DIR = "-Djboss.server.base.dir=";
- static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
- private final Log log = LogFactory.getLog(this.getClass());
-
- /**
- * Run the auto-discovery
- */
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception {
- Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>();
-
-
- List<ProcessScanResult> scans = discoveryContext.getAutoDiscoveredProcesses();
-
- for (ProcessScanResult psr : scans) {
-
- Configuration config = discoveryContext.getDefaultPluginConfiguration();
- // IF SE, then look at domain/configuration/host.xml <management interface="default" port="9990
- // for management port
- String[] commandLine = psr.getProcessInfo().getCommandLine();
- String serverNameFull;
- String serverName;
- String psName = psr.getProcessScan().getName();
- if (psName.equals("ProcessManager")) {
- serverNameFull = "ProcessManager";
- serverName = "ProcessManager";
- } else if (psName.equals("ASManager")) {
- serverName = "ASManager";
- serverNameFull = "ASManager";
- } else if (psName.equals("HostController")) {
- serverName = "HostController";
- serverNameFull = "HostController";
- } else {
- serverNameFull = getBaseDirFromCommandLine(commandLine);
- if (serverNameFull==null || serverNameFull.isEmpty()) {
- // Try to obtain the server name
- // -Dorg.jboss.boot.log.file=domain/servers/server-one/log/boot.log
- // This is a hack until I know a better way to do so.
- String tmp = getLogFileFromCommandLine(commandLine);
- int i = tmp.indexOf("servers/");
- tmp = tmp.substring( i + 8);
- tmp = tmp.substring(0,tmp.indexOf("/"));
- serverNameFull = tmp;
- }
- serverName = serverNameFull.substring(serverNameFull.lastIndexOf("/")+1);
- if (serverName.isEmpty())
- serverName = serverNameFull;
-
- }
- String logFile = getLogFileFromCommandLine(commandLine);
- initLogEventSourcesConfigProp(logFile,config);
- String javaClazz = psr.getProcessInfo().getName();
-
-
- /*
- * We'll connect to the discovered VM on the local host, so set the jmx connection
- * properties accordingly. This may only work on JDK6+, but then JDK5 is deprecated
- * anyway.
- */
-// config.put(new PropertySimple(JMXDiscoveryComponent.COMMAND_LINE_CONFIG_PROPERTY,
-// javaClazz));
- config.put(new PropertySimple(JMXDiscoveryComponent.CONNECTION_TYPE,
- LocalVMTypeDescriptor.class.getName()));
-
- // TODO vmid will change when the detected server is bounced - how do we follow this?
- config.put(new PropertySimple(JMXDiscoveryComponent.VMID_CONFIG_PROPERTY,psr.getProcessInfo().getPid()));
-
-
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- discoveryContext.getResourceType(), // ResourceType
- serverNameFull, // key TODO distinguish per domain?
- serverName, // Name
- null, // TODO real version ?
- "TODO", // Description
- config,
- psr.getProcessInfo()
- );
-
-
- // Add to return values
- discoveredResources.add(detail);
- log.info("Discovered new ... " + discoveryContext.getResourceType() + ", " + serverNameFull);
- }
-
- return discoveredResources;
-
- }
-
- String getBaseDirFromCommandLine(String[] commandLine) {
- for (String line: commandLine) {
- if (line.startsWith(DJBOSS_SERVER_BASE_DIR))
- return line.substring(DJBOSS_SERVER_BASE_DIR.length());
- }
- return "";
- }
-
-//-Dorg.jboss.boot.log.file=/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/log/server-manager/boot.log
-//-Dlogging.configuration=file:/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/configuration/logging.properties
-
- String getLogFileFromCommandLine(String[] commandLine) {
-
- for (String line: commandLine) {
- if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
- return line.substring(DORG_JBOSS_BOOT_LOG_FILE.length());
- }
- return "";
- }
-
- private void initLogEventSourcesConfigProp(String fileName, Configuration pluginConfiguration) {
-
- PropertyList logEventSources = pluginConfiguration
- .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
-
- if (logEventSources==null)
- return;
-
- File serverLogFile = new File(fileName);
-
- if (serverLogFile.exists() && !serverLogFile.isDirectory()) {
- PropertyMap serverLogEventSource = new PropertyMap("logEventSource");
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, serverLogFile));
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
- logEventSources.add(serverLogEventSource);
- }
- }
-
-}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
new file mode 100644
index 0000000..c38e297
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseProcessDiscovery.java
@@ -0,0 +1,157 @@
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mc4j.ems.connection.support.metadata.LocalVMTypeDescriptor;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ProcessScanResult;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.plugins.jmx.JMXDiscoveryComponent;
+
+
+/**
+ * Discovery class
+ */
+public class BaseProcessDiscovery implements ResourceDiscoveryComponent
+
+{
+
+ static final String DJBOSS_SERVER_BASE_DIR = "-Djboss.server.base.dir=";
+ static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ /**
+ * Run the auto-discovery
+ */
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception {
+ Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>();
+
+
+ List<ProcessScanResult> scans = discoveryContext.getAutoDiscoveredProcesses();
+
+ for (ProcessScanResult psr : scans) {
+
+ Configuration config = discoveryContext.getDefaultPluginConfiguration();
+ // IF SE, then look at domain/configuration/host.xml <management interface="default" port="9990
+ // for management port
+ String[] commandLine = psr.getProcessInfo().getCommandLine();
+ String serverNameFull;
+ String serverName;
+ String psName = psr.getProcessScan().getName();
+ if (psName.equals("ProcessManager")) {
+ serverNameFull = "ProcessManager";
+ serverName = "ProcessManager";
+ } else if (psName.equals("ASManager")) {
+ serverName = "ASManager";
+ serverNameFull = "ASManager";
+ } else if (psName.equals("HostController")) {
+ serverName = "HostController";
+ serverNameFull = "HostController";
+ } else {
+ serverNameFull = getBaseDirFromCommandLine(commandLine);
+ if (serverNameFull==null || serverNameFull.isEmpty()) {
+ // Try to obtain the server name
+ // -Dorg.jboss.boot.log.file=domain/servers/server-one/log/boot.log
+ // This is a hack until I know a better way to do so.
+ String tmp = getLogFileFromCommandLine(commandLine);
+ int i = tmp.indexOf("servers/");
+ tmp = tmp.substring( i + 8);
+ tmp = tmp.substring(0,tmp.indexOf("/"));
+ serverNameFull = tmp;
+ }
+ serverName = serverNameFull.substring(serverNameFull.lastIndexOf("/")+1);
+ if (serverName.isEmpty())
+ serverName = serverNameFull;
+
+ }
+ String logFile = getLogFileFromCommandLine(commandLine);
+ initLogEventSourcesConfigProp(logFile,config);
+ String javaClazz = psr.getProcessInfo().getName();
+
+
+ /*
+ * We'll connect to the discovered VM on the local host, so set the jmx connection
+ * properties accordingly. This may only work on JDK6+, but then JDK5 is deprecated
+ * anyway.
+ */
+// config.put(new PropertySimple(JMXDiscoveryComponent.COMMAND_LINE_CONFIG_PROPERTY,
+// javaClazz));
+ config.put(new PropertySimple(JMXDiscoveryComponent.CONNECTION_TYPE,
+ LocalVMTypeDescriptor.class.getName()));
+
+ // TODO vmid will change when the detected server is bounced - how do we follow this?
+ config.put(new PropertySimple(JMXDiscoveryComponent.VMID_CONFIG_PROPERTY,psr.getProcessInfo().getPid()));
+
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ discoveryContext.getResourceType(), // ResourceType
+ serverNameFull, // key TODO distinguish per domain?
+ serverName, // Name
+ null, // TODO real version ?
+ "TODO", // Description
+ config,
+ psr.getProcessInfo()
+ );
+
+
+ // Add to return values
+ discoveredResources.add(detail);
+ log.info("Discovered new ... " + discoveryContext.getResourceType() + ", " + serverNameFull);
+ }
+
+ return discoveredResources;
+
+ }
+
+ String getBaseDirFromCommandLine(String[] commandLine) {
+ for (String line: commandLine) {
+ if (line.startsWith(DJBOSS_SERVER_BASE_DIR))
+ return line.substring(DJBOSS_SERVER_BASE_DIR.length());
+ }
+ return "";
+ }
+
+//-Dorg.jboss.boot.log.file=/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/log/server-manager/boot.log
+//-Dlogging.configuration=file:/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/configuration/logging.properties
+
+ String getLogFileFromCommandLine(String[] commandLine) {
+
+ for (String line: commandLine) {
+ if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
+ return line.substring(DORG_JBOSS_BOOT_LOG_FILE.length());
+ }
+ return "";
+ }
+
+ private void initLogEventSourcesConfigProp(String fileName, Configuration pluginConfiguration) {
+
+ PropertyList logEventSources = pluginConfiguration
+ .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
+
+ if (logEventSources==null)
+ return;
+
+ File serverLogFile = new File(fileName);
+
+ if (serverLogFile.exists() && !serverLogFile.isDirectory()) {
+ PropertyMap serverLogEventSource = new PropertyMap("logEventSource");
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, serverLogFile));
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
+ logEventSources.add(serverLogEventSource);
+ }
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 2825e10..ee6b21f 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -59,7 +59,7 @@
-->
<server name="ProcessController"
- discovery="BaseDiscovery"
+ discovery="BaseProcessDiscovery"
class="BaseComponent"
description="Reaper process for other AS7 servicees"
>
@@ -80,6 +80,28 @@
</server>
+ <server name="HostController"
+ discovery="BaseProcessDiscovery"
+ class="BaseComponent"
+ description="Domain controller delegate for this host"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="hostname" default="localhost" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" required="true"/>
+
+ &logSources;
+ </plugin-configuration>
+
+ <process-scan name="ProcessManager" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
+
+
+ <operation name="dummyOperation">
+ <!-- TODO supply parameters and return values -->
+ </operation>
+
+
+ </server>
<server name="Domain"
discovery="DomainDiscovery"
@@ -129,7 +151,7 @@
</server>
<server name="JBossAS7-Standalone"
- discovery="BaseDiscovery"
+ discovery="BaseProcessDiscovery"
class="BaseComponent"
>
@@ -165,7 +187,7 @@
</server>
<server name="JBossAS-Managed"
- discovery="BaseDiscovery"
+ discovery="BaseProcessDiscovery"
class="BaseComponent"
>
<plugin-configuration>
commit 800fe24b2eff29a7922a9b9a4ab1a309d352a077
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 29 13:24:29 2011 +0200
Better discover managed AS servers - get their name from the log file for now.
TODO: should we better query the DC, as this also knows the AS that are not auto-started.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
index 96737dd..7c55233 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
@@ -55,10 +55,21 @@ public class BaseDiscovery implements ResourceDiscoveryComponent
} else if (psName.equals("ASManager")) {
serverName = "ASManager";
serverNameFull = "ASManager";
+ } else if (psName.equals("HostController")) {
+ serverName = "HostController";
+ serverNameFull = "HostController";
} else {
serverNameFull = getBaseDirFromCommandLine(commandLine);
- if (serverNameFull==null || serverNameFull.isEmpty())
- serverNameFull="JBossAS7";
+ if (serverNameFull==null || serverNameFull.isEmpty()) {
+ // Try to obtain the server name
+ // -Dorg.jboss.boot.log.file=domain/servers/server-one/log/boot.log
+ // This is a hack until I know a better way to do so.
+ String tmp = getLogFileFromCommandLine(commandLine);
+ int i = tmp.indexOf("servers/");
+ tmp = tmp.substring( i + 8);
+ tmp = tmp.substring(0,tmp.indexOf("/"));
+ serverNameFull = tmp;
+ }
serverName = serverNameFull.substring(serverNameFull.lastIndexOf("/")+1);
if (serverName.isEmpty())
serverName = serverNameFull;
commit ba753e1d0ce503b7252ae9e92cbdb9b810ec4519
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 28 22:12:31 2011 +0200
Add server-groups and hosts to the domain.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index a2b5335..788531b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -53,6 +53,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import com.sun.org.apache.xml.internal.security.utils.Base64;
+
public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet
{
private final Log log = LogFactory.getLog(this.getClass());
@@ -147,13 +149,22 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- BaseComponent parentComponent = (BaseComponent) context.getParentResourceComponent();
+ ResourceComponent parentResourceComponent = context.getParentResourceComponent();
+ String parentPath =null;
String myPath;
- String parentPath = parentComponent.getPath();
- if (parentPath.endsWith("/") || path.startsWith("/"))
- myPath = parentPath + path;
+ if (parentResourceComponent instanceof BaseComponent) {
+ BaseComponent parentComponent = (BaseComponent) parentResourceComponent;
+ parentPath = parentComponent.getPath();
+ }
+
+ if (parentPath!=null) {
+ if (parentPath.endsWith("/") || path.startsWith("/"))
+ myPath = parentPath + path;
+ else
+ myPath = parentPath + "/" + path;
+ }
else
- myPath = parentPath + "/" + path;
+ myPath = path;
JsonNode json = connection.getLevelData(myPath,true,false);
@@ -169,19 +180,30 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
if (sub!=null)
propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
else {
- propertySimple = new PropertySimple(propDef.getName(),null); // TODO store it at all?
+ propertySimple = new PropertySimple(propDef.getName(),null); // TODO store it at all when it is null?
}
ret.put(propertySimple);
} else if (propDef instanceof PropertyDefinitionList) {
PropertyList propertyList = new PropertyList(propDef.getName());
PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
if (memberDefinition ==null) {
- Iterator<JsonNode> values = sub.getElements();
- while (values.hasNext()) {
- JsonNode node = values.next();
- String value = node.getTextValue();
- PropertySimple propertySimple = new PropertySimple(propDef.getName(),value);
- propertyList.add(propertySimple);
+ if (sub.isObject()) {
+ Iterator<String> fields = sub.getFieldNames();
+ while(fields.hasNext()) {
+ String fieldName = fields.next();
+ JsonNode subNode = sub.get(fieldName);
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(),fieldName);
+ propertyList.add(propertySimple);
+ }
+ } else {
+ System.out.println("===Sub not object==="); // TODO evaluate this branch again
+ Iterator<JsonNode> values = sub.getElements();
+ while (values.hasNext()) {
+ JsonNode node = values.next();
+ String value = node.getTextValue();
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(),value);
+ propertyList.add(propertySimple);
+ }
}
}
else if (memberDefinition instanceof PropertyDefinitionMap) {
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 8176e8a..2825e10 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -104,6 +104,26 @@
<c:simple-property name="path" default="/server-group/*" readOnly="true"/>
</plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="profile" />
+ <c:simple-property name="socket-binding-group"/>
+ <c:simple-property name="jvm"/>
+ <c:simple-property name="deployment" required="false"/> <!-- TODO change structure. Or put below as resource? -->
+ </resource-configuration>
+ </server>
+ <server name="Host"
+ description="Host involved in this domain"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" default="/host/*" readOnly="true"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:list-property name="server-config" />
+ </resource-configuration>
+
</server>
</server>
@@ -128,11 +148,6 @@
<process-scan name="StandaloneAS" query="process|basename|match=^java.*,arg|org.jboss.as.standalone|match=.*"/>
- <operation name="dummyOperation">
- <!-- TODO supply parameters and return values -->
- </operation>
-
-
<resource-configuration>
<c:list-property name="schema-locations" displayName="Schema locations">
<c:map-property name="location">
@@ -162,17 +177,6 @@
<process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
-
- <metric property="serverGroup" dataType="trait" displayType="summary" />
- <resource-configuration>
- <!--<c:group name="interfaces">-->
- <c:simple-property name="loopback" default="127.0.0.1" />
- <c:simple-property name="external" default="any" />
- <c:simple-property name="public" default="any" />
- <!--</c:group>-->
- </resource-configuration>
-
-
</server>
@@ -290,6 +294,7 @@
<runs-inside>
<parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="Host" plugin="jboss-as-7"/>
<parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
</runs-inside>
commit 76830060b0233e12f319b7baae24fd23d850756d
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 28 17:55:31 2011 +0200
More path handling improvements.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index c626c49..192a54f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -138,6 +138,9 @@ public class ASConnection {
boolean isErrorReply(JsonNode in) {
+ if (in == null)
+ return true;
+
if (in.has("outcome")) {
String outcome = null;
try {
@@ -262,6 +265,8 @@ public class ASConnection {
}
public String getFailureDescription(JsonNode jsonNode) {
+ if (jsonNode==null)
+ return "getFailureDescription: -input was null-";
JsonNode node = jsonNode.findValue("failure-description");
return node.getValueAsText();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 9407172..a2b5335 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -147,7 +147,16 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- JsonNode json = connection.getLevelData(path,true,false); // TODO path ? key?
+ BaseComponent parentComponent = (BaseComponent) context.getParentResourceComponent();
+ String myPath;
+ String parentPath = parentComponent.getPath();
+ if (parentPath.endsWith("/") || path.startsWith("/"))
+ myPath = parentPath + path;
+ else
+ myPath = parentPath + "/" + path;
+
+
+ JsonNode json = connection.getLevelData(myPath,true,false);
Configuration ret = new Configuration();
ObjectMapper mapper = new ObjectMapper();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 4cde830..b577407 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -19,6 +19,7 @@
package org.rhq.modules.plugins.jbossas7;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
@@ -89,6 +90,8 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String subPath = path.substring(i+1);
JsonNode subNode = json.findPath(subPath);
+ if (subNode==null || subNode.isNull())
+ subNode = json.get(subPath); // TODO clean this up. to get the 'key' in a path from the AS we need to use get()
Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
@@ -97,7 +100,9 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String key = entry.getKey();
Subsystem subsystem = entry.getValue();
String newPath = cpath.replaceAll("\\*",key);
- config.getSimple("path").setStringValue(newPath);
+ Configuration config2 = context.getDefaultPluginConfiguration();
+ PropertySimple pathProp = new PropertySimple("path",newPath);
+ config2.put(pathProp);
String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
@@ -109,7 +114,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
name, // Name
null, // Version
subsystem.description, // Description
- config,
+ config2,
null);
details.add(detail);
}
@@ -120,7 +125,10 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String resKey = path;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
- config.getSimple("path").setStringValue(path);
+ Configuration config2 = context.getDefaultPluginConfiguration();
+ PropertySimple pathProp = new PropertySimple("path",path);
+ config2.put(pathProp);
+
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
@@ -129,7 +137,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
name, // Name
null, // Version
path, // Description
- config,
+ config2,
null);
details.add(detail);
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 654ee06..8176e8a 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -96,7 +96,7 @@
<c:simple-property name="path" default="/profile/*" readOnly="true"/>
</plugin-configuration>
</server>
- <server name="ServerGroups"
+ <server name="ServerGroup"
description="Server groups on this domain"
discovery="SubsystemDiscovery"
class="BaseComponent">
@@ -283,54 +283,54 @@
</server>
- <service name="NetworkInterface"
- discovery="InterfaceDiscovery"
- class="BaseComponent"
- description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
+ <service name="NetworkInterface"
+ discovery="InterfaceDiscovery"
+ class="BaseComponent"
+ description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
- <runs-inside>
- <parent-resource-type name="Domain" plugin="jboss-as-7"/>
- <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
- </runs-inside>
+ <runs-inside>
+ <parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/"/>
- </plugin-configuration>
- </service>
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/"/>
+ </plugin-configuration>
+ </service>
- <service name="SocketBindingGroup"
- discovery="SocketBindingGroupDiscovery"
- class="BaseComponent"
- >
- <runs-inside>
- <parent-resource-type name="Domain" plugin="jboss-as-7"/>
- <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
- </runs-inside>
+ <service name="SocketBindingGroup"
+ discovery="SocketBindingGroupDiscovery"
+ class="BaseComponent"
+ >
+ <runs-inside>
+ <parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/socket-binding-group/"/>
- </plugin-configuration>
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/socket-binding-group/"/>
+ </plugin-configuration>
- <resource-configuration>
- <c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
- <!-- note: at domain level there is no port-offset -->
- <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
- <c:list-property name="include">
- <c:simple-property name="binding" displayName="Included bindings" description="Other bindings that are included in this one"/>
- </c:list-property>
- <c:list-property name="socket-binding">
- <c:map-property name="binding">
- <c:simple-property name="name" description="The name of the socket. Services which need to access the socket configuration information will find it using this name."/>
- <c:simple-property name="interface" description="Name of the interface to which the socket should be bound, or, for multicast sockets, the interface on which it should listen. This should be one of the declared interfaces." required="false"/>
- <c:simple-property name="port" description="Number of the port to which the socket should be bound." type="integer"/>
- <c:simple-property name="fixed-port" description="Whether the port value should remain fixed even if numeric offsets are applied to the other sockets in the socket group." type="boolean"/>
- <c:simple-property name="multicast-address" description="Multicast address on which the socket should receive multicast traffic. If unspecified, the socket will not be configured to receive multicast." />
- <c:simple-property name="multicast-port" description="Port on which the socket should receive multicast traffic. Must be configured if 'multicast-address' is configured." type="integer"/>
- </c:map-property>
- </c:list-property>
- </resource-configuration>
+ <resource-configuration>
+ <c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
+ <!-- note: at domain level there is no port-offset -->
+ <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
+ <c:list-property name="include">
+ <c:simple-property name="binding" displayName="Included bindings" description="Other bindings that are included in this one"/>
+ </c:list-property>
+ <c:list-property name="socket-binding">
+ <c:map-property name="binding">
+ <c:simple-property name="name" description="The name of the socket. Services which need to access the socket configuration information will find it using this name."/>
+ <c:simple-property name="interface" description="Name of the interface to which the socket should be bound, or, for multicast sockets, the interface on which it should listen. This should be one of the declared interfaces." required="false"/>
+ <c:simple-property name="port" description="Number of the port to which the socket should be bound." type="integer"/>
+ <c:simple-property name="fixed-port" description="Whether the port value should remain fixed even if numeric offsets are applied to the other sockets in the socket group." type="boolean"/>
+ <c:simple-property name="multicast-address" description="Multicast address on which the socket should receive multicast traffic. If unspecified, the socket will not be configured to receive multicast." />
+ <c:simple-property name="multicast-port" description="Port on which the socket should receive multicast traffic. Must be configured if 'multicast-address' is configured." type="integer"/>
+ </c:map-property>
+ </c:list-property>
+ </resource-configuration>
- </service>
+ </service>
</plugin>
commit cac8c1fe12745ceb5b72573800d27787bc6398c2
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 28 16:18:48 2011 +0200
Shuffle stuff around to support domain mode.
Add Domain discovery, improve handling of the "path" config element.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 64e575b..9407172 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -155,8 +155,14 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
for (PropertyDefinition propDef: configDef.getNonGroupedProperties()) {
JsonNode sub = json.findValue(propDef.getName());
if (propDef instanceof PropertyDefinitionSimple) {
- PropertySimple propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
- ret.put(propertySimple);
+ PropertySimple propertySimple;
+
+ if (sub!=null)
+ propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
+ else {
+ propertySimple = new PropertySimple(propDef.getName(),null); // TODO store it at all?
+ }
+ ret.put(propertySimple);
} else if (propDef instanceof PropertyDefinitionList) {
PropertyList propertyList = new PropertyList(propDef.getName());
PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
index e2d73c4..96737dd 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
@@ -1,23 +1,19 @@
package org.rhq.modules.plugins.jbossas7;
import java.io.File;
-import java.net.InetAddress;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.support.metadata.LocalVMTypeDescriptor;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ProcessScanResult;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
@@ -68,7 +64,7 @@ public class BaseDiscovery implements ResourceDiscoveryComponent
serverName = serverNameFull;
}
- String logFile = getLogFieFromCommandLine(commandLine);
+ String logFile = getLogFileFromCommandLine(commandLine);
initLogEventSourcesConfigProp(logFile,config);
String javaClazz = psr.getProcessInfo().getName();
@@ -118,7 +114,7 @@ public class BaseDiscovery implements ResourceDiscoveryComponent
//-Dorg.jboss.boot.log.file=/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/log/server-manager/boot.log
//-Dlogging.configuration=file:/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/configuration/logging.properties
- String getLogFieFromCommandLine(String[] commandLine) {
+ String getLogFileFromCommandLine(String[] commandLine) {
for (String line: commandLine) {
if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
new file mode 100644
index 0000000..ad09c77
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DomainDiscovery.java
@@ -0,0 +1,101 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.modules.plugins.jbossas7.json.Subsystem;
+
+/**
+ * Discover the domain
+ *
+ * @author Heiko W. Rupp
+ */
+@SuppressWarnings("unused")
+public class DomainDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
+ throws Exception {
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
+ mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
+
+ // TODO get next from some host.xml file
+ String host = "localhost";
+ String portString = "9990";
+ int port = Integer.parseInt(portString);
+ ASConnection connection = new ASConnection(host,port);
+
+
+ Configuration config = context.getDefaultPluginConfiguration();
+
+
+ // A domain has a server group so check for it.
+ boolean found = false;
+ JsonNode json = connection.getLevelData(null,null);
+ if (!connection.isErrorReply(json)) {
+
+ Iterator<String> fields = json.getFieldNames();
+ while (fields.hasNext()) {
+ String field = fields.next();
+ if (field.equals("server-group"))
+ found=true;
+
+ }
+
+ if (found) {
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ "Domain", // Key
+ "Domain", // Name
+ null, // Version
+ context.getResourceType().getDescription(), // Description
+ config,
+ null);
+ details.add(detail);
+ }
+
+ return details;
+ }
+
+ return Collections.emptySet();
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index a017194..4cde830 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -63,6 +63,8 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String cpath = config.getSimpleValue("path", null);
boolean recursive = false;
+ String parentPath = parentComponent.getPath();
+
String path;
if (cpath.endsWith("/*")) {
path = cpath.substring(0,cpath.length()-2);
@@ -71,6 +73,14 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
else
path = cpath;
+ if (parentPath!=null && !parentPath.isEmpty()) {
+ if (parentPath.endsWith("/") || path.startsWith("/"))
+ path = parentPath + path;
+ else
+ path = parentPath + "/" + path;
+ }
+ System.out.println("total path: [" + path + "]");
+
JsonNode json = connection.getLevelData(path,recursive, false);
if (!connection.isErrorReply(json)) {
@@ -86,6 +96,8 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String key = entry.getKey();
Subsystem subsystem = entry.getValue();
+ String newPath = cpath.replaceAll("\\*",key);
+ config.getSimple("path").setStringValue(newPath);
String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
@@ -108,6 +120,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String resKey = path;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+ config.getSimple("path").setStringValue(path);
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 54fd4cf..654ee06 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -51,7 +51,7 @@
version="4.0.0-SNAPSHOT"
>
- <depends plugin="JMX"/>
+ <depends plugin="JMX" useClasses="true"/>
<!-- TODO I think we should introduce an abstract AS7 plugin that contains some base functionality and then
@@ -78,18 +78,33 @@
<!-- TODO supply parameters and return values -->
</operation>
- <!--
- <server name="ProcessManager JVM"
- description="JVM of the ProcessManager"
- sourcePlugin="JMX"
- sourceType="JMX Server"
- discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
- class="org.rhq.plugins.jmx.JMXServerComponent"
- singleton="true"
- />
- -->
+
+ </server>
+
+ <server name="Domain"
+ discovery="DomainDiscovery"
+ class="BaseComponent"
+ description="An AS7 management profile">
+ <server name="Profile"
+ description="One profile in a domain"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent">
+
+ <plugin-configuration>
+ <c:simple-property name="path" default="/profile/*" readOnly="true"/>
+ </plugin-configuration>
+ </server>
+ <server name="ServerGroups"
+ description="Server groups on this domain"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent">
+ <plugin-configuration>
+ <c:simple-property name="path" default="/server-group/*" readOnly="true"/>
+ </plugin-configuration>
+
+ </server>
</server>
@@ -116,16 +131,7 @@
<operation name="dummyOperation">
<!-- TODO supply parameters and return values -->
</operation>
- <!--
- <server name="JBoss AS standalone JVM"
- description="JVM of the standalone JBossAS"
- sourcePlugin="JMX"
- sourceType="JMX Server"
- discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
- class="org.rhq.plugins.jmx.JMXServerComponent"
- singleton="true"
- />
- -->
+
<resource-configuration>
<c:list-property name="schema-locations" displayName="Schema locations">
@@ -139,89 +145,154 @@
</c:list-property>
</resource-configuration>
- <server name="Messaging"
- discovery="SubsystemDiscovery"
- class="BaseComponent"
- singleton="true"
+
+
+ </server>
+
+ <server name="JBossAS-Managed"
+ discovery="BaseDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="hostname" default="localhost" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" required="true"/>
+
+ &logSources;
+ </plugin-configuration>
+
+ <process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
+
+
+ <metric property="serverGroup" dataType="trait" displayType="summary" />
+ <resource-configuration>
+ <!--<c:group name="interfaces">-->
+ <c:simple-property name="loopback" default="127.0.0.1" />
+ <c:simple-property name="external" default="any" />
+ <c:simple-property name="public" default="any" />
+ <!--</c:group>-->
+ </resource-configuration>
+
+
+ </server>
+
+
+<!--
+ <server name="JBoss AS JVM"
+ description="JVM of the standalone JBossAS"
+ sourcePlugin="JMX"
+ sourceType="JMX Server"
+ discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
+ class="org.rhq.plugins.jmx.JMXServerComponent"
+ singleton="true"
+ >
+ <runs-inside>
+ <parent-resource-type name="JBossAS-Managed" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ <parent-resource-type name="ProcessController" plugin="jboss-as-7"/>
+ </runs-inside>
+ </server>
+-->
+
+ <server name="Messaging"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:simple-property name="journal-min-files" />
+ <c:simple-property name="journal-type" />
+ </resource-configuration>
+
+
+ <service name="Acceptor"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
+ <c:simple-property name="path" readOnly="true" default="/acceptor"/>
</plugin-configuration>
- <resource-configuration>
- <c:simple-property name="journal-min-files" />
- <c:simple-property name="journal-type" />
- </resource-configuration>
+ </service>
- <service name="Acceptor"
- discovery="SubsystemDiscovery"
- class="BaseComponent"
- >
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/messaging/acceptor"/>
- </plugin-configuration>
+ </server>
+ <server name="JBossWeb"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ singleton="true"
+ >
- </service>
+ <runs-inside>
+ <parent-resource-type name="Profile" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
- </server>
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/web"/>
+ </plugin-configuration>
- <server name="JBossWeb"
- discovery="SubsystemDiscovery"
- class="BaseComponent"
- singleton="true"
+ <service name="Connector"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
>
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/web"/>
+ <c:simple-property name="path" readOnly="true" default="/connector/*"/>
</plugin-configuration>
- <service name="Connector"
- discovery="SubsystemDiscovery"
- class="BaseComponent"
- >
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/web/connector/*"/>
- </plugin-configuration>
-
- <metric property="bytesSent" measurementType="trendsup"/>
- <metric property="bytesReceived" measurementType="trendsup"/>
- <metric property="processingTime" measurementType="trendsup"/>
- <metric property="errorCount" measurementType="trendsup"/>
- <metric property="maxTime" />
- <metric property="requestCount" measurementType="trendsup"/>
+ <metric property="bytesSent" measurementType="trendsup"/>
+ <metric property="bytesReceived" measurementType="trendsup"/>
+ <metric property="processingTime" measurementType="trendsup"/>
+ <metric property="errorCount" measurementType="trendsup"/>
+ <metric property="maxTime" />
+ <metric property="requestCount" measurementType="trendsup"/>
- <resource-configuration>
- <c:simple-property name="protocol" required="false" description="The web connector protocol."/>
- <c:simple-property name="socket-binding" required="false" description="The web connector socket-binding reference, this connector should be bound to."/>
- <c:simple-property name="scheme" required="false" description="The web connector scheme"/>
- </resource-configuration>
+ <resource-configuration>
+ <c:simple-property name="protocol" required="false" description="The web connector protocol."/>
+ <c:simple-property name="socket-binding" required="false" description="The web connector socket-binding reference, this connector should be bound to."/>
+ <c:simple-property name="scheme" required="false" description="The web connector scheme"/>
+ </resource-configuration>
- </service>
+ </service>
- <service name="VHost"
- discovery="SubsystemDiscovery"
- class="BaseComponent">
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/web/virtual-server/*"/>
- </plugin-configuration>
+ <service name="VHost"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent">
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/virtual-server/*"/>
+ </plugin-configuration>
- <resource-configuration>
- <c:simple-property name="access-log"/>
- <c:list-property name="alias" description="The virtual server aliases"/>
- <c:simple-property name="rewrite"/>
- </resource-configuration>
+ <resource-configuration>
+ <c:simple-property name="access-log"/>
+ <c:list-property name="alias" description="The virtual server aliases"/>
+ <c:simple-property name="rewrite"/>
+ </resource-configuration>
- </service>
+ </service>
- </server>
+ </server>
<service name="NetworkInterface"
discovery="InterfaceDiscovery"
class="BaseComponent"
description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
+
+ <runs-inside>
+ <parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/"/>
</plugin-configuration>
@@ -231,13 +302,23 @@
discovery="SocketBindingGroupDiscovery"
class="BaseComponent"
>
+ <runs-inside>
+ <parent-resource-type name="Domain" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
+ </runs-inside>
+
+
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/socket-binding-group/"/>
</plugin-configuration>
<resource-configuration>
<c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
+ <!-- note: at domain level there is no port-offset -->
<c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
+ <c:list-property name="include">
+ <c:simple-property name="binding" displayName="Included bindings" description="Other bindings that are included in this one"/>
+ </c:list-property>
<c:list-property name="socket-binding">
<c:map-property name="binding">
<c:simple-property name="name" description="The name of the socket. Services which need to access the socket configuration information will find it using this name."/>
@@ -252,41 +333,4 @@
</service>
-
- </server>
-
- <server name="JBossAS-Managed"
- discovery="BaseDiscovery"
- class="BaseComponent"
- >
- <plugin-configuration>
- <c:simple-property name="hostname" default="localhost" required="true"/>
- <c:simple-property name="port" default="9990" type="integer" required="true"/>
-
- &logSources;
- </plugin-configuration>
-
- <process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
-
-
- <metric property="serverGroup" dataType="trait" displayType="summary" />
- <resource-configuration>
- <!--<c:group name="interfaces">-->
- <c:simple-property name="loopback" default="127.0.0.1" />
- <c:simple-property name="external" default="any" />
- <c:simple-property name="public" default="any" />
- <!--</c:group>-->
- </resource-configuration>
-
- <server name="JBoss AS managed JVM"
- description="JVM of the managed JBossAS"
- sourcePlugin="JMX"
- sourceType="JMX Server"
- discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
- class="org.rhq.plugins.jmx.JMXServerComponent"
- singleton="true"
- />
-
- </server>
-
</plugin>
commit cab2192295a5186955f23713b763e32b6e64c8bc
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 25 17:39:22 2011 +0100
Convert extensions to a list of simple props.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 8d3a7a8..64e575b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -247,6 +247,16 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
}
}
+ else if (memberDefinition instanceof PropertyDefinitionSimple) {
+ String name = memberDefinition.getName();
+ Iterator<String> keys = sub.getFieldNames();
+ while(keys.hasNext()) {
+ String entryKey = keys.next();
+
+ PropertySimple propertySimple = new PropertySimple(name,entryKey);
+ propertyList.add(propertySimple);
+ }
+ }
ret.put(propertyList);
}
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 6a00d57..54fd4cf 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -135,9 +135,7 @@
</c:map-property>
</c:list-property>
<c:list-property name="extension" displayName="Installed extensions">
- <c:map-property name="extension">
- <c:simple-property name="name" readOnly="true"/>
- </c:map-property>
+ <c:simple-property name="name" readOnly="true"/>
</c:list-property>
</resource-configuration>
commit 73ebc9d575c836294ac6f45df3e662c325def109
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 25 17:00:06 2011 +0100
Support /extension and /schema-locations as resource config on AS
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 50bd98d..c626c49 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -194,7 +194,6 @@ public class ASConnection {
while ((line = in.readLine()) != null) {
builder.append(line);
}
-// System.out.println(builder.toString());
in.close();
}
else {
@@ -207,11 +206,12 @@ public class ASConnection {
while ((line = br.readLine()) != null) {
builder.append(line);
}
-// System.out.println(builder.toString());
br.close();
}
}
- JsonNode operationResult = mapper.readTree(builder.toString());
+ String outcome = builder.toString();
+ System.out.println("==> " + outcome);
+ JsonNode operationResult = mapper.readTree(outcome);
return operationResult;
} catch (IOException e) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index a4c388f..8d3a7a8 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -21,6 +21,7 @@ package org.rhq.modules.plugins.jbossas7;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
@@ -45,8 +46,10 @@ import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -61,7 +64,6 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
String path;
String key;
-
/**
* Return availability of this resource
* @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability()
@@ -145,9 +147,10 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- JsonNode json = connection.getLevelData(key,true,false); // TODO path ? key?
+ JsonNode json = connection.getLevelData(path,true,false); // TODO path ? key?
Configuration ret = new Configuration();
+ ObjectMapper mapper = new ObjectMapper();
for (PropertyDefinition propDef: configDef.getNonGroupedProperties()) {
JsonNode sub = json.findValue(propDef.getName());
@@ -156,7 +159,8 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
ret.put(propertySimple);
} else if (propDef instanceof PropertyDefinitionList) {
PropertyList propertyList = new PropertyList(propDef.getName());
- if (((PropertyDefinitionList) propDef).getMemberDefinition()==null) {
+ PropertyDefinition memberDefinition = ((PropertyDefinitionList) propDef).getMemberDefinition();
+ if (memberDefinition ==null) {
Iterator<JsonNode> values = sub.getElements();
while (values.hasNext()) {
JsonNode node = values.next();
@@ -165,20 +169,82 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
propertyList.add(propertySimple);
}
}
- else if (((PropertyDefinitionList) propDef).getMemberDefinition() instanceof PropertyDefinitionMap) {
- Iterator<String> entries = sub.getFieldNames();
- while (entries.hasNext()) {
- String entryKey = entries.next();
- JsonNode node = sub.findPath(entryKey);
- PropertyMap map = new PropertyMap(((PropertyDefinitionList) propDef).getMemberDefinition().getName()); // TODO : name from def or 'entryKey' ?
- Iterator<String> fields = node.getFieldNames(); // TODO loop over fields from map and not from json
- while (fields.hasNext()) {
- String key = fields.next();
-
- PropertySimple propertySimple = new PropertySimple(key,node.findValue(key).getValueAsText());
- map.put(propertySimple);
+ else if (memberDefinition instanceof PropertyDefinitionMap) {
+ PropertySimple propertySimple;
+
+ if (sub.isArray()) {
+ Iterator<JsonNode> entries = sub.getElements();
+ while (entries.hasNext()) {
+ JsonNode entry = entries.next(); // -> one row in the list i.e. one map
+
+ // Distinguish here?
+
+ PropertyMap map = new PropertyMap(memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
+ Iterator<JsonNode> fields = entry.getElements(); // TODO loop over fields from map and not from json
+ while (fields.hasNext()) {
+ JsonNode field = fields.next();
+ if (field.isObject()) {
+ // TODO only works for tuples at the moment - migrate to some different kind of parsing!
+ PROPERTY_VALUE prop = mapper.readValue(field,PROPERTY_VALUE.class);
+ // now need to find the names of the properties
+ List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
+ if (defList.isEmpty())
+ throw new IllegalArgumentException("Map " + memberDefinition.getName() + " has no members");
+ String key = defList.get(0).getName();
+ String value = prop.getKey();
+ propertySimple = new PropertySimple(key,value);
+ map.put(propertySimple);
+ if (defList.size()>1) {
+ key = defList.get(1).getName();
+ value = prop.getValue();
+ propertySimple = new PropertySimple(key,value);
+ map.put(propertySimple);
+
+ }
+ } else { // TODO reached?
+ String key = field.getValueAsText();
+ if (key.equals("PROPERTY_VALUE")) { // TODO this may change in the future in the AS implementation
+ JsonNode pv = entry.findValue(key);
+ String k = pv.toString();
+ String v = pv.getValueAsText();
+ propertySimple = new PropertySimple(k,v);
+ map.put(propertySimple);
+
+ }
+ else {
+ propertySimple = new PropertySimple(key,entry.findValue(key).getValueAsText());
+ map.put(propertySimple);
+
+ }
+ }
+ }
+ propertyList.add(map);
+ }
+ }
+ else if (sub.isObject()) {
+ Iterator<String> keys = sub.getFieldNames();
+ while(keys.hasNext()) {
+ String entryKey = keys.next();
+
+ JsonNode node = sub.findPath(entryKey);
+ PropertyMap map = new PropertyMap(memberDefinition.getName()); // TODO : name from def or 'entryKey' ?
+ if (node.isObject()) {
+ Iterator<String> fields = node.getFieldNames(); // TODO loop over fields from map and not from json
+ while (fields.hasNext()) {
+ String key = fields.next();
+
+ propertySimple = new PropertySimple(key,node.findValue(key).getValueAsText());
+ map.put(propertySimple);
+ }
+ propertyList.add(map);
+ } else if (sub.isNull()) {
+ List<PropertyDefinition> defList = ((PropertyDefinitionMap) memberDefinition).getSummaryPropertyDefinitions();
+ String key = defList.get(0).getName();
+ propertySimple = new PropertySimple(key,entryKey);
+ map.put(propertySimple);
+ }
}
- propertyList.add(map);
+
}
}
ret.put(propertyList);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
index 571dbab..e2d73c4 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
@@ -67,17 +67,6 @@ public class BaseDiscovery implements ResourceDiscoveryComponent
if (serverName.isEmpty())
serverName = serverNameFull;
-// DomainClient client = DomainClient.Factory.create(InetAddress.getByName("localhost"),9990); //
-// Map<ServerIdentity,ServerStatus> serverStatuses = client.getServerStatuses();
-// for (Map.Entry<ServerIdentity,ServerStatus> entry : serverStatuses.entrySet()) {
-// ServerIdentity identity = entry.getKey();
-// ServerStatus status = entry.getValue();
-// if (identity.getServerName().equals(serverName)) {
-// String serverGroupName = identity.getServerGroupName();
-// config.put(new PropertySimple("server-group",serverGroupName));
-// }
-//
-// }
}
String logFile = getLogFieFromCommandLine(commandLine);
initLogEventSourcesConfigProp(logFile,config);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
index fdc04c6..f145aa6 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
@@ -30,6 +30,8 @@ public class NameValuePair {
public String name;
public String value;
+ public NameValuePair() {}
+
public NameValuePair(String name, String value) {
this.name = name;
this.value = value;
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 7abbfeb..6a00d57 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -127,9 +127,25 @@
/>
-->
+ <resource-configuration>
+ <c:list-property name="schema-locations" displayName="Schema locations">
+ <c:map-property name="location">
+ <c:simple-property name="urn" readOnly="true"/>
+ <c:simple-property name="location" readOnly="true"/>
+ </c:map-property>
+ </c:list-property>
+ <c:list-property name="extension" displayName="Installed extensions">
+ <c:map-property name="extension">
+ <c:simple-property name="name" readOnly="true"/>
+ </c:map-property>
+ </c:list-property>
+ </resource-configuration>
+
<server name="Messaging"
discovery="SubsystemDiscovery"
- class="BaseComponent">
+ class="BaseComponent"
+ singleton="true"
+ >
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
</plugin-configuration>
@@ -156,6 +172,7 @@
<server name="JBossWeb"
discovery="SubsystemDiscovery"
class="BaseComponent"
+ singleton="true"
>
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/subsystem/web"/>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
index 4082612..4909595 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -51,13 +51,12 @@ public class OperationJsonTest {
String result = mapper.writeValueAsString(operation);
- System.out.println(operation);
- System.out.println(result);
-
Operation op = mapper.readValue(result,Operation.class);
assert op.getOperation().equals(operation.getOperation()) : "Operation is " + op.getOperation();
assert op.getName().equals("socket-binding") : "attribute name is " + op.getName();
assert op.getValue().equals("jndi") : "attribute value is " + op.getValue();
+ assert op.getAddress().size()==2 : "Address did not contain 2 parts, but " + op.getAddress().size();
+
}
commit 8256274472de89eeb3f733de08ff79740d7fca7e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 25 13:17:55 2011 +0100
Improve support for execute operations on AS
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 663df43..50bd98d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -51,6 +51,7 @@ public class ASConnection {
private String host;
URL url;
String urlString;
+ private StringBuilder builder;
public ASConnection(String host, int port) {
this.host = host;
@@ -157,18 +158,23 @@ public class ASConnection {
return false;
}
- public void execute(String path, String operationName, NameValuePair nvp) {
+ /**
+ * Execute an operation against the domain api
+ * @param path Node to manipulate
+ * @param operationName operation to run
+ * @param attributeValue attribute-name-value pair
+ */
+ public JsonNode execute(String path, String operationName, NameValuePair attributeValue) {
try {
- URL url = getBaseUrl(path,"operation="+operationName);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
-// conn.setRequestMethod("POST");
+ conn.setRequestMethod("POST");
OutputStream out = conn.getOutputStream();
ObjectMapper mapper = new ObjectMapper();
- Operation operation = new Operation(operationName,pathToAddress(path),nvp);
+ Operation operation = new Operation(operationName,pathToAddress(path),attributeValue);
String result = mapper.writeValueAsString(operation);
System.out.println("Json to send: " + result);
@@ -184,17 +190,35 @@ public class ASConnection {
BufferedReader in = new BufferedReader(new InputStreamReader(
inputStream));
String line;
- StringBuilder builder = new StringBuilder();
+ builder = new StringBuilder();
while ((line = in.readLine()) != null) {
builder.append(line);
}
- System.out.println(builder.toString());
+// System.out.println(builder.toString());
+ in.close();
}
+ else {
+ System.out.println(conn.getResponseCode());
+ InputStream errorStream = conn.getErrorStream();
+ if (errorStream!=null) {
+ BufferedReader br = new BufferedReader(new InputStreamReader(errorStream));
+ String line;
+ builder = new StringBuilder();
+ while ((line = br.readLine()) != null) {
+ builder.append(line);
+ }
+// System.out.println(builder.toString());
+ br.close();
+ }
+ }
+ JsonNode operationResult = mapper.readTree(builder.toString());
+ return operationResult;
} catch (IOException e) {
e.printStackTrace(); // TODO: Customise this generated block
}
+ return null;
}
private List<PROPERTY_VALUE> pathToAddress(String path) {
@@ -237,4 +261,9 @@ public class ASConnection {
return url2;
}
+ public String getFailureDescription(JsonNode jsonNode) {
+ JsonNode node = jsonNode.findValue("failure-description");
+ return node.getValueAsText();
+
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index ad3516e..a4c388f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
@@ -195,10 +196,12 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
for (Map.Entry<String, PropertySimple> entry : conf.getSimpleProperties().entrySet()) {
NameValuePair nvp = new NameValuePair(entry.getKey(),entry.getValue().getStringValue());
- connection.execute(path,"write-attribute",nvp);
+ JsonNode result= connection.execute(key,"write-attribute",nvp); // TODO path / key handling
+ if(connection.isErrorReply(result)) {
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ report.setErrorMessage(connection.getFailureDescription(result));
+ }
}
-
- // TODO: Customise this generated block
}
}
commit 0b87441a0a79ca22d01456a293213902b001795b
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 25 12:00:32 2011 +0100
Implement serialization and deserialization of Operation to/from json.
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index ef75ab7..38cdfa0 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -30,8 +30,8 @@
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
- <source>1.5</source>
- <target>1.5</target>
+ <source>1.6</source>
+ <target>1.6</target>
</configuration>
</plugin>
<plugin>
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 0fb28b1..663df43 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -35,8 +35,8 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.jetbrains.annotations.Nullable;
-import org.omg.CORBA.NamedValue;
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import org.rhq.modules.plugins.jbossas7.json.Operation;
@@ -157,10 +157,10 @@ public class ASConnection {
return false;
}
- public void execute(String path, String s, NameValuePair nvp) {
+ public void execute(String path, String operationName, NameValuePair nvp) {
try {
- URL url = getBaseUrl(path,"operation="+s);
+ URL url = getBaseUrl(path,"operation="+operationName);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
// conn.setRequestMethod("POST");
@@ -168,11 +168,7 @@ public class ASConnection {
ObjectMapper mapper = new ObjectMapper();
- Operation operation = new Operation();
- operation.operation=s;
- operation.nvp=nvp;
- operation.address=pathToAddress(path);
-
+ Operation operation = new Operation(operationName,pathToAddress(path),nvp);
String result = mapper.writeValueAsString(operation);
System.out.println("Json to send: " + result);
@@ -201,17 +197,17 @@ public class ASConnection {
}
- private List<NameValuePair> pathToAddress(String path) {
+ private List<PROPERTY_VALUE> pathToAddress(String path) {
if (path.endsWith("/"))
path = path.substring(0,path.length()-1);
if (path.startsWith("/"))
path = path.substring(1);
- List<NameValuePair> result = new ArrayList<NameValuePair>();
+ List<PROPERTY_VALUE> result = new ArrayList<PROPERTY_VALUE>();
String[] components = path.split("/");
for (int i = 0; i < components.length ; i+=2) {
- NameValuePair valuePair = new NameValuePair(components[i],components[i+1]);
+ PROPERTY_VALUE valuePair = new PROPERTY_VALUE(components[i],components[i+1]);
result.add(valuePair);
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
index ff3f10c..fdc04c6 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
@@ -18,6 +18,7 @@
*/
package org.rhq.modules.plugins.jbossas7.json;
+import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonValue;
/**
@@ -34,9 +35,4 @@ public class NameValuePair {
this.value = value;
}
- @JsonValue
- @Override
- public String toString() {
- return name +":"+ value ;
- }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index 4f5cda1..642b41f 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -18,8 +18,11 @@
*/
package org.rhq.modules.plugins.jbossas7.json;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonValue;
/**
@@ -28,20 +31,99 @@ import org.codehaus.jackson.annotate.JsonValue;
*/
public class Operation {
- public String operation;
- public List<NameValuePair> address;
+ public Operation(String operation, List<PROPERTY_VALUE> address, NameValuePair payload) {
+ this.operation = operation;
+ this.address = address;
+ this.name = payload.name;
+ this.value = payload.value;
+ }
+
+ public Operation() {
+ // needed for Jackson
+ }
+
+ private String operation;
+ @JsonProperty
+ private List<PROPERTY_VALUE> address = Collections.emptyList();
+
+ private String name;
+ private String value;
+
+ public String getOperation() {
+ return operation;
+ }
+
+ public void setOperation(String operation) {
+ this.operation = operation;
+ }
- public NameValuePair nvp;
+ public List<PROPERTY_VALUE> getAddress() {
+ return address;
+ }
+
+ public void setAddress(List<PROPERTY_VALUE> address) {
+ this.address = address;
+ }
- @JsonValue
- public String toString() {
- StringBuilder b = new StringBuilder();
- b.append("{");
- b.append("operation:").append(operation).append(",\n");
- b.append("address:").append(address).append(",\n");
- b.append(nvp);
- b.append("}");
- return b.toString();
+ public List<PROPERTY_VALUE> addToAddress(PROPERTY_VALUE component) {
+ if (address==null)
+ address = new ArrayList<PROPERTY_VALUE>();
+ address.add(component);
+ return address;
}
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /*
+ [localhost:9999 /subsystem=web/connector=http] :write-attribute(name=socket-binding,value=jndi)
+ yield JSON to send:
+ {
+ "operation" : "write-attribute",
+ "name" : "socket-binding",
+ "value" : "jndi",
+ "address" : [
+ {
+ "PROPERTY_VALUE" : {
+ "subsystem" : "web"
+ }
+ },
+ {
+ "PROPERTY_VALUE" : {
+ "connector" : "http"
+ }
+ }
+ ]
+ }
+ */
+
+// @JsonValue
+// public String toString() {
+// StringBuilder b = new StringBuilder();
+// b.append('{');
+// b.append("\"operation\":\"").append(operation).append("\",");
+// b.append("\"address\":");
+// if (address!=null && !address.isEmpty())
+// b.append(address);
+// else
+// b.append("[]");
+// b.append(',');
+// b.append(payload);
+// b.append("}");
+// return b.toString();
+// }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java
new file mode 100644
index 0000000..b2c8223
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/PROPERTY_VALUE.java
@@ -0,0 +1,62 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonValue;
+import org.codehaus.jackson.map.annotate.JsonDeserialize;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import org.rhq.modules.plugins.jbossas7.json.serializer.PropertyValueDeserializer;
+import org.rhq.modules.plugins.jbossas7.json.serializer.PropertyValueSerializer;
+
+/**
+ * @author Heiko W. Rupp
+ */
+@JsonSerialize(using = PropertyValueSerializer.class)
+@JsonDeserialize(using = PropertyValueDeserializer.class)
+public class PROPERTY_VALUE implements Serializable{
+
+ private String key;
+ private String value;
+
+ public PROPERTY_VALUE(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueDeserializer.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueDeserializer.java
new file mode 100644
index 0000000..11e6ae3
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueDeserializer.java
@@ -0,0 +1,53 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json.serializer;
+
+import java.io.IOException;
+import java.lang.ref.PhantomReference;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Deserialize {"foo":"bar"} into a PROPERTY_VALUE
+ * @author Heiko W. Rupp
+ */
+public class PropertyValueDeserializer extends JsonDeserializer<PROPERTY_VALUE> {
+
+
+ @Override
+ public PROPERTY_VALUE deserialize(JsonParser jsonParser,
+ DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+
+ String tmp = jsonParser.getText(); // {
+ jsonParser.nextToken();
+ String key = jsonParser.getText();
+ jsonParser.nextToken();
+ String value = jsonParser.getText();
+ jsonParser.nextToken();
+ tmp = jsonParser.getText(); // }
+
+ PROPERTY_VALUE pv = new PROPERTY_VALUE(key,value);
+ return pv;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueSerializer.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueSerializer.java
new file mode 100644
index 0000000..e7dda18
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/serializer/PropertyValueSerializer.java
@@ -0,0 +1,45 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json.serializer;
+
+import java.io.IOException;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+
+/**
+ * Serialize the key/value pair from PROPERTY_VALUE into {"value of key":"value of value"}
+ * @author Heiko W. Rupp
+ */
+public class PropertyValueSerializer extends JsonSerializer<PROPERTY_VALUE> {
+
+ @Override
+ public void serialize(PROPERTY_VALUE property_value, JsonGenerator jsonGenerator,
+ SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
+
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeFieldName(property_value.getKey());
+ jsonGenerator.writeString(property_value.getValue());
+ jsonGenerator.writeEndObject();
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
new file mode 100644
index 0000000..4082612
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/OperationJsonTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.testng.annotations.Test;
+
+import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE;
+import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
+
+/**
+ * @author Heiko W. Rupp
+ */
+@Test
+public class OperationJsonTest {
+
+
+ public void operationSerDeserTest() throws Exception{
+
+ List<PROPERTY_VALUE> address=new ArrayList<PROPERTY_VALUE>(2);
+ PROPERTY_VALUE part = new PROPERTY_VALUE("subsystem","web");
+ address.add(part);
+ part = new PROPERTY_VALUE("connector","http");
+ address.add(part);
+
+ NameValuePair payload = new NameValuePair("socket-binding","jndi");
+ Operation operation = new Operation("write-attribute",address,payload);
+
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String result = mapper.writeValueAsString(operation);
+
+ System.out.println(operation);
+ System.out.println(result);
+
+ Operation op = mapper.readValue(result,Operation.class);
+ assert op.getOperation().equals(operation.getOperation()) : "Operation is " + op.getOperation();
+ assert op.getName().equals("socket-binding") : "attribute name is " + op.getName();
+ assert op.getValue().equals("jndi") : "attribute value is " + op.getValue();
+
+ }
+
+ public void propertyValueDeserTest() throws Exception {
+
+ String json = "{\"myKey\":\"myValue\"}";
+
+ ObjectMapper mapper = new ObjectMapper();
+ PROPERTY_VALUE pv = mapper.readValue(json,PROPERTY_VALUE.class);
+
+ assert pv.getKey().equals("myKey") : "Key is " + pv.getKey();
+ assert pv.getValue().equals("myValue"): "Value is " + pv.getValue();
+ }
+}
commit 4c3726f4046e43d05e96cb71e413c6e6356db298
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 24 13:13:49 2011 +0100
Support reading metrics.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index c136b20..0fb28b1 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -130,6 +130,11 @@ public class ASConnection {
return tree;
}
+ JsonNode getAttributeValue(@Nullable String base, @Nullable String attributeName) throws Exception {
+ String op = "operation=attribute&name=" + attributeName;
+ return getLevelData(base,op);
+ }
+
boolean isErrorReply(JsonNode in) {
if (in.has("outcome")) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index f700597..ad3516e 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -23,7 +23,6 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
@@ -44,13 +43,9 @@ import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
-import org.rhq.core.pluginapi.operation.OperationContext;
-import org.rhq.core.pluginapi.operation.OperationFacet;
-import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -117,26 +112,24 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
/**
* Gather measurement data
- * @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set)
+ * @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set)
*/
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
- JsonNode obj = connection.getLevelData(key,false,true);
for (MeasurementScheduleRequest req : metrics) {
- if (obj.has(req.getName())) {
-/*
- String val = obj.getString(req.getName());
- if (req.getDataType()== DataType.MEASUREMENT) {
-
- Double d = Double.parseDouble(val);
- MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
- report.addData(data);
- } else if (req.getDataType()== DataType.TRAIT) {
- MeasurementDataTrait data = new MeasurementDataTrait(req,val);
- report.addData(data);
- }
-*/
+
+ JsonNode obj = connection.getAttributeValue(key, req.getName()); // TODO batching
+
+ String val = obj.getValueAsText();
+ if (req.getDataType()== DataType.MEASUREMENT) {
+
+ Double d = Double.parseDouble(val);
+ MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
+ report.addData(data);
+ } else if (req.getDataType()== DataType.TRAIT) {
+ MeasurementDataTrait data = new MeasurementDataTrait(req,val);
+ report.addData(data);
}
}
}
commit bbee70600f8faf000892e14a5fdea2a749f0bfb6
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 24 09:49:46 2011 +0100
Bindings are now a list of maps within the binding group.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 28c0592..f700597 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -25,10 +25,12 @@ import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
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.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -149,7 +151,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- JsonNode json = connection.getLevelData(key,false,false); // TODO path ? key?
+ JsonNode json = connection.getLevelData(key,true,false); // TODO path ? key?
Configuration ret = new Configuration();
@@ -160,12 +162,30 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
ret.put(propertySimple);
} else if (propDef instanceof PropertyDefinitionList) {
PropertyList propertyList = new PropertyList(propDef.getName());
- Iterator<JsonNode> values = sub.getElements();
- while (values.hasNext()) {
- JsonNode node = values.next();
- String value = node.getTextValue();
- PropertySimple propertySimple = new PropertySimple(propDef.getName(),value);
- propertyList.add(propertySimple);
+ if (((PropertyDefinitionList) propDef).getMemberDefinition()==null) {
+ Iterator<JsonNode> values = sub.getElements();
+ while (values.hasNext()) {
+ JsonNode node = values.next();
+ String value = node.getTextValue();
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(),value);
+ propertyList.add(propertySimple);
+ }
+ }
+ else if (((PropertyDefinitionList) propDef).getMemberDefinition() instanceof PropertyDefinitionMap) {
+ Iterator<String> entries = sub.getFieldNames();
+ while (entries.hasNext()) {
+ String entryKey = entries.next();
+ JsonNode node = sub.findPath(entryKey);
+ PropertyMap map = new PropertyMap(((PropertyDefinitionList) propDef).getMemberDefinition().getName()); // TODO : name from def or 'entryKey' ?
+ Iterator<String> fields = node.getFieldNames(); // TODO loop over fields from map and not from json
+ while (fields.hasNext()) {
+ String key = fields.next();
+
+ PropertySimple propertySimple = new PropertySimple(key,node.findValue(key).getValueAsText());
+ map.put(propertySimple);
+ }
+ propertyList.add(map);
+ }
}
ret.put(propertyList);
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingDiscovery.java
deleted file mode 100644
index c9b7a5e..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingDiscovery.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.modules.plugins.jbossas7;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.modules.plugins.jbossas7.json.Domain;
-import org.rhq.modules.plugins.jbossas7.json.SocketBindingGroup;
-
-/**
- * Discover single bindings in a socket binding group
- *
- * TODO: Is this better a resource-configuration on the parent?
- *
- * @author Heiko W. Rupp
- */
-@SuppressWarnings("unused")
-public class SocketBindingDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
- throws Exception {
-
- Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
-
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
- mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
-
- BaseComponent parentComponent = context.getParentResourceComponent();
- ASConnection connection = parentComponent.getASConnection();
-
- String path = parentComponent.getPath();
-
-
- JsonNode json = connection.getLevelData(path,true,false);
- if (!connection.isErrorReply(json)) {
-
- SocketBindingGroup bindingGroup = mapper.readValue(json, new TypeReference<SocketBindingGroup>() {});
- // TODO put bindingGroup. {name, default-interface, port-offset into parent
-
-
- for (Map.Entry<String,SocketBindingGroup.Binding> entry: bindingGroup.bindings.entrySet()) {
-
- String key = entry.getKey();
- String cpath = path + "/socket-binding/" + key;
-
-
- String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
- String name = resKey.substring(resKey.lastIndexOf("/") + 1);
-
- Configuration config = context.getDefaultPluginConfiguration();
-
- PropertySimple propertySimple = new PropertySimple("path",cpath);
- config.put(propertySimple);
-
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- path, // Key
- name, // Name
- null, // Version
- "Binding Group", // Description
- config,
- null);
- details.add(detail);
- log.info("Added " + detail);
- }
-
- return details;
-
- }
-
- return Collections.emptySet();
- }
-
-}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 9a04f04..7abbfeb 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -223,16 +223,18 @@
<resource-configuration>
<c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
<c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
+ <c:list-property name="socket-binding">
+ <c:map-property name="binding">
+ <c:simple-property name="name" description="The name of the socket. Services which need to access the socket configuration information will find it using this name."/>
+ <c:simple-property name="interface" description="Name of the interface to which the socket should be bound, or, for multicast sockets, the interface on which it should listen. This should be one of the declared interfaces." required="false"/>
+ <c:simple-property name="port" description="Number of the port to which the socket should be bound." type="integer"/>
+ <c:simple-property name="fixed-port" description="Whether the port value should remain fixed even if numeric offsets are applied to the other sockets in the socket group." type="boolean"/>
+ <c:simple-property name="multicast-address" description="Multicast address on which the socket should receive multicast traffic. If unspecified, the socket will not be configured to receive multicast." />
+ <c:simple-property name="multicast-port" description="Port on which the socket should receive multicast traffic. Must be configured if 'multicast-address' is configured." type="integer"/>
+ </c:map-property>
+ </c:list-property>
</resource-configuration>
- <service name="SocketBinding"
- discovery="SocketBindingDiscovery"
- class="BaseComponent">
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true"/>
- </plugin-configuration>
-
- </service>
</service>
commit 296dba2916369ca75012995cbf7aa1863745e9b0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 23 21:19:19 2011 +0100
Fix naming for 'singleton' subsystems
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 75683cb..a017194 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -106,7 +106,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
else {
- String resKey = context.getParentResourceContext().getResourceKey();
+ String resKey = path;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
commit 3a14db1b4c745bd66b863f872c3fd062bb296f9f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 23 21:09:45 2011 +0100
SubsystemComponent is (currently) not needed.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java
index abf6d35..d23cd5d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java
@@ -28,9 +28,9 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
*
* @author Heiko W. Rupp
*/
-public class DatasourceComponent implements ResourceComponent<SubsystemComponent> {
+public class DatasourceComponent implements ResourceComponent<BaseComponent> {
- public void start(ResourceContext<SubsystemComponent> subsystemComponentResourceContext) throws InvalidPluginConfigurationException, Exception {
+ public void start(ResourceContext<BaseComponent> subsystemComponentResourceContext) throws InvalidPluginConfigurationException, Exception {
// TODO: Customise this generated block
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
index d756543..e205c29 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
@@ -32,9 +32,9 @@ import java.util.Set;
*
* @author Heiko W. Rupp
*/
-public class DatasourceDiscovery implements ResourceDiscoveryComponent<SubsystemComponent> {
+public class DatasourceDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<SubsystemComponent> discoveryContext) throws InvalidPluginConfigurationException, Exception {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> discoveryContext) throws InvalidPluginConfigurationException, Exception {
/*
if (subsys instanceof DataSourcesSubsystemElement) {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemComponent.java
deleted file mode 100644
index 09d753c..0000000
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemComponent.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.modules.plugins.jbossas7;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
-import org.rhq.core.pluginapi.inventory.ResourceComponent;
-import org.rhq.core.pluginapi.inventory.ResourceContext;
-
-/**
- * Resource component for subsystems
- *
- * Deprecated - use BaseComponent
- * @author Heiko W. Rupp
- */
-@Deprecated
-public class SubsystemComponent implements ResourceComponent<BaseComponent> {
-
- ResourceContext<BaseComponent> context;
- Configuration config;
- String path;
- String key ;
-
- public void start(ResourceContext<BaseComponent> context) throws InvalidPluginConfigurationException, Exception {
- this.config = context.getPluginConfiguration();
- path = config.getSimpleValue("path", null);
- this.context = context;
- key = context.getResourceKey();
-
- }
-
- public void stop() {
- // TODO: Customise this generated block
- }
-
- public AvailabilityType getAvailability() {
- return AvailabilityType.UP; // TODO: Customise this generated block
- }
-
-
-}
commit f70a35bfea7d230783b3079a2d16edcf0b60adb0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 23 16:47:25 2011 +0100
Include more items and allow for reading of list properties.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 005421d..c136b20 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -23,17 +23,22 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.jetbrains.annotations.Nullable;
+import org.omg.CORBA.NamedValue;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import org.rhq.modules.plugins.jbossas7.json.Operation;
/**
* Provide connections to the AS and reading / writing date from/to it.
@@ -83,7 +88,7 @@ public class ASConnection {
* Return the JSON-Ojbect for a certain path.
*
* @param base Path to the object/subsystem. Can be null/"" for the base objects
- * @param ops Operation to run on the api can be null
+ * @param ops OperationDescription to run on the api can be null
* @return A JSONObject encoding the level plus sub levels provided
* @throws Exception If anything goes wrong
*/
@@ -151,21 +156,62 @@ public class ASConnection {
try {
URL url = getBaseUrl(path,"operation="+s);
- URLConnection conn = url.openConnection();
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setDoOutput(true);
+// conn.setRequestMethod("POST");
OutputStream out = conn.getOutputStream();
ObjectMapper mapper = new ObjectMapper();
- mapper.writeValue(out,nvp);
+
+ Operation operation = new Operation();
+ operation.operation=s;
+ operation.nvp=nvp;
+ operation.address=pathToAddress(path);
+
+
+ String result = mapper.writeValueAsString(operation);
+ System.out.println("Json to send: " + result);
+ mapper.writeValue(out, operation);
+
out.flush();
out.close();
+
+ InputStream inputStream;
+ if (conn.getResponseCode()==HttpURLConnection.HTTP_OK) {
+ inputStream = conn.getInputStream();
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ inputStream));
+ String line;
+ StringBuilder builder = new StringBuilder();
+ while ((line = in.readLine()) != null) {
+ builder.append(line);
+ }
+ System.out.println(builder.toString());
+ }
+
} catch (IOException e) {
e.printStackTrace(); // TODO: Customise this generated block
}
}
+ private List<NameValuePair> pathToAddress(String path) {
+ if (path.endsWith("/"))
+ path = path.substring(0,path.length()-1);
+ if (path.startsWith("/"))
+ path = path.substring(1);
+ List<NameValuePair> result = new ArrayList<NameValuePair>();
+ String[] components = path.split("/");
+ for (int i = 0; i < components.length ; i+=2) {
+ NameValuePair valuePair = new NameValuePair(components[i],components[i+1]);
+ result.add(valuePair);
+ }
+
+ return result;
+ }
private URL getBaseUrl(String base, String ops) throws MalformedURLException {
String spec;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index ca746e0..28c0592 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -24,9 +24,12 @@ import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
@@ -44,6 +47,8 @@ import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -144,14 +149,26 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet, Confi
public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
- JsonNode json = connection.getLevelData(path,false,false);
+ JsonNode json = connection.getLevelData(key,false,false); // TODO path ? key?
Configuration ret = new Configuration();
for (PropertyDefinition propDef: configDef.getNonGroupedProperties()) {
JsonNode sub = json.findValue(propDef.getName());
- PropertySimple propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
- ret.put(propertySimple);
+ if (propDef instanceof PropertyDefinitionSimple) {
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
+ ret.put(propertySimple);
+ } else if (propDef instanceof PropertyDefinitionList) {
+ PropertyList propertyList = new PropertyList(propDef.getName());
+ Iterator<JsonNode> values = sub.getElements();
+ while (values.hasNext()) {
+ JsonNode node = values.next();
+ String value = node.getTextValue();
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(),value);
+ propertyList.add(propertySimple);
+ }
+ ret.put(propertyList);
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
index 83d0e3e..571dbab 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
@@ -61,7 +61,11 @@ public class BaseDiscovery implements ResourceDiscoveryComponent
serverNameFull = "ASManager";
} else {
serverNameFull = getBaseDirFromCommandLine(commandLine);
+ if (serverNameFull==null || serverNameFull.isEmpty())
+ serverNameFull="JBossAS7";
serverName = serverNameFull.substring(serverNameFull.lastIndexOf("/")+1);
+ if (serverName.isEmpty())
+ serverName = serverNameFull;
// DomainClient client = DomainClient.Factory.create(InetAddress.getByName("localhost"),9990); //
// Map<ServerIdentity,ServerStatus> serverStatuses = client.getServerStatuses();
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
index 9c8ca19..ff3f10c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
@@ -18,6 +18,8 @@
*/
package org.rhq.modules.plugins.jbossas7.json;
+import org.codehaus.jackson.annotate.JsonValue;
+
/**
*
* @author Heiko W. Rupp
@@ -31,4 +33,10 @@ public class NameValuePair {
this.name = name;
this.value = value;
}
+
+ @JsonValue
+ @Override
+ public String toString() {
+ return name +":"+ value ;
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
index f00c421..4f5cda1 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.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
@@ -18,63 +18,30 @@
*/
package org.rhq.modules.plugins.jbossas7.json;
-import java.util.Map;
+import java.util.List;
-import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonValue;
/**
- * // TODO: Document this
+ * Operation to run on the server
* @author Heiko W. Rupp
*/
public class Operation {
- @JsonProperty("operation-name")
- public String operationName;
- public String description;
- @JsonProperty("request-properties")
- public Map<String,As7RequestProperty> requestProperties;
-// @JsonProperty("reply-properties")
-// public ArrayList<As7ReplyProperty> replyProperties;
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder();
- sb.append("Operation");
- sb.append("{operationName='").append(operationName).append('\'');
- sb.append(", description='").append(description).append('\'');
- sb.append(", requestProperties=").append(requestProperties);
-// sb.append(", replyProperties=").append(replyProperties);
- sb.append('}');
- return sb.toString();
- }
+ public String operation;
+ public List<NameValuePair> address;
- public static class As7RequestProperty {
- public String description;
- public boolean required;
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder();
- sb.append("As7RequestProperty");
- sb.append("{description='").append(description).append('\'');
- sb.append(", required=").append(required);
- sb.append('}');
- return sb.toString();
- }
- }
+ public NameValuePair nvp;
- public static class As7ReplyProperty {
- @JsonProperty("value-type")
- public String valueType;
- public String description;
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder();
- sb.append("As7ReplyProperty");
- sb.append("{valueType='").append(valueType).append('\'');
- sb.append(", description='").append(description).append('\'');
- sb.append('}');
- return sb.toString();
- }
+ @JsonValue
+ public String toString() {
+ StringBuilder b = new StringBuilder();
+ b.append("{");
+ b.append("operation:").append(operation).append(",\n");
+ b.append("address:").append(address).append(",\n");
+ b.append(nvp);
+ b.append("}");
+ return b.toString();
}
}
+
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/OperationDescription.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/OperationDescription.java
new file mode 100644
index 0000000..18b3a40
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/OperationDescription.java
@@ -0,0 +1,80 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * // TODO: Document this
+ * @author Heiko W. Rupp
+ */
+public class OperationDescription {
+ @JsonProperty("operation-name")
+ public String operationName;
+ public String description;
+ @JsonProperty("request-properties")
+ public Map<String,As7RequestProperty> requestProperties;
+// @JsonProperty("reply-properties")
+// public ArrayList<As7ReplyProperty> replyProperties;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("OperationDescription");
+ sb.append("{operationName='").append(operationName).append('\'');
+ sb.append(", description='").append(description).append('\'');
+ sb.append(", requestProperties=").append(requestProperties);
+// sb.append(", replyProperties=").append(replyProperties);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ public static class As7RequestProperty {
+ public String description;
+ public boolean required;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("As7RequestProperty");
+ sb.append("{description='").append(description).append('\'');
+ sb.append(", required=").append(required);
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+
+ public static class As7ReplyProperty {
+ @JsonProperty("value-type")
+ public String valueType;
+ public String description;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("As7ReplyProperty");
+ sb.append("{valueType='").append(valueType).append('\'');
+ sb.append(", description='").append(description).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java
index 89b41a0..7774cd3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java
@@ -37,7 +37,7 @@ public class Subsystem {
@JsonProperty("attributes") Map <String,Attribute> attributes;
@JsonProperty("model-description")
Subsystem modelDescription;
- @JsonProperty("operations") Map<String,Operation> operations = new HashMap<String, Operation>();
+ @JsonProperty("operations") Map<String,OperationDescription> operations = new HashMap<String, OperationDescription>();
public Map<String,Subsystem> children;
@@ -57,7 +57,7 @@ public class Subsystem {
sb.append(", model-description=").append(modelDescription).append('\n');
sb.append("\n, operations=");
if (operations!=null) {
- for (Map.Entry<String,Operation> ops : operations.entrySet())
+ for (Map.Entry<String,OperationDescription> ops : operations.entrySet())
sb.append(" ").append(ops).append('\n');
}
sb.append(", children=").append(children).append('\n');
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 81da4b6..9a04f04 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -169,6 +169,7 @@
<c:simple-property name="path" readOnly="true" default="/subsystem/web/connector/*"/>
</plugin-configuration>
+
<metric property="bytesSent" measurementType="trendsup"/>
<metric property="bytesReceived" measurementType="trendsup"/>
<metric property="processingTime" measurementType="trendsup"/>
@@ -176,6 +177,12 @@
<metric property="maxTime" />
<metric property="requestCount" measurementType="trendsup"/>
+ <resource-configuration>
+ <c:simple-property name="protocol" required="false" description="The web connector protocol."/>
+ <c:simple-property name="socket-binding" required="false" description="The web connector socket-binding reference, this connector should be bound to."/>
+ <c:simple-property name="scheme" required="false" description="The web connector scheme"/>
+ </resource-configuration>
+
</service>
<service name="VHost"
@@ -185,6 +192,11 @@
<c:simple-property name="path" readOnly="true" default="/subsystem/web/virtual-server/*"/>
</plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="access-log"/>
+ <c:list-property name="alias" description="The virtual server aliases"/>
+ <c:simple-property name="rewrite"/>
+ </resource-configuration>
</service>
@@ -209,8 +221,8 @@
</plugin-configuration>
<resource-configuration>
- <c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition"/>
- <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group"/>
+ <c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition" required="false"/>
+ <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group" required="false"/>
</resource-configuration>
<service name="SocketBinding"
commit 3914a1c51bcb6f24e70ff2243664778b79b04873
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 23 10:41:56 2011 +0100
Add support for reading of resource-config
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index 6b64b7b..005421d 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -22,6 +22,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
@@ -32,6 +33,8 @@ import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.jetbrains.annotations.Nullable;
+import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+
/**
* Provide connections to the AS and reading / writing date from/to it.
* @author Heiko W. Rupp
@@ -88,23 +91,7 @@ public class ASConnection {
URL url2;
String spec;
- if (base!=null && !base.isEmpty()) {
- if (!base.startsWith("/")) {
- spec = urlString + "/" + base;
- }
- else {
- spec = urlString + base;
- }
- if (ops!=null) {
- if (!ops.startsWith("?"))
- ops = "?" + ops;
- spec += ops;
- }
-
- url2 = new URL(spec);
- }
- else
- url2 = url;
+ url2 = getBaseUrl(base, ops);
JsonNode tree = null;
@@ -160,5 +147,47 @@ public class ASConnection {
return false;
}
+ public void execute(String path, String s, NameValuePair nvp) {
+
+ try {
+ URL url = getBaseUrl(path,"operation="+s);
+ URLConnection conn = url.openConnection();
+ OutputStream out = conn.getOutputStream();
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.writeValue(out,nvp);
+ out.flush();
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace(); // TODO: Customise this generated block
+ }
+
+ }
+
+
+
+
+ private URL getBaseUrl(String base, String ops) throws MalformedURLException {
+ String spec;
+ URL url2;
+ if (base!=null && !base.isEmpty()) {
+ if (!base.startsWith("/")) {
+ spec = urlString + "/" + base;
+ }
+ else {
+ spec = urlString + base;
+ }
+ if (ops!=null) {
+ if (!ops.startsWith("?"))
+ ops = "?" + ops;
+ spec += ops;
+ }
+
+ url2 = new URL(spec);
+ }
+ else
+ url2 = url;
+ return url2;
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 2f293d9..ca746e0 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -23,12 +23,18 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
@@ -36,10 +42,12 @@ import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationContext;
import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
+import org.rhq.modules.plugins.jbossas7.json.NameValuePair;
+import java.util.Map;
import java.util.Set;
-public class BaseComponent implements ResourceComponent, MeasurementFacet
+public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet
{
private final Log log = LogFactory.getLog(this.getClass());
@@ -134,7 +142,33 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet
protected String getPath() { return path; }
+ public Configuration loadResourceConfiguration() throws Exception {
+ ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
+ JsonNode json = connection.getLevelData(path,false,false);
+ Configuration ret = new Configuration();
+
+ for (PropertyDefinition propDef: configDef.getNonGroupedProperties()) {
+ JsonNode sub = json.findValue(propDef.getName());
+ PropertySimple propertySimple = new PropertySimple(propDef.getName(),sub.getValueAsText());
+ ret.put(propertySimple);
+ }
+
+
+ return ret;
+ }
+
+ public void updateResourceConfiguration(ConfigurationUpdateReport report) {
+ Configuration conf = report.getConfiguration();
+ for (Map.Entry<String, PropertySimple> entry : conf.getSimpleProperties().entrySet()) {
+
+ NameValuePair nvp = new NameValuePair(entry.getKey(),entry.getValue().getStringValue());
+ connection.execute(path,"write-attribute",nvp);
+ }
+
+
+ // TODO: Customise this generated block
+ }
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
new file mode 100644
index 0000000..9c8ca19
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NameValuePair.java
@@ -0,0 +1,34 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+/**
+ *
+ * @author Heiko W. Rupp
+ */
+public class NameValuePair {
+
+ public String name;
+ public String value;
+
+ public NameValuePair(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 98a97d8..81da4b6 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -93,7 +93,7 @@
</server>
- <server name="JBossAS7 (Standalone)"
+ <server name="JBossAS7-Standalone"
discovery="BaseDiscovery"
class="BaseComponent"
>
@@ -127,29 +127,29 @@
/>
-->
- <server name="Messaging"
+ <server name="Messaging"
discovery="SubsystemDiscovery"
class="BaseComponent">
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
</plugin-configuration>
- <resource-configuration>
- <c:simple-property name="journal-min-files" />
- <c:simple-property name="journal-type" />
- </resource-configuration>
+ <resource-configuration>
+ <c:simple-property name="journal-min-files" />
+ <c:simple-property name="journal-type" />
+ </resource-configuration>
- <service name="Acceptor"
- discovery="SubsystemDiscovery"
- class="BaseComponent"
- >
- <plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/subsystem/messaging/acceptor"/>
- </plugin-configuration>
+ <service name="Acceptor"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/messaging/acceptor"/>
+ </plugin-configuration>
- </service>
+ </service>
</server>
@@ -164,7 +164,7 @@
<service name="Connector"
discovery="SubsystemDiscovery"
class="BaseComponent"
- >
+ >
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/subsystem/web/connector/*"/>
</plugin-configuration>
@@ -176,11 +176,11 @@
<metric property="maxTime" />
<metric property="requestCount" measurementType="trendsup"/>
- </service>
+ </service>
<service name="VHost"
- discovery="SubsystemDiscovery"
- class="BaseComponent">
+ discovery="SubsystemDiscovery"
+ class="BaseComponent">
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/subsystem/web/virtual-server/*"/>
</plugin-configuration>
@@ -196,32 +196,37 @@
class="BaseComponent"
description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
<plugin-configuration>
- <c:simple-property name="path" readOnly="true" default="/"/>
+ <c:simple-property name="path" readOnly="true" default="/"/>
</plugin-configuration>
</service>
<service name="SocketBindingGroup"
discovery="SocketBindingGroupDiscovery"
class="BaseComponent"
- >
+ >
<plugin-configuration>
<c:simple-property name="path" readOnly="true" default="/socket-binding-group/"/>
</plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="default-interface" readOnly="true" displayName="Default Interface" description="Default Interface for these bindings. See NetworkInterfaces for its definition"/>
+ <c:simple-property name="port-offset" readOnly="true" displayName="Port Offset" description="Offset from standard ports for this group"/>
+ </resource-configuration>
+
<service name="SocketBinding"
discovery="SocketBindingDiscovery"
class="BaseComponent">
<plugin-configuration>
- <c:simple-property name="path" readOnly="true"/>
+ <c:simple-property name="path" readOnly="true"/>
</plugin-configuration>
- </service>
- </service>
+ </service>
+ </service>
</server>
- <server name="JBossAS (Managed)"
+ <server name="JBossAS-Managed"
discovery="BaseDiscovery"
class="BaseComponent"
>
@@ -238,9 +243,9 @@
<metric property="serverGroup" dataType="trait" displayType="summary" />
<resource-configuration>
<!--<c:group name="interfaces">-->
- <c:simple-property name="loopback" default="127.0.0.1" />
- <c:simple-property name="external" default="any" />
- <c:simple-property name="public" default="any" />
+ <c:simple-property name="loopback" default="127.0.0.1" />
+ <c:simple-property name="external" default="any" />
+ <c:simple-property name="public" default="any" />
<!--</c:group>-->
</resource-configuration>
@@ -251,7 +256,7 @@
discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
class="org.rhq.plugins.jmx.JMXServerComponent"
singleton="true"
- />
+ />
</server>
commit 0f0f7680d7ddb486e63a28ec35874d93f2d1c883
Merge: 69260ab 2f4429f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 22 21:30:15 2011 +0100
Merge branch 'master' into as7plugin
commit 69260ab75e307e19def5831efa6520d1306abdc6
Merge: 92fd80e 6996576
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 22 21:14:53 2011 +0100
Merge branch 'master' into as7plugin
commit 92fd80e33e8367ef8cf228e35c2209037c15dad3
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 22 21:13:58 2011 +0100
Update the plugin to use the JSON interface.
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index cf4c3ae..ef75ab7 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -22,6 +22,7 @@
<properties>
<scm.module.path>TODO</scm.module.path>
<json.version>${project.json.version}</json.version>
+ <jackson.version>1.7.4</jackson.version>
</properties>
<build>
@@ -45,11 +46,15 @@
<configuration>
<artifactItems>
<artifactItem>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- <version>${json.version}</version>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>${jackson.version}</version>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-core-asl</artifactId>
+ <version>${jackson.version}</version>
</artifactItem>
-
</artifactItems>
<outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
@@ -177,12 +182,11 @@
<dependencies>
<dependency>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- <version>${json.version}</version>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>${jackson.version}</version>
</dependency>
-
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
index a28dc2e..6b64b7b 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -19,6 +19,8 @@
package org.rhq.modules.plugins.jbossas7;
import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
@@ -26,8 +28,9 @@ import java.net.URLConnection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.json.JSONException;
-import org.json.JSONObject;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.jetbrains.annotations.Nullable;
/**
* Provide connections to the AS and reading / writing date from/to it.
@@ -53,66 +56,103 @@ public class ASConnection {
}
}
+
+ JsonNode getLevelData(@Nullable String base, boolean recursive, boolean includeMetrics) throws Exception{
+ String ops = null;
+ if (recursive)
+ ops = "recursive";
+ if (includeMetrics)
+ ops += "&include-runtime=true";
+
+ return getLevelData(base,ops);
+}
+ /**
+ * Return the default data for base
+ * @param base
+ * @return
+ * @throws Exception
+ */
+ JsonNode getLevelData(@Nullable String base) throws Exception {
+ return getLevelData(base,"operation=resource-description&recursive&include-runtime=true");
+ }
+
/**
* Return the JSON-Ojbect for a certain path.
*
- *
* @param base Path to the object/subsystem. Can be null/"" for the base objects
- * @param recursive Shall lover levels be recursively obtained. May generate a lot of data.
- * @param includeMetrics Should metrice be requested as well?
+ * @param ops Operation to run on the api can be null
* @return A JSONObject encoding the level plus sub levels provided
* @throws Exception If anything goes wrong
*/
- JSONObject getLevelData(String base, boolean recursive, boolean includeMetrics) throws Exception {
+ JsonNode getLevelData(@Nullable String base, @Nullable String ops) throws Exception {
URL url2;
+ String spec;
if (base!=null && !base.isEmpty()) {
- String spec;
if (!base.startsWith("/")) {
spec = urlString + "/" + base;
}
else {
spec = urlString + base;
}
- if (recursive)
- spec += "?recursive";
- if (includeMetrics)
- spec += "?include-runtime=true"; // TODO this will change ?query-metrics=true for metrics only
+ if (ops!=null) {
+ if (!ops.startsWith("?"))
+ ops = "?" + ops;
+ spec += ops;
+ }
url2 = new URL(spec);
}
else
url2 = url;
+ JsonNode tree = null;
+
URLConnection conn = url2.openConnection();
+ InputStream inputStream = null;
+ try {
+ inputStream = conn.getInputStream();
+ } catch (IOException e) {
+ System.err.println(e.getMessage());
+ return tree;
+ }
BufferedReader in = new BufferedReader(new InputStreamReader(
- conn.getInputStream()));
+ inputStream));
+ try {
+ String line;
+ StringBuilder builder = new StringBuilder();
+ while ((line = in.readLine()) != null) {
+ builder.append(line);
+ }
- String line;
- StringBuilder builder = new StringBuilder();
- while ((line = in.readLine()) != null) {
- builder.append(line);
- }
+ ObjectMapper mapper = new ObjectMapper();
- JSONObject object = new JSONObject(builder.toString());
+ tree = mapper.readTree(builder.toString());
+
+ } catch (IOException ioe) {
+ System.err.println("for in put " + url2 + " : " + ioe.getMessage());
+ } finally {
+ in.close();
+ }
- in.close();
- return object;
+ return tree;
}
- boolean isErrorReply(JSONObject in) {
+ boolean isErrorReply(JsonNode in) {
if (in.has("outcome")) {
String outcome = null;
try {
- outcome = in.getString("outcome");
+ JsonNode outcomeNode = in.findValue("outcome");
+ outcome = outcomeNode.getTextValue();
if (outcome.equals("failed")) {
- String reason = in.getString("failure-description");
+ JsonNode reasonNode = in.findValue("failure-description");
+ String reason = reasonNode.getTextValue();
log.info(reason);
return true;
}
- } catch (JSONException e) {
+ } catch (Exception e) {
e.printStackTrace(); // TODO
return true;
}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 04264b4..2f293d9 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -1,8 +1,26 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.modules.plugins.jbossas7;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.json.JSONObject;
+import org.codehaus.jackson.JsonNode;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.measurement.AvailabilityType;
@@ -11,8 +29,6 @@ import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
-import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
-import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
@@ -30,7 +46,6 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet
ResourceContext context;
Configuration conf;
String myServerName;
- private static final String[] INTERFACE_NAMES = new String[]{"loopback","external","public"};
ASConnection connection;
String path;
String key;
@@ -91,10 +106,11 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet
*/
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
- JSONObject obj = connection.getLevelData(key,false,true);
+ JsonNode obj = connection.getLevelData(key,false,true);
for (MeasurementScheduleRequest req : metrics) {
if (obj.has(req.getName())) {
+/*
String val = obj.getString(req.getName());
if (req.getDataType()== DataType.MEASUREMENT) {
@@ -105,6 +121,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet
MeasurementDataTrait data = new MeasurementDataTrait(req,val);
report.addData(data);
}
+*/
}
}
}
@@ -115,7 +132,7 @@ public class BaseComponent implements ResourceComponent, MeasurementFacet
}
-
+ protected String getPath() { return path; }
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
index 745dc2e..d756543 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
@@ -45,7 +45,7 @@ public class DatasourceDiscovery implements ResourceDiscoveryComponent<Subsystem
for (DataSource source : sources.getDataSource()) {
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- discoveryContext.getResourceType(), // Type
+ discoveryContext.getResourceType(), // DataType
source.getJndiName(), // Key
source.getJndiName(), // Name TODO improve
null, // version
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
new file mode 100644
index 0000000..021b10c
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/InterfaceDiscovery.java
@@ -0,0 +1,107 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.modules.plugins.jbossas7.json.Attribute;
+import org.rhq.modules.plugins.jbossas7.json.Domain;
+import org.rhq.modules.plugins.jbossas7.json.NetworkInterface;
+
+/**
+ * Discover subsystems
+ *
+ * @author Heiko W. Rupp
+ */
+@SuppressWarnings("unused")
+public class InterfaceDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
+ throws Exception {
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
+ mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
+
+ BaseComponent parentComponent = context.getParentResourceComponent();
+ ASConnection connection = parentComponent.getASConnection();
+
+
+
+ JsonNode json = connection.getLevelData(null, null);
+ if (!connection.isErrorReply(json)) {
+ Domain domain = mapper.readValue(json, new TypeReference<Domain>() {});
+
+ for (Map.Entry<String,String> entry: domain.interfaces.entrySet()) {
+
+ String key = entry.getKey();
+ String path = "/interface/" + key;
+ JsonNode subJson = connection.getLevelData(path);
+
+ NetworkInterface networkInterface = mapper.readValue(subJson, new TypeReference<NetworkInterface>() {});
+ networkInterface.name= key;
+ for (Map.Entry<String,Attribute> nentry : networkInterface.attributes.entrySet()) {
+ nentry.getValue().name = nentry.getKey();
+
+ String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
+ String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+
+ Configuration config = context.getDefaultPluginConfiguration();
+
+ PropertySimple propertySimple = new PropertySimple("path",path);
+ config.put(propertySimple);
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ path, // Key
+ name, // Name
+ null, // Version
+ networkInterface.description, // Description
+ config,
+ null);
+ details.add(detail);
+ }
+ }
+
+ return details;
+ }
+
+ return Collections.emptySet();
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingDiscovery.java
new file mode 100644
index 0000000..c9b7a5e
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingDiscovery.java
@@ -0,0 +1,108 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.modules.plugins.jbossas7.json.Domain;
+import org.rhq.modules.plugins.jbossas7.json.SocketBindingGroup;
+
+/**
+ * Discover single bindings in a socket binding group
+ *
+ * TODO: Is this better a resource-configuration on the parent?
+ *
+ * @author Heiko W. Rupp
+ */
+@SuppressWarnings("unused")
+public class SocketBindingDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
+ throws Exception {
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
+ mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
+
+ BaseComponent parentComponent = context.getParentResourceComponent();
+ ASConnection connection = parentComponent.getASConnection();
+
+ String path = parentComponent.getPath();
+
+
+ JsonNode json = connection.getLevelData(path,true,false);
+ if (!connection.isErrorReply(json)) {
+
+ SocketBindingGroup bindingGroup = mapper.readValue(json, new TypeReference<SocketBindingGroup>() {});
+ // TODO put bindingGroup. {name, default-interface, port-offset into parent
+
+
+ for (Map.Entry<String,SocketBindingGroup.Binding> entry: bindingGroup.bindings.entrySet()) {
+
+ String key = entry.getKey();
+ String cpath = path + "/socket-binding/" + key;
+
+
+ String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
+ String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+
+ Configuration config = context.getDefaultPluginConfiguration();
+
+ PropertySimple propertySimple = new PropertySimple("path",cpath);
+ config.put(propertySimple);
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ path, // Key
+ name, // Name
+ null, // Version
+ "Binding Group", // Description
+ config,
+ null);
+ details.add(detail);
+ log.info("Added " + detail);
+ }
+
+ return details;
+
+ }
+
+ return Collections.emptySet();
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
new file mode 100644
index 0000000..4411f8c
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SocketBindingGroupDiscovery.java
@@ -0,0 +1,104 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.modules.plugins.jbossas7.json.Attribute;
+import org.rhq.modules.plugins.jbossas7.json.Domain;
+import org.rhq.modules.plugins.jbossas7.json.SocketBindingGroup;
+
+/**
+ * Discover subsystems
+ *
+ * @author Heiko W. Rupp
+ */
+@SuppressWarnings("unused")
+public class SocketBindingGroupDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
+ throws Exception {
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
+ mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
+
+ BaseComponent parentComponent = context.getParentResourceComponent();
+ ASConnection connection = parentComponent.getASConnection();
+
+
+
+ JsonNode json = connection.getLevelData(null, null);
+ if (!connection.isErrorReply(json)) {
+ Domain domain = mapper.readValue(json, new TypeReference<Domain>() {});
+
+ for (Map.Entry<String,String> entry: domain.socketBindingGroup.entrySet()) {
+
+ String key = entry.getKey();
+ String path = "/socket-binding-group/" + key;
+ JsonNode subJson = connection.getLevelData(path);
+
+ SocketBindingGroup bindingGroup = mapper.readValue(subJson, new TypeReference<SocketBindingGroup>() {});
+ bindingGroup.name= key;
+
+ String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
+ String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+
+ Configuration config = context.getDefaultPluginConfiguration();
+
+ PropertySimple propertySimple = new PropertySimple("path",path);
+ config.put(propertySimple);
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // DataType
+ path, // Key
+ name, // Name
+ null, // Version
+ "SocketBinding Group", // Description
+ config,
+ null);
+ details.add(detail);
+ }
+
+ return details;
+ }
+
+ return Collections.emptySet();
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 7833f67..75683cb 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -20,29 +20,40 @@ package org.rhq.modules.plugins.jbossas7;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.modules.plugins.jbossas7.json.Subsystem;
import java.util.Collections;
import java.util.HashSet;
-import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
-import org.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
/**
* Discover subsystems
*
* @author Heiko W. Rupp
*/
+@SuppressWarnings("unused")
public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+ private final Log log = LogFactory.getLog(this.getClass());
+
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
- throws InvalidPluginConfigurationException, Exception {
+ throws Exception {
Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
+ mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
BaseComponent parentComponent = context.getParentResourceComponent();
ASConnection connection = parentComponent.getASConnection();
@@ -61,29 +72,31 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
path = cpath;
- JSONObject o = connection.getLevelData(path,recursive, false);
- if (!connection.isErrorReply(o)) {
+ JsonNode json = connection.getLevelData(path,recursive, false);
+ if (!connection.isErrorReply(json)) {
if (recursive) {
int i = path.lastIndexOf("/");
String subPath = path.substring(i+1);
- o = o.getJSONObject(subPath);
+ JsonNode subNode = json.findPath(subPath);
+
+ Map<String,Subsystem> subsystemMap = mapper.readValue(subNode,new TypeReference<Map<String,Subsystem>>() {});
- Iterator keyIter = o.keys() ;
- while (keyIter.hasNext()) {
+ for (Map.Entry<String,Subsystem> entry: subsystemMap.entrySet()) {
- String key = (String) keyIter.next();
+ String key = entry.getKey();
+ Subsystem subsystem = entry.getValue();
String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
String name = resKey.substring(resKey.lastIndexOf("/") + 1);
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // Type
+ context.getResourceType(), // DataType
path + "/" + key, // Key
name, // Name
null, // Version
- path, // Description
+ subsystem.description, // Description
config,
null);
details.add(detail);
@@ -98,7 +111,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // Type
+ context.getResourceType(), // DataType
path, // Key
name, // Name
null, // Version
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Attribute.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Attribute.java
new file mode 100644
index 0000000..02dbb5d
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Attribute.java
@@ -0,0 +1,86 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * @author Heiko W. Rupp
+ */
+public class Attribute {
+
+ public String name;
+ public String description;
+ public boolean required;
+ public boolean nillable;
+ @JsonProperty("access-type")
+ public AccessType accessType;
+ public Storage storage;
+ public Type type;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Attribute");
+ sb.append("{name='").append(name).append('\'');
+ sb.append(", description='").append(description).append('\'');
+ sb.append(", required=").append(required);
+ sb.append(", nillable=").append(nillable);
+ sb.append(", accessType='").append(accessType).append('\'');
+ sb.append(", storage='").append(storage).append('\'');
+ sb.append(", type=").append(type);
+ sb.append('}');
+ return sb.toString();
+ }
+
+
+ public enum AccessType {
+ METRIC("metric"),
+ READ_ONLY("read-only")
+ ;
+
+ String jsonName;
+
+ AccessType(String jsonName) {
+ this.jsonName = jsonName;
+ }
+
+ @Override
+ public String toString() {
+ return jsonName;
+ }
+ }
+
+ public enum Storage {
+ CONFIGURATION("configuration"),
+ RUNTIME("runtime")
+ ;
+
+ String jsonName;
+
+ Storage(String jsonName) {
+ this.jsonName =jsonName;
+ }
+
+ @Override
+ public String toString() {
+ return jsonName;
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Domain.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Domain.java
new file mode 100644
index 0000000..8600c15
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Domain.java
@@ -0,0 +1,53 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * @author Heiko W. Rupp
+ */
+public class Domain {
+
+
+ public String name;
+ @JsonProperty("management-interfaces") Map<String,String> managementInterfaces;
+ @JsonProperty("profile-name") String profileName;
+ public Map<String,String> path;
+ public Map<String,String> subsystem;
+ @JsonProperty("interface")
+ public Map<String,String> interfaces;
+ @JsonProperty("socket-binding-group")
+ public Map<String,String> socketBindingGroup;
+
+ @Override
+ public String toString() {
+ return "Domain{" +
+ "name='" + name + '\'' +
+ ", managementInterfaces=" + managementInterfaces +
+ ", profileName='" + profileName + '\'' +
+ ", path=" + path +
+ ", subsystem=" + subsystem +
+ ", interfaces=" + interfaces +
+ ", socketBindingGroup=" + socketBindingGroup +
+ '}';
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NetworkInterface.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NetworkInterface.java
new file mode 100644
index 0000000..0af6ed1
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/NetworkInterface.java
@@ -0,0 +1,45 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * @author Heiko W. Rupp
+ */
+public class NetworkInterface {
+
+ public String name;
+ public String description;
+ @JsonProperty("attributes")
+ public
+ Map<String,Attribute> attributes;
+
+
+ @Override
+ public String toString() {
+ return "NetworkInterface{" +
+ "name='" + name + '\'' +
+ ", description='" + description + '\'' +
+ ", attributes=" + attributes +
+ '}';
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
new file mode 100644
index 0000000..f00c421
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Operation.java
@@ -0,0 +1,80 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * // TODO: Document this
+ * @author Heiko W. Rupp
+ */
+public class Operation {
+ @JsonProperty("operation-name")
+ public String operationName;
+ public String description;
+ @JsonProperty("request-properties")
+ public Map<String,As7RequestProperty> requestProperties;
+// @JsonProperty("reply-properties")
+// public ArrayList<As7ReplyProperty> replyProperties;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Operation");
+ sb.append("{operationName='").append(operationName).append('\'');
+ sb.append(", description='").append(description).append('\'');
+ sb.append(", requestProperties=").append(requestProperties);
+// sb.append(", replyProperties=").append(replyProperties);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ public static class As7RequestProperty {
+ public String description;
+ public boolean required;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("As7RequestProperty");
+ sb.append("{description='").append(description).append('\'');
+ sb.append(", required=").append(required);
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+
+ public static class As7ReplyProperty {
+ @JsonProperty("value-type")
+ public String valueType;
+ public String description;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("As7ReplyProperty");
+ sb.append("{valueType='").append(valueType).append('\'');
+ sb.append(", description='").append(description).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/SocketBindingGroup.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/SocketBindingGroup.java
new file mode 100644
index 0000000..5d2b6ee
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/SocketBindingGroup.java
@@ -0,0 +1,47 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * One Socket binding group of a domain
+ * @author Heiko W. Rupp
+ */
+public class SocketBindingGroup {
+
+
+ public String name;
+ @JsonProperty("default-interface") public String defaultInterface;
+ @JsonProperty("port-offset") public int portOffset;
+ @JsonProperty("socket-binding") public Map<String,Binding> bindings;
+
+
+ public static class Binding {
+ public String name;
+ @JsonProperty("interface") public String iFace;
+ public int port;
+ @JsonProperty("fixed-port") public Integer fixedPort;
+ @JsonProperty("multicast-address") public String mcastAddress;
+ @JsonProperty("multicast-port") public Integer mcastPort;
+
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java
new file mode 100644
index 0000000..89b41a0
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Subsystem.java
@@ -0,0 +1,67 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * @author Heiko W. Rupp
+ */
+public class Subsystem {
+
+ String subsystemName;
+
+ @JsonProperty("head-comment-allowed") boolean headCommentAllowed;
+ @JsonProperty("tail-comment-allowed") boolean tailCommentAllowed;
+// public DataType type;
+ public String description;
+ @JsonProperty("attributes") Map <String,Attribute> attributes;
+ @JsonProperty("model-description")
+ Subsystem modelDescription;
+ @JsonProperty("operations") Map<String,Operation> operations = new HashMap<String, Operation>();
+ public Map<String,Subsystem> children;
+
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Subsystem");
+ sb.append("{headCommentAllowed=").append(headCommentAllowed);
+ sb.append(", tailCommentAllowed=").append(tailCommentAllowed);
+// sb.append(", type=").append(type).append('\n');
+ sb.append(", description='").append(description).append('\'').append('\n');
+ sb.append(", attributes=\n");
+ if (attributes!=null) {
+ for (Map.Entry<String,Attribute> attr : attributes.entrySet())
+ sb.append(" ").append(attr).append('\n');
+ }
+ sb.append(", model-description=").append(modelDescription).append('\n');
+ sb.append("\n, operations=");
+ if (operations!=null) {
+ for (Map.Entry<String,Operation> ops : operations.entrySet())
+ sb.append(" ").append(ops).append('\n');
+ }
+ sb.append(", children=").append(children).append('\n');
+ sb.append("\n}");
+ return sb.toString();
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Tuple.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Tuple.java
new file mode 100644
index 0000000..01e31d3
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Tuple.java
@@ -0,0 +1,35 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+/**
+ * @author Heiko W. Rupp
+ */
+public class Tuple {
+ String key;
+ String value;
+
+ @Override
+ public String toString() {
+ return "Tuple{" +
+ "key='" + key + '\'' +
+ ", value='" + value + '\'' +
+ '}';
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Type.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Type.java
new file mode 100644
index 0000000..0ad1fe8
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/Type.java
@@ -0,0 +1,50 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * // TODO: Document this
+ * @author Heiko W. Rupp
+ */
+public class Type {
+
+ @JsonProperty("TYPE_MODEL_VALUE")
+ public DataType modelValue;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Type");
+ sb.append("{modelValue='").append(modelValue).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+
+ public enum DataType {
+ STRING,
+ INT,
+ BOOLEAN,
+ OBJECT,
+ LIST
+
+ ;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/TypeModelValue.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/TypeModelValue.java
new file mode 100644
index 0000000..6856adb
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/json/TypeModelValue.java
@@ -0,0 +1,39 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7.json;
+
+/**
+ * // TODO: Document this
+ * @author Heiko W. Rupp
+ */
+public class TypeModelValue {
+
+ public String TYPE_MODEL_VALUE;
+ public String value;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("TypeModelValue");
+ sb.append("{TYPE_MODEL_VALUE='").append(TYPE_MODEL_VALUE).append('\'');
+ sb.append(", value='").append(value).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index e29d0d2..98a97d8 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -93,7 +93,7 @@
</server>
- <server name="JBossAS (Standalone)"
+ <server name="JBossAS7 (Standalone)"
discovery="BaseDiscovery"
class="BaseComponent"
>
@@ -178,8 +178,47 @@
</service>
+ <service name="VHost"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent">
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/web/virtual-server/*"/>
+ </plugin-configuration>
+
+
+ </service>
+
</server>
+
+ <service name="NetworkInterface"
+ discovery="InterfaceDiscovery"
+ class="BaseComponent"
+ description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/"/>
+ </plugin-configuration>
+ </service>
+
+ <service name="SocketBindingGroup"
+ discovery="SocketBindingGroupDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/socket-binding-group/"/>
+ </plugin-configuration>
+
+ <service name="SocketBinding"
+ discovery="SocketBindingDiscovery"
+ class="BaseComponent">
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true"/>
+ </plugin-configuration>
+
+ </service>
+ </service>
+
+
</server>
<server name="JBossAS (Managed)"
commit 6a46a9c96002addd485058a7269247a9bf67739c
Merge: 33e4ce8 829d5ff
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 14 14:44:50 2011 +0100
Merge branch 'master' into as7plugin
commit 33e4ce87753d91c82dd1dd3c9c539acb311cda85
Merge: c3cd8f3 332d99a
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 3 17:50:29 2011 +0100
Merge branch 'master' into as7plugin
commit c3cd8f3f135563765a73a3c76f7db9bdf2b3d617
Merge: 7d233c8 3fc1998
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Mar 3 14:13:32 2011 +0100
Merge branch 'master' into as7plugin
commit 7d233c8a1a76d3c2dfd9742b9f5ab1b222e01792
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Feb 21 22:15:18 2011 +0100
Put json parser version into a property and use this in the sub-projects.
diff --git a/modules/plugins/hudson/pom.xml b/modules/plugins/hudson/pom.xml
index 71c974a..a8f6739 100644
--- a/modules/plugins/hudson/pom.xml
+++ b/modules/plugins/hudson/pom.xml
@@ -22,7 +22,7 @@
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
- <version>20080701</version>
+ <version>${project.json.version}</version>
<scope>provided</scope>
</dependency>
@@ -63,7 +63,7 @@
<artifactItem>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
- <version>20080701</version>
+ <version>${project.json.version}</version>
</artifactItem>
</artifactItems>
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index 0e6df0b..cf4c3ae 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -21,7 +21,7 @@
<properties>
<scm.module.path>TODO</scm.module.path>
- <json.version>20080701</json.version>
+ <json.version>${project.json.version}</json.version>
</properties>
<build>
diff --git a/pom.xml b/pom.xml
index 7c07d11..4ace1d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -150,6 +150,7 @@
<!-- NOTE: The below line is a workaround for a Maven bug, where it does not expand settings.* properties
used in the distributionManagement section of the POM. -->
<localRepository>${user.home}/.m2/repository</localRepository>
+ <project.json.version>20080701</project.json.version>
</properties>
commit c8ffdf7cf0202a3b59675f7a8a201c3a2fc87f4f
Merge: 5221182 6a43faf
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Feb 21 22:01:40 2011 +0100
Merge branch 'master' into as7plugin
commit 52211828eed5ebd533de2759de221f48a60c3eda
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Feb 15 21:13:59 2011 +0100
First cut of a JBossAS7 plugin using the brand new http-based API.
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
new file mode 100644
index 0000000..0e6df0b
--- /dev/null
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -0,0 +1,221 @@
+<project
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+
+ >
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-plugins-parent</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-jboss-as-7-plugin</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ JBoss-AS-7 Plugin</name>
+
+ <properties>
+ <scm.module.path>TODO</scm.module.path>
+ <json.version>20080701</json.version>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-dependency-jars</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>${json.version}</version>
+ </artifactItem>
+
+
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>
+ ${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-downloads/rhq-plugins
+ </rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}"/>
+ <property name="deployment.file"
+ location="${rhq.deploymentDir}/${project.build.finalName}.jar"/>
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}"/>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file"
+ location="${rhq.deploymentDir}/${project.build.finalName}.jar"/>
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar"
+ dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**"/>
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}"
+ manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF"
+ update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file"
+ location="${rhq.deploymentDir}/${project.build.finalName}.jar"/>
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}"/>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ </profile>
+ </profiles>
+
+
+ <repositories>
+ <repository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>jboss</id>
+ <name>JBoss Repository</name>
+ <url>http://repository.jboss.org/maven2/</url>
+ </repository>
+ <!-- TODO add your own maven repositories here (if needed) -->
+ </repositories>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>jboss</id>
+ <name>JBoss Plugin Repository</name>
+ <url>http://repository.jboss.org/maven2/</url>
+ </pluginRepository>
+ </pluginRepositories>
+
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>${json.version}</version>
+ </dependency>
+
+
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>${commons-logging.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>rhq-core-domain</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>rhq-core-plugin-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>rhq-core-native-system</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-jmx-plugin</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+
+ <!-- TODO add your dependencies here -->
+
+ </dependencies>
+</project>
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
new file mode 100644
index 0000000..a28dc2e
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java
@@ -0,0 +1,124 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Provide connections to the AS and reading / writing date from/to it.
+ * @author Heiko W. Rupp
+ */
+public class ASConnection {
+
+ private final Log log = LogFactory.getLog(ASConnection.class);
+ private int port;
+ private String host;
+ URL url;
+ String urlString;
+
+ public ASConnection(String host, int port) {
+ this.host = host;
+ this.port = port;
+
+ try {
+ url = new URL("http",host,port,"/domain-api");
+ urlString = url.toString();
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException(e.getMessage());
+ }
+ }
+
+ /**
+ * Return the JSON-Ojbect for a certain path.
+ *
+ *
+ * @param base Path to the object/subsystem. Can be null/"" for the base objects
+ * @param recursive Shall lover levels be recursively obtained. May generate a lot of data.
+ * @param includeMetrics Should metrice be requested as well?
+ * @return A JSONObject encoding the level plus sub levels provided
+ * @throws Exception If anything goes wrong
+ */
+ JSONObject getLevelData(String base, boolean recursive, boolean includeMetrics) throws Exception {
+
+ URL url2;
+ if (base!=null && !base.isEmpty()) {
+ String spec;
+ if (!base.startsWith("/")) {
+ spec = urlString + "/" + base;
+ }
+ else {
+ spec = urlString + base;
+ }
+ if (recursive)
+ spec += "?recursive";
+ if (includeMetrics)
+ spec += "?include-runtime=true"; // TODO this will change ?query-metrics=true for metrics only
+
+ url2 = new URL(spec);
+ }
+ else
+ url2 = url;
+
+ URLConnection conn = url2.openConnection();
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ conn.getInputStream()));
+
+ String line;
+ StringBuilder builder = new StringBuilder();
+ while ((line = in.readLine()) != null) {
+ builder.append(line);
+ }
+
+ JSONObject object = new JSONObject(builder.toString());
+
+ in.close();
+ return object;
+ }
+
+
+ boolean isErrorReply(JSONObject in) {
+ if (in.has("outcome")) {
+ String outcome = null;
+ try {
+ outcome = in.getString("outcome");
+ if (outcome.equals("failed")) {
+ String reason = in.getString("failure-description");
+ log.info(reason);
+ return true;
+ }
+
+ } catch (JSONException e) {
+ e.printStackTrace(); // TODO
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
new file mode 100644
index 0000000..04264b4
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -0,0 +1,123 @@
+package org.rhq.modules.plugins.jbossas7;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONObject;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementDataNumeric;
+import org.rhq.core.domain.measurement.MeasurementDataTrait;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pluginapi.operation.OperationContext;
+import org.rhq.core.pluginapi.operation.OperationFacet;
+import org.rhq.core.pluginapi.operation.OperationResult;
+
+import java.util.Set;
+
+public class BaseComponent implements ResourceComponent, MeasurementFacet
+{
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ ResourceContext context;
+ Configuration conf;
+ String myServerName;
+ private static final String[] INTERFACE_NAMES = new String[]{"loopback","external","public"};
+ ASConnection connection;
+ String path;
+ String key;
+
+
+ /**
+ * Return availability of this resource
+ * @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability()
+ */
+ public AvailabilityType getAvailability() {
+ // TODO supply real implementation
+ return AvailabilityType.UP;
+ }
+
+
+ /**
+ * Start the resource connection
+ * @see org.rhq.core.pluginapi.inventory.ResourceComponent#start(org.rhq.core.pluginapi.inventory.ResourceContext)
+ */
+ public void start(ResourceContext context) throws InvalidPluginConfigurationException, Exception {
+ this.context = context;
+ conf = context.getPluginConfiguration();
+ // TODO add code to start the resource / connection to it
+
+ String typeName = context.getResourceType().getName();
+ String host = conf.getSimpleValue("hostname","localhost");
+ String portString = conf.getSimpleValue("port","9990");
+ int port = Integer.parseInt(portString);
+ connection = new ASConnection(host,port);
+
+ path = conf.getSimpleValue("path", null);
+ key = context.getResourceKey();
+
+
+
+// Object o = connection.getLevelData("", false); // BASE entries
+
+ myServerName = context.getResourceKey().substring(context.getResourceKey().lastIndexOf("/")+1);
+
+
+ }
+
+
+ /**
+ * Tear down the resource connection
+ * @see org.rhq.core.pluginapi.inventory.ResourceComponent#stop()
+ */
+ public void stop() {
+
+
+ }
+
+
+
+ /**
+ * Gather measurement data
+ * @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set)
+ */
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+
+ JSONObject obj = connection.getLevelData(key,false,true);
+
+ for (MeasurementScheduleRequest req : metrics) {
+ if (obj.has(req.getName())) {
+ String val = obj.getString(req.getName());
+ if (req.getDataType()== DataType.MEASUREMENT) {
+
+ Double d = Double.parseDouble(val);
+ MeasurementDataNumeric data = new MeasurementDataNumeric(req,d);
+ report.addData(data);
+ } else if (req.getDataType()== DataType.TRAIT) {
+ MeasurementDataTrait data = new MeasurementDataTrait(req,val);
+ report.addData(data);
+ }
+ }
+ }
+ }
+
+
+ protected ASConnection getASConnection() {
+ return connection;
+ }
+
+
+
+
+
+
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
new file mode 100644
index 0000000..83d0e3e
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseDiscovery.java
@@ -0,0 +1,157 @@
+package org.rhq.modules.plugins.jbossas7;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mc4j.ems.connection.support.metadata.LocalVMTypeDescriptor;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ProcessScanResult;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.plugins.jmx.JMXDiscoveryComponent;
+
+
+/**
+ * Discovery class
+ */
+public class BaseDiscovery implements ResourceDiscoveryComponent
+
+{
+
+ static final String DJBOSS_SERVER_BASE_DIR = "-Djboss.server.base.dir=";
+ static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ /**
+ * Run the auto-discovery
+ */
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception {
+ Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>();
+
+
+ List<ProcessScanResult> scans = discoveryContext.getAutoDiscoveredProcesses();
+
+ for (ProcessScanResult psr : scans) {
+
+ Configuration config = discoveryContext.getDefaultPluginConfiguration();
+ // IF SE, then look at domain/configuration/host.xml <management interface="default" port="9990
+ // for management port
+ String[] commandLine = psr.getProcessInfo().getCommandLine();
+ String serverNameFull;
+ String serverName;
+ String psName = psr.getProcessScan().getName();
+ if (psName.equals("ProcessManager")) {
+ serverNameFull = "ProcessManager";
+ serverName = "ProcessManager";
+ } else if (psName.equals("ASManager")) {
+ serverName = "ASManager";
+ serverNameFull = "ASManager";
+ } else {
+ serverNameFull = getBaseDirFromCommandLine(commandLine);
+ serverName = serverNameFull.substring(serverNameFull.lastIndexOf("/")+1);
+
+// DomainClient client = DomainClient.Factory.create(InetAddress.getByName("localhost"),9990); //
+// Map<ServerIdentity,ServerStatus> serverStatuses = client.getServerStatuses();
+// for (Map.Entry<ServerIdentity,ServerStatus> entry : serverStatuses.entrySet()) {
+// ServerIdentity identity = entry.getKey();
+// ServerStatus status = entry.getValue();
+// if (identity.getServerName().equals(serverName)) {
+// String serverGroupName = identity.getServerGroupName();
+// config.put(new PropertySimple("server-group",serverGroupName));
+// }
+//
+// }
+ }
+ String logFile = getLogFieFromCommandLine(commandLine);
+ initLogEventSourcesConfigProp(logFile,config);
+ String javaClazz = psr.getProcessInfo().getName();
+
+
+ /*
+ * We'll connect to the discovered VM on the local host, so set the jmx connection
+ * properties accordingly. This may only work on JDK6+, but then JDK5 is deprecated
+ * anyway.
+ */
+// config.put(new PropertySimple(JMXDiscoveryComponent.COMMAND_LINE_CONFIG_PROPERTY,
+// javaClazz));
+ config.put(new PropertySimple(JMXDiscoveryComponent.CONNECTION_TYPE,
+ LocalVMTypeDescriptor.class.getName()));
+
+ // TODO vmid will change when the detected server is bounced - how do we follow this?
+ config.put(new PropertySimple(JMXDiscoveryComponent.VMID_CONFIG_PROPERTY,psr.getProcessInfo().getPid()));
+
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ discoveryContext.getResourceType(), // ResourceType
+ serverNameFull, // key TODO distinguish per domain?
+ serverName, // Name
+ null, // TODO real version ?
+ "TODO", // Description
+ config,
+ psr.getProcessInfo()
+ );
+
+
+ // Add to return values
+ discoveredResources.add(detail);
+ log.info("Discovered new ... " + discoveryContext.getResourceType() + ", " + serverNameFull);
+ }
+
+ return discoveredResources;
+
+ }
+
+ String getBaseDirFromCommandLine(String[] commandLine) {
+ for (String line: commandLine) {
+ if (line.startsWith(DJBOSS_SERVER_BASE_DIR))
+ return line.substring(DJBOSS_SERVER_BASE_DIR.length());
+ }
+ return "";
+ }
+
+//-Dorg.jboss.boot.log.file=/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/log/server-manager/boot.log
+//-Dlogging.configuration=file:/devel/jbas7/jboss-as/build/target/jboss-7.0.0.Alpha2/domain/configuration/logging.properties
+
+ String getLogFieFromCommandLine(String[] commandLine) {
+
+ for (String line: commandLine) {
+ if (line.startsWith(DORG_JBOSS_BOOT_LOG_FILE))
+ return line.substring(DORG_JBOSS_BOOT_LOG_FILE.length());
+ }
+ return "";
+ }
+
+ private void initLogEventSourcesConfigProp(String fileName, Configuration pluginConfiguration) {
+
+ PropertyList logEventSources = pluginConfiguration
+ .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
+
+ if (logEventSources==null)
+ return;
+
+ File serverLogFile = new File(fileName);
+
+ if (serverLogFile.exists() && !serverLogFile.isDirectory()) {
+ PropertyMap serverLogEventSource = new PropertyMap("logEventSource");
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, serverLogFile));
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
+ logEventSources.add(serverLogEventSource);
+ }
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java
new file mode 100644
index 0000000..abf6d35
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceComponent.java
@@ -0,0 +1,44 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+
+/**
+ * // TODO: Document this
+ *
+ * @author Heiko W. Rupp
+ */
+public class DatasourceComponent implements ResourceComponent<SubsystemComponent> {
+
+ public void start(ResourceContext<SubsystemComponent> subsystemComponentResourceContext) throws InvalidPluginConfigurationException, Exception {
+ // TODO: Customise this generated block
+ }
+
+ public void stop() {
+ // TODO: Customise this generated block
+ }
+
+ public AvailabilityType getAvailability() {
+ return null; // TODO: Customise this generated block
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
new file mode 100644
index 0000000..745dc2e
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DatasourceDiscovery.java
@@ -0,0 +1,65 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Discover Datasources
+ *
+ * @author Heiko W. Rupp
+ */
+public class DatasourceDiscovery implements ResourceDiscoveryComponent<SubsystemComponent> {
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<SubsystemComponent> discoveryContext) throws InvalidPluginConfigurationException, Exception {
+
+/*
+ if (subsys instanceof DataSourcesSubsystemElement) {
+ DataSourcesSubsystemElement element = (DataSourcesSubsystemElement) subsys;
+ DataSources sources = element.getDatasources();
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>();
+
+ for (DataSource source : sources.getDataSource()) {
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ discoveryContext.getResourceType(), // Type
+ source.getJndiName(), // Key
+ source.getJndiName(), // Name TODO improve
+ null, // version
+ "A datasource", // description
+ discoveryContext.getDefaultPluginConfiguration(),
+ null // Process scans
+
+ );
+ details.add(detail);
+ }
+ return details;
+ }
+
+*/
+ return Collections.emptySet();
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemComponent.java
new file mode 100644
index 0000000..09d753c
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemComponent.java
@@ -0,0 +1,58 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+
+/**
+ * Resource component for subsystems
+ *
+ * Deprecated - use BaseComponent
+ * @author Heiko W. Rupp
+ */
+@Deprecated
+public class SubsystemComponent implements ResourceComponent<BaseComponent> {
+
+ ResourceContext<BaseComponent> context;
+ Configuration config;
+ String path;
+ String key ;
+
+ public void start(ResourceContext<BaseComponent> context) throws InvalidPluginConfigurationException, Exception {
+ this.config = context.getPluginConfiguration();
+ path = config.getSimpleValue("path", null);
+ this.context = context;
+ key = context.getResourceKey();
+
+ }
+
+ public void stop() {
+ // TODO: Customise this generated block
+ }
+
+ public AvailabilityType getAvailability() {
+ return AvailabilityType.UP; // TODO: Customise this generated block
+ }
+
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
new file mode 100644
index 0000000..7833f67
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -0,0 +1,117 @@
+/*
+ * 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.json.JSONObject;
+
+/**
+ * Discover subsystems
+ *
+ * @author Heiko W. Rupp
+ */
+public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
+ throws InvalidPluginConfigurationException, Exception {
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+
+
+ BaseComponent parentComponent = context.getParentResourceComponent();
+ ASConnection connection = parentComponent.getASConnection();
+
+
+ Configuration config = context.getDefaultPluginConfiguration();
+ String cpath = config.getSimpleValue("path", null);
+ boolean recursive = false;
+
+ String path;
+ if (cpath.endsWith("/*")) {
+ path = cpath.substring(0,cpath.length()-2);
+ recursive = true;
+ }
+ else
+ path = cpath;
+
+
+ JSONObject o = connection.getLevelData(path,recursive, false);
+ if (!connection.isErrorReply(o)) {
+ if (recursive) {
+ int i = path.lastIndexOf("/");
+ String subPath = path.substring(i+1);
+
+ o = o.getJSONObject(subPath);
+
+ Iterator keyIter = o.keys() ;
+ while (keyIter.hasNext()) {
+
+ String key = (String) keyIter.next();
+
+ String resKey = context.getParentResourceContext().getResourceKey() + "/" + key;
+ String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // Type
+ path + "/" + key, // Key
+ name, // Name
+ null, // Version
+ path, // Description
+ config,
+ null);
+ details.add(detail);
+ }
+
+ }
+ else {
+
+
+ String resKey = context.getParentResourceContext().getResourceKey();
+ String name = resKey.substring(resKey.lastIndexOf("/") + 1);
+
+
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
+ context.getResourceType(), // Type
+ path, // Key
+ name, // Name
+ null, // Version
+ path, // Description
+ config,
+ null);
+ details.add(detail);
+ }
+
+ return details;
+ }
+
+ return Collections.emptySet();
+ }
+
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarComponent.java
new file mode 100644
index 0000000..7382a6d
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarComponent.java
@@ -0,0 +1,58 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.inventory.DeleteResourceFacet;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+
+/**
+ * Monitoring of war files
+ *
+ * @author Heiko W. Rupp
+ */
+public class WarComponent implements ResourceComponent<BaseComponent>, DeleteResourceFacet {
+
+ ResourceContext<BaseComponent> context;
+
+ public void start(ResourceContext<BaseComponent> context) throws InvalidPluginConfigurationException, Exception {
+ this.context = context;
+ }
+
+ public void stop() {
+ }
+
+ public AvailabilityType getAvailability() {
+ return AvailabilityType.UP;
+ }
+
+ public void deleteResource() throws Exception {
+//
+// DomainDeploymentManager deploymentManager = client.getDeploymentManager();
+// DeploymentPlanBuilder builder = deploymentManager.newDeploymentPlan();
+//
+// String name = context.getResourceKey(); // key and name are the same at the moment
+//
+// UndeployDeploymentPlanBuilder udpb = builder.undeploy(name);
+// RemoveDeploymentPlanBuilder rdpb = udpb.andRemoveUndeployed();
+// rdpb.build();
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarDiscovery.java
new file mode 100644
index 0000000..adadcba
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/WarDiscovery.java
@@ -0,0 +1,45 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.modules.plugins.jbossas7;
+
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Discover war files
+ *
+ * @author Heiko W. Rupp
+ */
+public class WarDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
+ throws InvalidPluginConfigurationException, Exception {
+
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>();
+
+ BaseComponent baseComponent = context.getParentResourceComponent();
+
+ return details;
+ }
+}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
new file mode 100644
index 0000000..e29d0d2
--- /dev/null
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE plugin [
+
+ <!ENTITY logSources '
+ <c:group name="event" displayName="Events">
+ <c:list-property name="logEventSources">
+ <c:map-property name="logEventSource">
+ <c:simple-property name="logFilePath" type="file" summary="true"
+ description="The absolute path to the source log file."/>
+ <c:simple-property name="enabled" type="boolean" summary="true"
+ description="A flag indicating whether of not this log Event source is currently
+ enabled (i.e. whether the associated log file should be tailed for
+ new entries)."/>
+ <c:simple-property name="dateFormat" required="false"
+ description="The date format to use when parsing the dates in log entries. The
+ format must be in the syntax defined by the Java SimpleDateFormat
+ class. If not specified, the three date formats that are predefined
+ by Log4J (ISO8601, DATE, and ABSOLUTE) will be tried."/>
+ <c:simple-property name="includesPattern" required="false"
+ description="A regular expression against which a log entrys detail is matched
+ to determine if an Event should be fired for that entry. If not
+ specified, no filtering of log entries will be done based on their
+ detail."/>
+ <c:simple-property name="minimumSeverity" required="false" default="error"
+ description="The minimum severity of Events that should be collected for this
+ source. If not specified, there is no minimum severity (i.e. all
+ events will be collected).">
+ <c:property-options>
+ <c:option name="debug" value="debug"/>
+ <c:option name="info" value="info"/>
+ <c:option name="warn" value="warn"/>
+ <c:option name="error" value="error"/>
+ <c:option name="fatal" value="fatal"/>
+ </c:property-options>
+ </c:simple-property>
+ </c:map-property>
+ </c:list-property>
+ </c:group>
+'>
+
+ ]>
+
+<plugin name="jboss-as-7"
+ displayName="JBoss-AS-7-Plugin"
+ description="Management of JBossAS 7"
+ package="org.rhq.modules.plugins.jbossas7"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration"
+ version="4.0.0-SNAPSHOT"
+ >
+
+ <depends plugin="JMX"/>
+
+
+ <!-- TODO I think we should introduce an abstract AS7 plugin that contains some base functionality and then
+ ~~ additional 'Personalities' for the kinds of servers (PM, SM, Standalone AS, Managed AS)
+ -->
+
+ <server name="ProcessController"
+ discovery="BaseDiscovery"
+ class="BaseComponent"
+ description="Reaper process for other AS7 servicees"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="hostname" default="localhost" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" required="true"/>
+
+ &logSources;
+ </plugin-configuration>
+
+ <process-scan name="ProcessManager" query="process|basename|match=^java.*,arg|org.jboss.as.process-controller|match=.*"/>
+
+
+ <operation name="dummyOperation">
+ <!-- TODO supply parameters and return values -->
+ </operation>
+
+ <!--
+ <server name="ProcessManager JVM"
+ description="JVM of the ProcessManager"
+ sourcePlugin="JMX"
+ sourceType="JMX Server"
+ discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
+ class="org.rhq.plugins.jmx.JMXServerComponent"
+ singleton="true"
+ />
+ -->
+
+
+
+ </server>
+
+ <server name="JBossAS (Standalone)"
+ discovery="BaseDiscovery"
+ class="BaseComponent"
+ >
+
+ <plugin-configuration>
+ <c:simple-property name="hostname" default="localhost" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" required="true"/>
+ <c:list-property name="system-properties">
+ <c:map-property name="system-property">
+ <c:simple-property name="key" readOnly="true"/>
+ <c:simple-property name="value" readOnly="true"/>
+ </c:map-property>
+ </c:list-property>
+ &logSources;
+ </plugin-configuration>
+
+ <process-scan name="StandaloneAS" query="process|basename|match=^java.*,arg|org.jboss.as.standalone|match=.*"/>
+
+
+ <operation name="dummyOperation">
+ <!-- TODO supply parameters and return values -->
+ </operation>
+ <!--
+ <server name="JBoss AS standalone JVM"
+ description="JVM of the standalone JBossAS"
+ sourcePlugin="JMX"
+ sourceType="JMX Server"
+ discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
+ class="org.rhq.plugins.jmx.JMXServerComponent"
+ singleton="true"
+ />
+ -->
+
+ <server name="Messaging"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent">
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/messaging"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:simple-property name="journal-min-files" />
+ <c:simple-property name="journal-type" />
+ </resource-configuration>
+
+
+ <service name="Acceptor"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/messaging/acceptor"/>
+ </plugin-configuration>
+
+
+ </service>
+
+ </server>
+
+ <server name="JBossWeb"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/web"/>
+ </plugin-configuration>
+
+ <service name="Connector"
+ discovery="SubsystemDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="path" readOnly="true" default="/subsystem/web/connector/*"/>
+ </plugin-configuration>
+
+ <metric property="bytesSent" measurementType="trendsup"/>
+ <metric property="bytesReceived" measurementType="trendsup"/>
+ <metric property="processingTime" measurementType="trendsup"/>
+ <metric property="errorCount" measurementType="trendsup"/>
+ <metric property="maxTime" />
+ <metric property="requestCount" measurementType="trendsup"/>
+
+ </service>
+
+
+ </server>
+ </server>
+
+ <server name="JBossAS (Managed)"
+ discovery="BaseDiscovery"
+ class="BaseComponent"
+ >
+ <plugin-configuration>
+ <c:simple-property name="hostname" default="localhost" required="true"/>
+ <c:simple-property name="port" default="9990" type="integer" required="true"/>
+
+ &logSources;
+ </plugin-configuration>
+
+ <process-scan name="ManagedAS" query="process|basename|match=^java.*,arg|org.jboss.as.server|match=.*"/>
+
+
+ <metric property="serverGroup" dataType="trait" displayType="summary" />
+ <resource-configuration>
+ <!--<c:group name="interfaces">-->
+ <c:simple-property name="loopback" default="127.0.0.1" />
+ <c:simple-property name="external" default="any" />
+ <c:simple-property name="public" default="any" />
+ <!--</c:group>-->
+ </resource-configuration>
+
+ <server name="JBoss AS managed JVM"
+ description="JVM of the managed JBossAS"
+ sourcePlugin="JMX"
+ sourceType="JMX Server"
+ discovery="org.rhq.plugins.jmx.LocalJMXServerDiscoveryComponent"
+ class="org.rhq.plugins.jmx.JMXServerComponent"
+ singleton="true"
+ />
+
+ </server>
+
+</plugin>
diff --git a/modules/plugins/pom.xml b/modules/plugins/pom.xml
index 1582597..de1fad6 100644
--- a/modules/plugins/pom.xml
+++ b/modules/plugins/pom.xml
@@ -115,6 +115,7 @@
<module>rhq-server</module>
<module>jboss-cache</module>
<module>jboss-as-5</module>
+ <module>jboss-as-7</module>
<module>jboss-cache-v3</module>
<!-- was not in Jopr build at merge time <module>jbossOSGi</module> -->
<module>database</module>
12 years, 10 months
[rhq] Branch 'drift' - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 6
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java | 25
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java | 85 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigDataSource.java | 293 ---------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java | 299 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java | 178 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java | 232 +++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java | 131 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java | 40 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DriftGWTService.java | 50 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DriftGWTServiceImpl.java | 43 +
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 9
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 9
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 9
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 9
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java | 1
22 files changed, 1153 insertions(+), 321 deletions(-)
New commits:
commit 6b100b8eb5b0bfd672809991afe2bd517df546a4
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jun 23 16:56:51 2011 -0400
More drift GUI hooks
- added drift -> configuration subtab
- a bunch of untested support for listing, displaying drift configs
but waiting now for some actual configs, and impl of add confog wizard
- added DriftConfigurationDefinition singleton class
-
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 9b3808a..f1e99bc 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3405,19 +3405,19 @@
<statement>
INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
default_value, order_index, dtype, config_def_id)
- VALUES (2, 'enabled', 'Enabled', 'Enables or disables the drift configuration', true, 'boolean',
+ VALUES (2, 'enabled', 'Enabled', 'Enables or disables drift detection for this configuration', true, 'boolean',
'false', 1, 'property', 1)
</statement>
<statement>
INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
order_index, dtype, config_def_id)
- VALUES (3, 'basedir', 'Base Directory', 'The root directory from which snapshots will be generated during drift monitoring.',
+ VALUES (3, 'basedir', 'Base Directory', 'The base directory from which files will be monitored for drift.',
true, 'string', 2, 'property', 1)
</statement>
<statement>
INSERT INTO rhq_config_prop_def (id, name, display_name, description, required, simple_type,
order_index, dtype, default_value, config_def_id)
- VALUES (4, 'interval', 'Interval', 'The frequency in seconds in which drift monitoring should run. Defaults to thirty minutes.',
+ VALUES (4, 'interval', 'Interval', 'The interval, in seconds, between drift detection scans for this configuration. Default is thirty minutes.',
false, 'long', 3, 'property', '1800', 1)
</statement>
<statement>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
index 2f358e9..c09b473 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
@@ -1,3 +1,21 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.core.domain.drift;
import static java.util.Collections.emptyList;
@@ -16,6 +34,9 @@ import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.resource.Resource;
+/**
+ * @author John Sanda
+ */
public class DriftConfiguration implements Serializable {
private static final long serialVersionUID = 1L;
@@ -101,6 +122,10 @@ public class DriftConfiguration implements Serializable {
return configuration;
}
+ public int getId() {
+ return configuration.getId();
+ }
+
public String getName() {
return configuration.getSimpleValue("name", "");
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
new file mode 100644
index 0000000..4279049
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
@@ -0,0 +1,85 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.domain.drift;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertySimpleType;
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class DriftConfigurationDefinition {
+
+ static private final ConfigurationDefinition INSTANCE = new ConfigurationDefinition("GLOBAL_DRIFT_CONFIG_DEF",
+ "The drift configuration definition");
+
+ static {
+ INSTANCE.setId(1);
+ Map<String, PropertyDefinition> propDefs = new HashMap<String, PropertyDefinition>();
+ PropertyDefinitionSimple propDef;
+
+ propDef = new PropertyDefinitionSimple("name", "The drift configuration name", true, PropertySimpleType.STRING);
+ propDefs.put("name", propDef);
+
+ propDef = new PropertyDefinitionSimple("name", "The drift configuration name", true, PropertySimpleType.STRING);
+ propDef.setId(1);
+ propDef.setDisplayName("Drift Configuration Name");
+ propDef.setOrder(0);
+ propDef.setConfigurationDefinition(INSTANCE);
+ propDefs.put("name", propDef);
+
+ propDef = new PropertyDefinitionSimple("enabled", "Enabled", true, PropertySimpleType.BOOLEAN);
+ propDef.setId(2);
+ propDef.setDisplayName("Enables or disables drift detection for this configuration");
+ propDef.setOrder(1);
+ propDef.setDefaultValue("false");
+ propDef.setConfigurationDefinition(INSTANCE);
+ propDefs.put("enabled", propDef);
+
+ propDef = new PropertyDefinitionSimple("basedir", "Base Directory", true, PropertySimpleType.STRING);
+ propDef.setId(3);
+ propDef.setDisplayName("The base directory from which files will be monitored for drift.");
+ propDef.setOrder(2);
+ propDef.setConfigurationDefinition(INSTANCE);
+ propDefs.put("basedir", propDef);
+
+ propDef = new PropertyDefinitionSimple("interval", "Interval", false, PropertySimpleType.LONG);
+ propDef.setId(4);
+ propDef
+ .setDisplayName("The interval, in seconds, between drift detection scans for this configuration. Default is 30 minutes.");
+ propDef.setOrder(3);
+ propDef.setDefaultValue("1800");
+ propDef.setConfigurationDefinition(INSTANCE);
+ propDefs.put("interval", propDef);
+
+ //TODO, add the include/exclude list of maps
+
+ INSTANCE.setPropertyDefinitions(propDefs);
+ }
+
+ static public ConfigurationDefinition getInstance() {
+ return INSTANCE;
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
index c1bfb95..30523b3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
@@ -222,6 +222,10 @@ public class LinkManager {
return "#Resource/" + resourceId + "/Drift/History/" + driftId;
}
+ public static String getSubsystemDriftConfigLink(int resourceId, int driftConfigId) {
+ return "#Resource/" + resourceId + "/Drift/Config/" + driftConfigId;
+ }
+
public static String getAutodiscoveryQueueLink() {
if (GWT) {
return "#Administration/Security/Auto%20Discovery%20Queue";
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigDataSource.java
deleted file mode 100644
index d5cf5dd..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigDataSource.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client.drift;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import com.allen_sauer.gwt.log.client.Log;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.data.DSRequest;
-import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.rpc.RPCResponse;
-import com.smartgwt.client.widgets.grid.CellFormatter;
-import com.smartgwt.client.widgets.grid.HoverCustomizer;
-import com.smartgwt.client.widgets.grid.ListGridField;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-
-import org.rhq.core.domain.common.EntityContext;
-import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.drift.DriftConfiguration;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.AncestryUtil;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback;
-import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
-
-/**
- * @author Jay Shaughnessy
- */
-public class DriftConfigDataSource extends RPCDataSource<DriftConfiguration, ResourceCriteria> {
-
- public static final String FILTER_CATEGORIES = "categories";
-
- private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
-
- private EntityContext entityContext;
-
- public DriftConfigDataSource() {
- this(EntityContext.forSubsystemView());
- }
-
- public DriftConfigDataSource(EntityContext context) {
- super();
- this.entityContext = context;
-
- addDataSourceFields();
- }
-
- /**
- * The view that contains the list grid which will display this datasource's data will call this
- * method to get the field information which is used to control the display of the data.
- *
- * @return list grid fields used to display the datasource data
- */
- public ArrayList<ListGridField> getListGridFields() {
- ArrayList<ListGridField> fields = new ArrayList<ListGridField>(6);
-
- ListGridField nameField = new ListGridField("name", MSG.common_title_name());
- fields.add(nameField);
-
- ListGridField intervalField = new ListGridField("interval", MSG.common_title_interval());
- fields.add(intervalField);
-
- ListGridField baseDirField = new ListGridField("baseDir", MSG.view_drift_table_baseDir());
- fields.add(baseDirField);
-
- if (this.entityContext.type != EntityContext.Type.Resource) {
- ListGridField resourceNameField = new ListGridField(AncestryUtil.RESOURCE_NAME, MSG.common_title_resource());
- resourceNameField.setCellFormatter(new CellFormatter() {
- public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
- String url = LinkManager
- .getResourceLink(listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID));
- return SeleniumUtility.getLocatableHref(url, o.toString(), null);
- }
- });
- resourceNameField.setShowHover(true);
- resourceNameField.setHoverCustomizer(new HoverCustomizer() {
-
- public String hoverHTML(Object value, ListGridRecord listGridRecord, int rowNum, int colNum) {
- return AncestryUtil.getResourceHoverHTML(listGridRecord, 0);
- }
- });
- fields.add(resourceNameField);
-
- ListGridField ancestryField = AncestryUtil.setupAncestryListGridField();
- fields.add(ancestryField);
-
- nameField.setWidth("15%");
- intervalField.setWidth(100);
- baseDirField.setWidth("20%");
- resourceNameField.setWidth("25%");
- ancestryField.setWidth("40%");
- } else {
- nameField.setWidth("15%");
- intervalField.setWidth(100);
- baseDirField.setWidth("85%");
- }
-
- return fields;
- }
-
- @Override
- protected void executeFetch(final DSRequest request, final DSResponse response, final ResourceCriteria criteria) {
-
- final long start = System.currentTimeMillis();
-
- this.resourceService.findResourcesByCriteria(criteria, new AsyncCallback<PageList<Resource>>() {
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_inventory_resources_loadFailed(), caught);
- response.setStatus(RPCResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
-
- public void onSuccess(PageList<Resource> result) {
- if (Log.isDebugEnabled()) {
- long fetchTime = System.currentTimeMillis() - start;
- Log.debug(result.size() + " resources (with drift configs) fetched in: " + fetchTime + "ms");
- }
-
- dataRetrieved(result, response, request);
- }
- });
- }
-
- /**
- * Additional processing to support entity-specific or cross-resource views, and something that can be overidden.
- */
- protected void dataRetrieved(final PageList<Resource> result, final DSResponse response, final DSRequest request) {
- switch (entityContext.type) {
-
- // no need to disambiguate, the dift configs are for a single resource
- case Resource:
- Set<DriftConfiguration> driftConfigs = DriftConfiguration.valueOf(result.get(0));
- response.setData(buildRecords(driftConfigs));
- // for paging to work we have to specify size of full result set
- response.setTotalRows(getTotalRows(driftConfigs, response, request));
- processResponse(request.getRequestId(), response);
- break;
-
- // disambiguate as the results could be cross-resource
- default:
- Set<Integer> typesSet = new HashSet<Integer>();
- Set<String> ancestries = new HashSet<String>();
- for (Resource resource : result) {
- typesSet.add(resource.getResourceType().getId());
- ancestries.add(resource.getAncestry());
- }
-
- // In addition to the types of the result resources, get the types of their ancestry
- typesSet.addAll(AncestryUtil.getAncestryTypeIds(ancestries));
-
- ResourceTypeRepository typeRepo = ResourceTypeRepository.Cache.getInstance();
- typeRepo.getResourceTypes(typesSet.toArray(new Integer[typesSet.size()]), new TypesLoadedCallback() {
- @Override
- public void onTypesLoaded(Map<Integer, ResourceType> types) {
- // Smartgwt has issues storing a Map as a ListGridRecord attribute. Wrap it in a pojo.
- AncestryUtil.MapWrapper typesWrapper = new AncestryUtil.MapWrapper(types);
-
- Set<DriftConfiguration> driftConfigs = getDriftConfigs(result);
- Record[] records = buildRecords(driftConfigs);
- for (Record record : records) {
- // To avoid a lot of unnecessary String construction, be lazy about building ancestry hover text.
- // Store the types map off the records so we can build a detailed hover string as needed.
- record.setAttribute(AncestryUtil.RESOURCE_ANCESTRY_TYPES, typesWrapper);
-
- // Build the decoded ancestry Strings now for display
- record
- .setAttribute(AncestryUtil.RESOURCE_ANCESTRY_VALUE, AncestryUtil.getAncestryValue(record));
- }
- response.setData(records);
- // for paging to work we have to specify size of full result set
- response.setTotalRows(getTotalRows(driftConfigs, response, request));
- processResponse(request.getRequestId(), response);
- }
- });
- }
- }
-
- private Set<DriftConfiguration> getDriftConfigs(PageList<Resource> resources) {
- Set<DriftConfiguration> result = new HashSet<DriftConfiguration>();
- for (Resource resource : resources) {
- result.addAll(DriftConfiguration.valueOf(resource.getDriftConfigurations()));
- }
- return result;
- }
-
- /**
- * Sub-classes can override this to add fine-grained control over the result set size. By default the
- * total rows are set to the total result set for the query, allowing proper paging. But some views (portlets)
- * may want to limit results to a small set (like most recent).
- * @param result
- * @param response
- * @param request
- *
- * @return should not exceed result.size().
- */
- protected int getTotalRows(final Set<DriftConfiguration> result, final DSResponse response, final DSRequest request) {
-
- return result.size();
- }
-
- @Override
- protected ResourceCriteria getFetchCriteria(DSRequest request) {
-
- ResourceCriteria criteria = new ResourceCriteria();
- criteria.fetchDriftConfigurations(true);
- criteria.setPageControl(getPageControl(request));
-
- return criteria;
- }
-
- @Override
- protected String getSortFieldForColumn(String columnName) {
- if (AncestryUtil.RESOURCE_ANCESTRY.equals(columnName)) {
- return "ancestry";
- }
-
- return super.getSortFieldForColumn(columnName);
- }
-
- @Override
- public DriftConfiguration copyValues(Record from) {
- return null;
- }
-
- @Override
- public ListGridRecord copyValues(DriftConfiguration from) {
- return convert(from);
- }
-
- public static ListGridRecord convert(DriftConfiguration from) {
- ListGridRecord record = new ListGridRecord();
- record.setAttribute("name", from.getName());
- record.setAttribute("interval", from.getInterval());
- record.setAttribute("baseDir", from.getBasedir());
- record.setAttribute("enabled", from.getEnabled());
-
- Resource resource = from.getResource();
-
- // for ancestry handling
- record.setAttribute(AncestryUtil.RESOURCE_ID, resource.getId());
- record.setAttribute(AncestryUtil.RESOURCE_NAME, resource.getName());
- record.setAttribute(AncestryUtil.RESOURCE_ANCESTRY, resource.getAncestry());
- record.setAttribute(AncestryUtil.RESOURCE_TYPE_ID, resource.getResourceType().getId());
-
- return record;
- }
-
- protected void executeRemove(Record recordToRemove, final DSRequest request, final DSResponse response) {
- Window.alert(String.valueOf(recordToRemove.getAttributeAsInt("id")));
- }
-
- public ResourceGWTServiceAsync getResourceService() {
- return resourceService;
- }
-
- protected EntityContext getEntityContext() {
- return entityContext;
- }
-
- protected void setEntityContext(EntityContext entityContext) {
- this.entityContext = entityContext;
- }
-
-}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
new file mode 100644
index 0000000..ba942b0
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
@@ -0,0 +1,299 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.drift;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.rpc.RPCResponse;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.HoverCustomizer;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.AncestryUtil;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class DriftConfigurationDataSource extends RPCDataSource<DriftConfiguration, ResourceCriteria> {
+
+ public static final String FILTER_CATEGORIES = "categories";
+
+ private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
+
+ private EntityContext entityContext;
+
+ public DriftConfigurationDataSource() {
+ this(EntityContext.forSubsystemView());
+ }
+
+ public DriftConfigurationDataSource(EntityContext context) {
+ super();
+ this.entityContext = context;
+
+ addDataSourceFields();
+ }
+
+ /**
+ * The view that contains the list grid which will display this datasource's data will call this
+ * method to get the field information which is used to control the display of the data.
+ *
+ * @return list grid fields used to display the datasource data
+ */
+ public ArrayList<ListGridField> getListGridFields() {
+ ArrayList<ListGridField> fields = new ArrayList<ListGridField>(6);
+
+ ListGridField nameField = new ListGridField("name", MSG.common_title_name());
+ fields.add(nameField);
+
+ ListGridField intervalField = new ListGridField("interval", MSG.common_title_interval());
+ fields.add(intervalField);
+
+ ListGridField baseDirField = new ListGridField("baseDir", MSG.view_drift_table_baseDir());
+ fields.add(baseDirField);
+
+ ListGridField enabledField = new ListGridField("enabled", MSG.common_title_enabled());
+ fields.add(enabledField);
+
+ if (this.entityContext.type != EntityContext.Type.Resource) {
+ ListGridField resourceNameField = new ListGridField(AncestryUtil.RESOURCE_NAME, MSG.common_title_resource());
+ resourceNameField.setCellFormatter(new CellFormatter() {
+ public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
+ String url = LinkManager
+ .getResourceLink(listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID));
+ return SeleniumUtility.getLocatableHref(url, o.toString(), null);
+ }
+ });
+ resourceNameField.setShowHover(true);
+ resourceNameField.setHoverCustomizer(new HoverCustomizer() {
+
+ public String hoverHTML(Object value, ListGridRecord listGridRecord, int rowNum, int colNum) {
+ return AncestryUtil.getResourceHoverHTML(listGridRecord, 0);
+ }
+ });
+ fields.add(resourceNameField);
+
+ ListGridField ancestryField = AncestryUtil.setupAncestryListGridField();
+ fields.add(ancestryField);
+
+ nameField.setWidth("15%");
+ intervalField.setWidth(100);
+ enabledField.setWidth("5%");
+ baseDirField.setWidth("20%");
+ resourceNameField.setWidth("20%");
+ ancestryField.setWidth("40%");
+ } else {
+ nameField.setWidth("15%");
+ intervalField.setWidth(100);
+ enabledField.setWidth("5%");
+ baseDirField.setWidth("80%");
+ }
+
+ return fields;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response, final ResourceCriteria criteria) {
+
+ final long start = System.currentTimeMillis();
+
+ this.resourceService.findResourcesByCriteria(criteria, new AsyncCallback<PageList<Resource>>() {
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_inventory_resources_loadFailed(), caught);
+ response.setStatus(RPCResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<Resource> result) {
+ if (Log.isDebugEnabled()) {
+ long fetchTime = System.currentTimeMillis() - start;
+ Log.debug(result.size() + " resources (with drift configs) fetched in: " + fetchTime + "ms");
+ }
+
+ dataRetrieved(result, response, request);
+ }
+ });
+ }
+
+ /**
+ * Additional processing to support entity-specific or cross-resource views, and something that can be overidden.
+ */
+ protected void dataRetrieved(final PageList<Resource> result, final DSResponse response, final DSRequest request) {
+ switch (entityContext.type) {
+
+ // no need to disambiguate, the dift configs are for a single resource
+ case Resource:
+ Set<DriftConfiguration> driftConfigs = DriftConfiguration.valueOf(result.get(0));
+ response.setData(buildRecords(driftConfigs));
+ // for paging to work we have to specify size of full result set
+ response.setTotalRows(getTotalRows(driftConfigs, response, request));
+ processResponse(request.getRequestId(), response);
+ break;
+
+ // disambiguate as the results could be cross-resource
+ default:
+ Set<Integer> typesSet = new HashSet<Integer>();
+ Set<String> ancestries = new HashSet<String>();
+ for (Resource resource : result) {
+ typesSet.add(resource.getResourceType().getId());
+ ancestries.add(resource.getAncestry());
+ }
+
+ // In addition to the types of the result resources, get the types of their ancestry
+ typesSet.addAll(AncestryUtil.getAncestryTypeIds(ancestries));
+
+ ResourceTypeRepository typeRepo = ResourceTypeRepository.Cache.getInstance();
+ typeRepo.getResourceTypes(typesSet.toArray(new Integer[typesSet.size()]), new TypesLoadedCallback() {
+ @Override
+ public void onTypesLoaded(Map<Integer, ResourceType> types) {
+ // Smartgwt has issues storing a Map as a ListGridRecord attribute. Wrap it in a pojo.
+ AncestryUtil.MapWrapper typesWrapper = new AncestryUtil.MapWrapper(types);
+
+ Set<DriftConfiguration> driftConfigs = getDriftConfigs(result);
+ Record[] records = buildRecords(driftConfigs);
+ for (Record record : records) {
+ // To avoid a lot of unnecessary String construction, be lazy about building ancestry hover text.
+ // Store the types map off the records so we can build a detailed hover string as needed.
+ record.setAttribute(AncestryUtil.RESOURCE_ANCESTRY_TYPES, typesWrapper);
+
+ // Build the decoded ancestry Strings now for display
+ record
+ .setAttribute(AncestryUtil.RESOURCE_ANCESTRY_VALUE, AncestryUtil.getAncestryValue(record));
+ }
+ response.setData(records);
+ // for paging to work we have to specify size of full result set
+ response.setTotalRows(getTotalRows(driftConfigs, response, request));
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ }
+
+ private Set<DriftConfiguration> getDriftConfigs(PageList<Resource> resources) {
+ Set<DriftConfiguration> result = new HashSet<DriftConfiguration>();
+ for (Resource resource : resources) {
+ result.addAll(DriftConfiguration.valueOf(resource.getDriftConfigurations()));
+ }
+ return result;
+ }
+
+ /**
+ * Sub-classes can override this to add fine-grained control over the result set size. By default the
+ * total rows are set to the total result set for the query, allowing proper paging. But some views (portlets)
+ * may want to limit results to a small set (like most recent).
+ * @param result
+ * @param response
+ * @param request
+ *
+ * @return should not exceed result.size().
+ */
+ protected int getTotalRows(final Set<DriftConfiguration> result, final DSResponse response, final DSRequest request) {
+
+ return result.size();
+ }
+
+ @Override
+ protected ResourceCriteria getFetchCriteria(DSRequest request) {
+
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.fetchDriftConfigurations(true);
+ criteria.setPageControl(getPageControl(request));
+
+ return criteria;
+ }
+
+ @Override
+ protected String getSortFieldForColumn(String columnName) {
+ if (AncestryUtil.RESOURCE_ANCESTRY.equals(columnName)) {
+ return "ancestry";
+ }
+
+ return super.getSortFieldForColumn(columnName);
+ }
+
+ @Override
+ public DriftConfiguration copyValues(Record from) {
+ return null;
+ }
+
+ @Override
+ public ListGridRecord copyValues(DriftConfiguration from) {
+ return convert(from);
+ }
+
+ public static ListGridRecord convert(DriftConfiguration from) {
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute("id", from.getId());
+ record.setAttribute("name", from.getName());
+ record.setAttribute("interval", from.getInterval());
+ record.setAttribute("baseDir", from.getBasedir());
+ record.setAttribute("enabled", from.getEnabled());
+
+ Resource resource = from.getResource();
+
+ // for ancestry handling
+ record.setAttribute(AncestryUtil.RESOURCE_ID, resource.getId());
+ record.setAttribute(AncestryUtil.RESOURCE_NAME, resource.getName());
+ record.setAttribute(AncestryUtil.RESOURCE_ANCESTRY, resource.getAncestry());
+ record.setAttribute(AncestryUtil.RESOURCE_TYPE_ID, resource.getResourceType().getId());
+
+ return record;
+ }
+
+ protected void executeRemove(Record recordToRemove, final DSRequest request, final DSResponse response) {
+ Window.alert(String.valueOf(recordToRemove.getAttributeAsInt("id")));
+ }
+
+ public ResourceGWTServiceAsync getResourceService() {
+ return resourceService;
+ }
+
+ protected EntityContext getEntityContext() {
+ return entityContext;
+ }
+
+ protected void setEntityContext(EntityContext entityContext) {
+ this.entityContext = entityContext;
+ }
+
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java
new file mode 100644
index 0000000..3b236c8
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java
@@ -0,0 +1,178 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.drift;
+
+import java.util.EnumSet;
+import java.util.Map;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.RefreshableView;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * A view for editing a Resource's configuration.
+ *
+ * @author Jay Shaughnessy
+ */
+public class DriftConfigurationEditView extends LocatableVLayout implements PropertyValueChangeListener,
+ RefreshableView {
+
+ private EntityContext context;
+ private int driftConfigId;
+ private DriftConfiguration driftConfig;
+ private boolean hasWriteAccess;
+ private ConfigurationEditor editor;
+ private ToolStrip buttonbar;
+ private IButton saveButton;
+
+ private boolean refreshing = false;
+
+ public DriftConfigurationEditView(String locatorId, EntityContext context, int driftConfigId, boolean hasWriteAccess) {
+ super(locatorId);
+
+ this.context = context;
+ this.driftConfigId = driftConfigId;
+ this.hasWriteAccess = hasWriteAccess;
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ this.buttonbar = new ToolStrip();
+ buttonbar.setWidth100();
+ buttonbar.setExtraSpace(10);
+ buttonbar.setMembersMargin(5);
+ buttonbar.setLayoutMargin(5);
+
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"), MSG.common_button_save());
+ this.saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ save();
+ }
+ });
+ buttonbar.addMember(saveButton);
+ // The button bar will remain hidden until the configuration has been successfully loaded.
+ buttonbar.setVisible(false);
+ addMember(buttonbar);
+
+ refresh();
+
+ if (!this.hasWriteAccess) {
+ Message message = new Message(MSG.view_configurationDetails_noPermission(), Message.Severity.Info, EnumSet
+ .of(Message.Option.Transient, Message.Option.Sticky));
+ CoreGUI.getMessageCenter().notify(message);
+ }
+ }
+
+ @Override
+ public void refresh() {
+ if (this.refreshing) {
+ return; // we are already in the process of refreshing, don't do it again
+ }
+
+ this.refreshing = true;
+ this.buttonbar.setVisible(false);
+
+ if (editor != null) {
+ editor.destroy();
+ removeMember(editor);
+ }
+
+ GWTServiceLookup.getConfigurationService().getConfiguration(driftConfigId, new AsyncCallback<Configuration>() {
+ @Override
+ public void onSuccess(final Configuration result) {
+
+ editor = new ConfigurationEditor(extendLocatorId("Editor"), DriftConfigurationDefinition.getInstance(),
+ result);
+ editor.setOverflow(Overflow.AUTO);
+ editor.addPropertyValueChangeListener(DriftConfigurationEditView.this);
+ editor.setReadOnly(!hasWriteAccess);
+ addMember(editor);
+
+ saveButton.disable();
+ buttonbar.setVisible(true);
+ markForRedraw();
+ refreshing = false;
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ refreshing = false;
+ CoreGUI.getErrorHandler().handleError("Failed to load configuration.", caught);
+ }
+ });
+ }
+
+ private void save() {
+ Configuration updatedConfiguration = editor.getConfiguration();
+
+ GWTServiceLookup.getDriftService().updateDriftConfiguration(context,
+ new DriftConfiguration(updatedConfiguration), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_configurationDetails_error_updateFailure(), caught);
+ }
+
+ public void onSuccess(Void result) {
+ Message message;
+ message = new Message(MSG.view_drift_success_configurationUpdated(), Message.Severity.Info);
+ }
+ });
+ }
+
+ @Override
+ public void propertyValueChanged(PropertyValueChangeEvent event) {
+ MessageCenter messageCenter = CoreGUI.getMessageCenter();
+ Message message;
+ if (event.isInvalidPropertySetChanged()) {
+ Map<String, String> invalidPropertyNames = event.getInvalidPropertyNames();
+ if (invalidPropertyNames.isEmpty()) {
+ this.saveButton.enable();
+ message = new Message(MSG.view_configurationDetails_allPropertiesValid(), Message.Severity.Info,
+ EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
+ } else {
+ this.saveButton.disable();
+ message = new Message(MSG.view_configurationDetails_somePropertiesInvalid(invalidPropertyNames.values()
+ .toString()), Message.Severity.Error, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
+ }
+ messageCenter.notify(message);
+ } else {
+ this.saveButton.enable();
+ }
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java
new file mode 100644
index 0000000..13e5c73
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java
@@ -0,0 +1,232 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.drift;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.ResultSet;
+import com.smartgwt.client.data.SortSpecifier;
+import com.smartgwt.client.types.SortDirection;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.drift.DriftCategory;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
+import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
+import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.AncestryUtil;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+
+/**
+ * A view that displays a paginated table of {@link org.rhq.core.domain.drift.DriftConfiguration}s, along with the
+ * ability to filter (maybe) those drift configs, sort those drift configs, double-click a row to view/edit the
+ * drift config, and perform various actionns: add/delete, etc.
+ * This view full respects the user's authorization, and will not allow actions on the drifts unless the user is
+ * either the inventory manager or has MANAGE_DRIFT permission on every resource corresponding to the drift configs
+ * being operated on.
+ *
+ * @author Jay Shaughnessy
+ */
+public class DriftConfigurationView extends TableSection<DriftConfigurationDataSource> {
+
+ public static final ViewName SUBSYSTEM_VIEW_ID = new ViewName("DriftConfigs", MSG.common_title_configuration());
+
+ private static SortSpecifier DEFAULT_SORT_SPECIFIER = new SortSpecifier("name", SortDirection.ASCENDING);
+
+ private static final Criteria INITIAL_CRITERIA = new Criteria();
+
+ EntityContext context;
+ boolean hasWriteAccess;
+ DriftConfigurationDataSource dataSource;
+
+ static {
+ DriftCategory[] categoryValues = DriftCategory.values();
+ String[] categoryNames = new String[categoryValues.length];
+ int i = 0;
+ for (DriftCategory c : categoryValues) {
+ categoryNames[i++] = c.name();
+ }
+
+ // Add any INITIAL_CRITERIA here (non currently)
+ }
+
+ // for subsystem views
+ public DriftConfigurationView(String locatorId) {
+ this(locatorId, SUBSYSTEM_VIEW_ID.getTitle(), EntityContext.forSubsystemView(), false);
+ }
+
+ public DriftConfigurationView(String locatorId, EntityContext entityContext) {
+ this(locatorId, SUBSYSTEM_VIEW_ID.getTitle(), entityContext, false);
+ }
+
+ public DriftConfigurationView(String locatorId, String tableTitle, EntityContext entityContext) {
+ this(locatorId, tableTitle, entityContext, false);
+ }
+
+ protected DriftConfigurationView(String locatorId, String tableTitle, EntityContext context, boolean hasWriteAccess) {
+ super(locatorId, tableTitle, INITIAL_CRITERIA, new SortSpecifier[] { DEFAULT_SORT_SPECIFIER });
+ this.context = context;
+ this.hasWriteAccess = hasWriteAccess;
+
+ setInitialCriteriaFixed(false);
+ setDataSource(getDataSource());
+ }
+
+ @Override
+ public DriftConfigurationDataSource getDataSource() {
+ if (null == this.dataSource) {
+ this.dataSource = new DriftConfigurationDataSource(context);
+ }
+ return this.dataSource;
+ }
+
+ @Override
+ protected void configureTableFilters() {
+ // currently no table filters
+ }
+
+ @Override
+ protected void configureTable() {
+ ArrayList<ListGridField> dataSourceFields = getDataSource().getListGridFields();
+ getListGrid().setFields(dataSourceFields.toArray(new ListGridField[dataSourceFields.size()]));
+ setupTableInteractions(this.hasWriteAccess);
+
+ super.configureTable();
+ }
+
+ @Override
+ protected String getDetailsLinkColumnName() {
+ return "name";
+ }
+
+ @Override
+ protected CellFormatter getDetailsLinkColumnCellFormatter() {
+ return new CellFormatter() {
+ public String format(Object value, ListGridRecord record, int i, int i1) {
+ Integer resourceId = record.getAttributeAsInt(AncestryUtil.RESOURCE_ID);
+ Integer driftConfigId = getId(record);
+ String url = LinkManager.getSubsystemDriftConfigLink(resourceId, driftConfigId);
+ String formattedValue = TimestampCellFormatter.format(value);
+ return SeleniumUtility.getLocatableHref(url, formattedValue, null);
+ }
+ };
+ }
+
+ protected void setupTableInteractions(final boolean hasWriteAccess) {
+ TableActionEnablement singleTargetEnablement = hasWriteAccess ? TableActionEnablement.ANY
+ : TableActionEnablement.NEVER;
+
+ addTableAction("Add", MSG.common_button_add(), null, new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ ListGrid grid = getListGrid();
+ ResultSet resultSet = (null != grid) ? grid.getResultSet() : null;
+ return (hasWriteAccess && grid != null && resultSet != null && !resultSet.isEmpty());
+ }
+
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ add();
+ }
+ });
+
+ addTableAction("Delete", MSG.common_button_delete(), MSG.view_drift_delete_confirm(), new AbstractTableAction(
+ singleTargetEnablement) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ delete(selection);
+ }
+ });
+
+ addTableAction("DeleteAll", MSG.common_button_delete_all(), MSG.view_drift_delete_confirmAll(),
+ new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ ListGrid grid = getListGrid();
+ ResultSet resultSet = (null != grid) ? grid.getResultSet() : null;
+ return (hasWriteAccess && grid != null && resultSet != null && !resultSet.isEmpty());
+ }
+
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ deleteAll();
+ }
+ });
+ }
+
+ void add() {
+ // TODO: kick off wizard to add new drift config
+ }
+
+ void delete(ListGridRecord[] records) {
+ final int[] driftConfigIds = new int[records.length];
+ for (int i = 0, selectionLength = records.length; i < selectionLength; i++) {
+ ListGridRecord record = records[i];
+ Integer driftConfigId = record.getAttributeAsInt("id");
+ driftConfigIds[i] = driftConfigId;
+ }
+
+ GWTServiceLookup.getDriftService().deleteDriftConfigurations(driftConfigIds, new AsyncCallback<Integer>() {
+ public void onSuccess(Integer resultCount) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_drift_success_deleteConfigs(String.valueOf(resultCount)),
+ Message.Severity.Info));
+ refresh();
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_delete(Arrays.toString(driftConfigIds)),
+ caught);
+ }
+ });
+ }
+
+ void deleteAll() {
+ GWTServiceLookup.getDriftService().deleteDriftConfigurationsByContext(context, new AsyncCallback<Integer>() {
+ public void onSuccess(Integer resultCount) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_drift_success_delete(String.valueOf(resultCount)), Message.Severity.Info));
+ refresh();
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_deleteAll(), caught);
+ }
+ });
+ }
+
+ @Override
+ public Canvas getDetailsView(int driftConfigId) {
+ return new DriftConfigurationEditView(extendLocatorId("ConfigEdit"), context, driftConfigId, hasWriteAccess);
+ }
+
+ public EntityContext getContext() {
+ return context;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
new file mode 100644
index 0000000..79078fa
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
@@ -0,0 +1,131 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.gui.coregui.client.drift;
+
+import static org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter.DATE_TIME_FORMAT_FULL;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+
+import org.rhq.core.domain.criteria.DriftCriteria;
+import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class DriftDetailsView extends LocatableVLayout implements BookmarkableView {
+
+ private int driftId;
+
+ private static DriftDetailsView INSTANCE = new DriftDetailsView("DriftDetailsView");
+
+ public static DriftDetailsView getInstance() {
+ return INSTANCE;
+ }
+
+ private DriftDetailsView(String id) {
+ // access through the static singleton only (see renderView)
+ super(id);
+ }
+
+ private void show(int driftId) {
+ DriftCriteria criteria = new DriftCriteria();
+ criteria.addFilterId(driftId);
+ criteria.fetchChangeSet(true);
+ GWTServiceLookup.getDriftService().findDriftsByCriteria(criteria, new AsyncCallback<PageList<Drift>>() {
+ @Override
+ public void onSuccess(PageList<Drift> result) {
+ Drift drift = result.get(0);
+ show(drift);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_load(), caught);
+ }
+ });
+ }
+
+ private void show(Drift drift) {
+ for (Canvas child : getMembers()) {
+ removeChild(child);
+ }
+
+ DynamicForm form = new LocatableDynamicForm(extendLocatorId("form"));
+ form.setWidth100();
+ form.setHeight100();
+ form.setWrapItemTitles(false);
+
+ StaticTextItem id = new StaticTextItem("id", MSG.common_title_id());
+ id.setValue(drift.getId());
+
+ StaticTextItem path = new StaticTextItem("path", MSG.common_title_path());
+ path.setValue(drift.getPath());
+
+ StaticTextItem timestamp = new StaticTextItem("timestamp", MSG.common_title_timestamp());
+ timestamp.setValue(TimestampCellFormatter.format(drift.getCtime(), DATE_TIME_FORMAT_FULL));
+
+ StaticTextItem category = new StaticTextItem("category", MSG.common_title_category());
+ StaticTextItem oldFile = new StaticTextItem("oldFile", MSG.view_drift_table_oldFile());
+ StaticTextItem newFile = new StaticTextItem("newFile", MSG.view_drift_table_newFile());
+
+ switch (drift.getCategory()) {
+ case FILE_ADDED:
+ category.setValue(MSG.view_drift_category_fileAdded());
+ oldFile.setValue(MSG.common_label_none());
+ newFile.setValue(drift.getNewDriftFile().getHashId());
+ break;
+
+ case FILE_CHANGED:
+ category.setValue(MSG.view_drift_category_fileChanged());
+ oldFile.setValue(drift.getOldDriftFile().getHashId());
+ newFile.setValue(drift.getNewDriftFile().getHashId());
+ break;
+
+ case FILE_REMOVED:
+ category.setValue(MSG.view_drift_category_fileRemoved());
+ oldFile.setValue(drift.getOldDriftFile().getHashId());
+ newFile.setValue(MSG.common_label_none());
+ break;
+ }
+
+ form.setItems(id, path, category, timestamp, oldFile, newFile);
+
+ addMember(form);
+ }
+
+ @Override
+ public void renderView(ViewPath viewPath) {
+ driftId = viewPath.getCurrentAsInt();
+ show(driftId);
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java
index c1dea6d..e0e874b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2011, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
@@ -39,7 +39,6 @@ import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.drift.DriftCategory;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.alert.AlertDetailsView;
import org.rhq.enterprise.gui.coregui.client.components.form.EnumSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
@@ -53,10 +52,10 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
- * A view that displays a paginated table of fired {@link org.rhq.core.domain.drift.Drift}s, along with the
+ * A view that displays a paginated table of {@link org.rhq.core.domain.drift.Drift}s, along with the
* ability to filter those drifts, sort those drifts, double-click a row to view full details a drift, and perform
- * various operations on the the drifts: delete selected, delete all from source, etc.
- * This view full respects the user's authorization, and will not allow operations on the drifts unless the user is
+ * various actions on the the drifts: delete selected, delete all from source, etc.
+ * This view full respects the user's authorization, and will not allow acttions on the drifts unless the user is
* either the inventory manager or has MANAGE_DRIFT permission on every resource corresponding to the drifts being
* operated on.
*
@@ -230,7 +229,7 @@ public class DriftHistoryView extends TableSection<DriftDataSource> {
}
void deleteAll() {
- GWTServiceLookup.getAlertService().deleteAlertsByContext(context, new AsyncCallback<Integer>() {
+ GWTServiceLookup.getDriftService().deleteDriftsByContext(context, new AsyncCallback<Integer>() {
public void onSuccess(Integer resultCount) {
CoreGUI.getMessageCenter().notify(
new Message(MSG.view_drift_success_delete(String.valueOf(resultCount)), Message.Severity.Info));
@@ -280,8 +279,8 @@ public class DriftHistoryView extends TableSection<DriftDataSource> {
// }
@Override
- public Canvas getDetailsView(int alertId) {
- return AlertDetailsView.getInstance();
+ public Canvas getDetailsView(int driftId) {
+ return DriftDetailsView.getInstance();
}
public EntityContext getContext() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java
new file mode 100644
index 0000000..c68ea75
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java
@@ -0,0 +1,40 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.drift;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class ResourceDriftConfigurationView extends DriftConfigurationView {
+ public static ResourceDriftConfigurationView get(String locatorId, ResourceComposite composite) {
+ String tableTitle = MSG.view_drift_table_resourceConfig();
+ EntityContext context = EntityContext.forResource(composite.getResource().getId());
+ boolean hasWriteAccess = composite.getResourcePermission().isDrift();
+ return new ResourceDriftConfigurationView(locatorId, tableTitle, context, hasWriteAccess);
+ }
+
+ private ResourceDriftConfigurationView(String locatorId, String tableTitle, EntityContext context,
+ boolean hasWriteAccess) {
+ super(locatorId, tableTitle, context, hasWriteAccess);
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index bdb5a7d..0898a97 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
@@ -21,7 +21,8 @@ import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
/**
- * API for resource and plugin configurations for resources and groups.
+ * API for resource and plugin configurations for resources and groups, as well as any other
+ * configuration related methods.
*/
@RemoteServiceRelativePath("ConfigurationGWTService")
public interface ConfigurationGWTService extends RemoteService {
@@ -86,4 +87,6 @@ public interface ConfigurationGWTService extends RemoteService {
void deleteGroupResourceConfigurationUpdate(Integer groupId, Integer[] groupResourceConfigUpdateIds)
throws RuntimeException;
+
+ Configuration getConfiguration(int configurationId);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DriftGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DriftGWTService.java
index 9100ce3..56f855f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DriftGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DriftGWTService.java
@@ -20,10 +20,12 @@ package org.rhq.enterprise.gui.coregui.client.gwt;
import com.google.gwt.user.client.rpc.RemoteService;
+import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.DriftChangeSetCriteria;
import org.rhq.core.domain.criteria.DriftCriteria;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSet;
+import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.util.PageList;
/**
@@ -45,6 +47,45 @@ public interface DriftGWTService extends RemoteService {
int deleteDrifts(int[] driftIds) throws RuntimeException;
/**
+ * Delete all drifts for the specified context if the current user has permission to do so (i.e. either
+ * the MANAGE_INVENTORY global permission, or the MANAGE_DRIFT permission for all corresponding resources).
+ * If the user does not have permission for all of the specified drifts, then none of the drifts will be deleted
+ * and a PermissionException will be thrown.
+ *
+ * If the entity does not correspond to an existing entity, it will be gracefully ignored.
+ *
+ * @param entityContext the context for deletion
+ * @return the number of drifts deleted
+ */
+ int deleteDriftsByContext(EntityContext entityContext) throws RuntimeException;
+
+ /**
+ * Delete the drift configs with the specified ids if the current user has permission to do so (i.e. either
+ * the MANAGE_INVENTORY global permission, or the MANAGE_DRIFT permission for all corresponding resources).
+ * If the user does not have permission for all of the specified drift configs, then none of them will be deleted
+ * and a PermissionException will be thrown.
+ *
+ * If any of the ids do not correspond to drift entities that exist, those ids will be gracefully ignored.
+ *
+ * @param driftConfigIds the ids of the drift configs to be deleted
+ * @return the number of drift configs deleted
+ */
+ int deleteDriftConfigurations(int[] driftConfigIds) throws RuntimeException;
+
+ /**
+ * Delete all drift configurations for the specified context if the current user has permission to do so (i.e. either
+ * the MANAGE_INVENTORY global permission, or the MANAGE_DRIFT permission for all corresponding resources).
+ * If the user does not have permission for all of the specified drifts, then none of the drifts will be deleted
+ * and a PermissionException will be thrown.
+ *
+ * If the entity does not correspond to an existing entity, it will be gracefully ignored.
+ *
+ * @param entityContext the context for deletion
+ * @return the number of drift configs deleted
+ */
+ int deleteDriftConfigurationsByContext(EntityContext entityContext) throws RuntimeException;
+
+ /**
* Find all drift changesets that match the specified criteria.
*
* @param criteria the criteria
@@ -62,4 +103,13 @@ public interface DriftGWTService extends RemoteService {
*/
PageList<Drift> findDriftsByCriteria(DriftCriteria criteria) throws RuntimeException;
+ /**
+ * Update the provided driftConfig (identified by name) on the specified EntityContext. If it exists it will be replaced. If not it will
+ * be added. Agents, if available, will be notified of the change.
+ *
+ * @param entityContext
+ * @param driftConfig
+ */
+ void updateDriftConfiguration(EntityContext entityContext, DriftConfiguration driftConfig);
+
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index d5d9de4..d0ec4ee 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -50,6 +50,7 @@ import org.rhq.enterprise.gui.coregui.client.components.tab.SubTab;
import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTab;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.drift.ResourceDriftConfigurationView;
import org.rhq.enterprise.gui.coregui.client.drift.ResourceDriftHistoryView;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.InventoryView;
@@ -136,6 +137,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
private SubTab configHistory;
private SubTab eventHistory;
private SubTab driftHistory;
+ private SubTab driftConfig;
private SubTab contentDeployed;
private SubTab contentNew;
private SubTab contentSubscrip;
@@ -234,9 +236,9 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
.view_tabs_common_drift()), "/images/icons/Configure_grey_16.png");
this.driftHistory = new SubTab(driftTab.extendLocatorId("History"), new ViewName("History", MSG
.view_tabs_common_history()), null);
- //this.alertDef = new SubTab(driftTab.extendLocatorId("Definitions"), new ViewName("Definitions", MSG
- // .view_tabs_common_definitions()), null);
- driftTab.registerSubTabs(driftHistory);
+ this.driftConfig = new SubTab(driftTab.extendLocatorId("Config"), new ViewName("Config", MSG
+ .view_tabs_common_configuration()), null);
+ driftTab.registerSubTabs(driftHistory, driftConfig);
tabs.add(driftTab);
contentTab = new TwoLevelTab(getTabSet().extendLocatorId("Content"), new ViewName("Content", MSG
@@ -513,10 +515,10 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
}
});
- updateSubTab(this.configurationTab, this.configHistory, true, true, new ViewFactory() {
+ updateSubTab(this.driftTab, this.driftConfig, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return ResourceDriftHistoryView.get(driftHistory.extendLocatorId("View"), resourceComposite);
+ return ResourceDriftConfigurationView.get(driftConfig.extendLocatorId("View"), resourceComposite);
}
});
}
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..4850acf 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
@@ -365,4 +365,14 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
+ public Configuration getConfiguration(int configurationId) throws RuntimeException {
+ try {
+ Configuration configuration = configurationManager.getConfiguration(getSessionSubject(), configurationId);
+ return SerialUtility.prepare(configuration, "ConfigurationService.getConfiguration");
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DriftGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DriftGWTServiceImpl.java
index 26a9734..714a68a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DriftGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DriftGWTServiceImpl.java
@@ -18,10 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.server.gwt;
+import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.DriftChangeSetCriteria;
import org.rhq.core.domain.criteria.DriftCriteria;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSet;
+import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.gwt.DriftGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
@@ -48,6 +50,39 @@ public class DriftGWTServiceImpl extends AbstractGWTServiceImpl implements Drift
}
@Override
+ public int deleteDriftsByContext(EntityContext entityContext) throws RuntimeException {
+ try {
+ // TODO
+ //return this.driftManager.deleteDriftsByContext(getSessionSubject(), entityContext);
+ return 0;
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
+ public int deleteDriftConfigurations(int[] driftConfigIds) throws RuntimeException {
+ try {
+ // TODO
+ //return this.driftManager.deleteDriftConfigurations(getSessionSubject(), driftConfigIds);
+ return 0;
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
+ public int deleteDriftConfigurationsByContext(EntityContext entityContext) throws RuntimeException {
+ try {
+ // TODO
+ //return this.driftManager.deleteDriftConfigurationsByContext(getSessionSubject(), entityContext);
+ return 0;
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
public PageList<DriftChangeSet> findDriftChangeSetsByCriteria(DriftChangeSetCriteria criteria)
throws RuntimeException {
try {
@@ -69,4 +104,12 @@ public class DriftGWTServiceImpl extends AbstractGWTServiceImpl implements Drift
}
}
+ @Override
+ public void updateDriftConfiguration(EntityContext entityContext, DriftConfiguration driftConfig) {
+ try {
+ this.driftManager.updateDriftConfiguration(getSessionSubject(), entityContext, driftConfig);
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 24e6b81..d4b787f 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -1107,11 +1107,16 @@ view_drift_category_fileChanged = File Changed
view_drift_category_fileRemoved = File Removed
view_drift_delete_confirm = Delete the selected drift(s)?
view_drift_delete_confirmAll = Delete all drifts from this source?
-view_drift_failure_delete = Failed to delete drifts with id''s: {0}
-view_drift_failure_deleteAll = Failed to delete all drifts from this source
+view_drift_failure_delete = Failed to delete drift targets with id''s: {0}
+view_drift_failure_deleteAll = Failed to delete all drift targets from this source
view_drift_failure_load = Failed to fetch drift data
+view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
view_drift_success_delete = Successfully deleted {0} drifts
+view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
view_drift_table_baseDir = Base Directory
+view_drift_table_newFile = New File
+view_drift_table_oldFile = Old File
+view_drift_table_resourceConfig = Resource Drift Configuration
view_drift_table_resourceHistory = Resource Drift History
view_dynagroup_children = DynaGroup Children
view_dynagroup_compatible = Compatible
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 792fa2a..5c08f99 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -931,11 +931,16 @@ view_dashboards_title = Dashboard
##view_drift_category_fileRemoved = File Removed
##view_drift_delete_confirm = Delete the selected drift(s)?
##view_drift_delete_confirmAll = Delete all drifts from this source?
-##view_drift_failure_delete = Failed to delete drifts with id''s: {0}
-##view_drift_failure_deleteAll = Failed to delete all drifts from this source
+##view_drift_failure_delete = Failed to delete drift targets with id''s: {0}
+##view_drift_failure_deleteAll = Failed to delete all drift targets from this source
##view_drift_failure_load = Failed to fetch drift data
+##view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
##view_drift_success_delete = Successfully deleted {0} drifts
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
##view_drift_table_baseDir = Base Directory
+##view_drift_table_newFile = New File
+##view_drift_table_oldFile = Old File
+view_drift_table_resourceConfig = Resource Drift Configuration
##view_drift_table_resourceHistory = Resource Drift History
view_dynagroup_children = DynaGroup Children~
view_dynagroup_compatible = Kompatible
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 856c5c9..56f7060 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -1108,11 +1108,16 @@ view_dashboards_title = ダッシュボード
##view_drift_category_fileRemoved = File Removed
##view_drift_delete_confirm = Delete the selected drift(s)?
##view_drift_delete_confirmAll = Delete all drifts from this source?
-##view_drift_failure_delete = Failed to delete drifts with id''s: {0}
-##view_drift_failure_deleteAll = Failed to delete all drifts from this source
+##view_drift_failure_delete = Failed to delete drift targets with id''s: {0}
+##view_drift_failure_deleteAll = Failed to delete all drift targets from this source
##view_drift_failure_load = Failed to fetch drift data
+##view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
##view_drift_success_delete = Successfully deleted {0} drifts
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
##view_drift_table_baseDir = Base Directory
+##view_drift_table_newFile = New File
+##view_drift_table_oldFile = Old File
+view_drift_table_resourceConfig = Resource Drift Configuration
##view_drift_table_resourceHistory = Resource Drift History
view_dynagroup_children = DynaGroup Children
view_dynagroup_compatible = Compatible
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 60bc292..bc458a0 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -1131,11 +1131,16 @@ view_dashboards_title = Dashboard~
##view_drift_category_fileRemoved = File Removed
##view_drift_delete_confirm = Delete the selected drift(s)?
##view_drift_delete_confirmAll = Delete all drifts from this source?
-##view_drift_failure_delete = Failed to delete drifts with id''s: {0}
-##view_drift_failure_deleteAll = Failed to delete all drifts from this source
+##view_drift_failure_delete = Failed to delete drift targets with id''s: {0}
+##view_drift_failure_deleteAll = Failed to delete all drift targets from this source
##view_drift_failure_load = Failed to fetch drift data
+##view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
##view_drift_success_delete = Successfully deleted {0} drifts
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
##view_drift_table_baseDir = Base Directory
+##view_drift_table_newFile = New File
+##view_drift_table_oldFile = Old File
+view_drift_table_resourceConfig = Resource Drift Configuration
##view_drift_table_resourceHistory = Resource Drift History
view_dynagroup_children = DynaGroup Children~
view_dynagroup_compatible = Compatible
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 21dcd58..25ba044 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -1107,11 +1107,16 @@ view_dashboards_title = \u7EDF\u8BA1\u8868\u76D8
##view_drift_category_fileRemoved = File Removed
##view_drift_delete_confirm = Delete the selected drift(s)?
##view_drift_delete_confirmAll = Delete all drifts from this source?
-##view_drift_failure_delete = Failed to delete drifts with id''s: {0}
-##view_drift_failure_deleteAll = Failed to delete all drifts from this source
+##view_drift_failure_delete = Failed to delete drift targets with id''s: {0}
+##view_drift_failure_deleteAll = Failed to delete all drift targets from this source
##view_drift_failure_load = Failed to fetch drift data
+##view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
##view_drift_success_delete = Successfully deleted {0} drifts
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
##view_drift_table_baseDir = Base Directory
+##view_drift_table_newFile = New File
+##view_drift_table_oldFile = Old File
+view_drift_table_resourceConfig = Resource Drift Configuration
##view_drift_table_resourceHistory = Resource Drift History
view_dynagroup_children = \u5B50\u52A8\u6001\u7EC4
view_dynagroup_compatible = \u517C\u5BB9\u6027
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..ef94c51 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;
12 years, 10 months
[rhq] Changes to 'RHQ_3_0_0_EmbJopr2_BZ-715080'
by Larry O'Leary
New branch 'RHQ_3_0_0_EmbJopr2_BZ-715080' available with the following commits:
commit a61b9ff370b8d29bf28495f4d5f1e18632435cda
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)
12 years, 11 months
[rhq] modules/core
by mazz
modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java | 12 +++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
New commits:
commit c1539ab2b81270985ba026be2725f8195d9d4917
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 23 11:57:01 2011 -0400
BZ 644328 - abort the bundle deployment if we cannot determine where to put the bundle,
that is, if we don't have an absolute path. We need to do this for those cases
where, for example, a resource doesn't store an absolute path in its plugin config,
resource source or trait - rather it stores a relative path. In this case, we can't
pin that relative path to anything absolute, so we don't know where to put
the bundle.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index b0cd714..29afab5 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -507,7 +507,17 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
}
- return new File(baseLocation, relativeDeployDir);
+ File destDir = new File(baseLocation, relativeDeployDir);
+
+ if (!destDir.isAbsolute()) {
+ throw new IllegalArgumentException("The base location path specified by [" + destBaseDirValueName
+ + "] in the context [" + bundleDestBaseDir.getValueContext()
+ + "] along with the destination directory of [" + relativeDeployDir
+ + "] did not resolve to an absolute path [" + destDir.getPath()
+ + "] so there is no way to know where to put the bundle.");
+ }
+
+ return destDir;
}
/**
12 years, 11 months