[rhq] Branch 'bundle' - 5 commits - modules/common modules/core modules/enterprise modules/plugins
by mazz
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeContext.java | 33 ++
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java | 109 ++++++--
modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java | 38 ++
modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java | 77 ++++-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java | 53 ++-
modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java | 9
modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/FileTemplateBundlePluginServerComponent.java | 15 +
modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java | 133 ++++++++++
8 files changed, 391 insertions(+), 76 deletions(-)
New commits:
commit cdccd367c9fd398dffba8e7fe6df5fab88fa772a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 2 15:12:37 2010 -0500
opps.. forgot to use the new constructor
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 3fe2852..7f76757 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
@@ -112,12 +112,15 @@ public class FileTemplateBundlePluginServerComponent implements ResourceComponen
} else {
log.debug("Package version [" + packageVersion + "] has no MD5/SHA256 hash - not verifying it");
}
+
+ packageVersionFiles.put(packageVersion, packageFile);
}
// process the recipe
String recipe = bundleVersion.getRecipe();
RecipeParser parser = new RecipeParser();
- ProcessingRecipeContext recipeContext = new ProcessingRecipeContext(recipe);
+ ProcessingRecipeContext recipeContext = new ProcessingRecipeContext(recipe, packageVersionFiles,
+ this.resourceContext.getSystemInformation(), tmpDir.getAbsolutePath());
recipeContext.setReplacementVariableValues(bundleDeployDef.getConfiguration());
parser.setReplaceReplacementVariables(true);
parser.parseRecipe(recipeContext);
commit 967a5f2371cb77591801bfd8d3dd97e3eb44a355
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 2 15:10:53 2010 -0500
more bundle processing stuff - this attempts to process the deploy command
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeContext.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeContext.java
index c895107..43f0df1 100644
--- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeContext.java
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeContext.java
@@ -28,6 +28,9 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+
/**
* Contains information that is gleened from a recipe after it is parsed.
*
@@ -38,6 +41,7 @@ public class RecipeContext {
private final String recipe;
private final Map<String, String> deployFiles;
private final Set<String> replacementVariables;
+ private Configuration replacementVariableValues;
public RecipeContext(String recipe) {
this.recipe = recipe;
@@ -81,4 +85,33 @@ public class RecipeContext {
this.replacementVariables.addAll(replacementVariables);
}
+ /**
+ * If known, the returned value will contain values that are to be used to replace
+ * replacement variables found in the recipe.
+ *
+ * @return the replacement variable values
+ */
+ public Configuration getReplacementVariableValues() {
+ return this.replacementVariableValues;
+ }
+
+ public void setReplacementVariableValues(Configuration configuration) {
+ this.replacementVariableValues = configuration;
+ }
+
+ /**
+ * Adds the given name/value pair to the set of replacement variable values associated
+ * with this context.
+ *
+ * @param name
+ * @param value
+ */
+ public void addReplacementVariableValue(String name, String value) {
+ Configuration values = getReplacementVariableValues();
+ if (values == null) {
+ values = new Configuration();
+ setReplacementVariableValues(values);
+ }
+ values.put(new PropertySimple(name, value));
+ }
}
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
index df797f4..f8db1c8 100644
--- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
@@ -37,6 +37,10 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.system.SystemInfoFactory;
+import org.rhq.core.template.TemplateEngine;
+
/**
* Parses the file template recipe.
*
@@ -46,27 +50,41 @@ import java.util.regex.Pattern;
public class RecipeParser {
private Map<String, RecipeCommand> recipeCommands;
- // note that we use the same as the core util's template engine
- // the native system replacement variable prefix is used by the agent-side fact variable names
- private final Pattern replacementVariableDeclarationPattern = Pattern.compile("<%\\s*(\\w+\\.?)+\\s*%>");
- private final Pattern replacementVariableNamePattern = Pattern.compile("(\\w+\\.?)+");
- private final String systemReplacementVariablePrefix = "rhq.system.";
+ private Pattern replacementVariableDeclarationPattern;
+ private Pattern replacementVariableNamePattern;
+ private String systemReplacementVariablePrefix;
+ private boolean replaceVariables = false;
public RecipeParser() {
- setupRecipeCommands();
+ this.recipeCommands = createRecipeCommands();
+ setupReplacementPatterns();
+ }
+
+ /**
+ * If the parser should replace replacement variables with their corresponding values (as found in
+ * the parser context), <code>true</code> is returned. If <code>false</code> then the replacement
+ * variables remain as is when they are passed to their command processor objects.
+ *
+ * @return flag
+ */
+ public boolean isReplaceReplacementVariables() {
+ return this.replaceVariables;
}
- public RecipeContext parseRecipe(String recipe) throws Exception {
- RecipeContext context = new RecipeContext(recipe);
+ public void setReplaceReplacementVariables(boolean flag) {
+ this.replaceVariables = flag;
+ }
+
+ public void parseRecipe(RecipeContext context) throws Exception {
- BufferedReader recipeReader = new BufferedReader(new StringReader(recipe));
+ BufferedReader recipeReader = new BufferedReader(new StringReader(context.getRecipe()));
String line = recipeReader.readLine();
while (line != null) {
parseRecipeCommandLine(context, line);
line = recipeReader.readLine();
}
- return context;
+ return;
}
public void parseRecipeCommandLine(RecipeContext context, String line) throws Exception {
@@ -75,11 +93,15 @@ public class RecipeParser {
return;
}
+ if (isReplaceReplacementVariables()) {
+ line = replaceReplacementVariables(context, line);
+ }
+
String[] commandLineArray = splitCommandLine(line);
String commandName = commandLineArray[0];
String[] arguments = extractArguments(commandLineArray);
- RecipeCommand recipeCommand = recipeCommands.get(commandName);
+ RecipeCommand recipeCommand = this.recipeCommands.get(commandName);
if (recipeCommand == null) {
throw new Exception("Unknown command in recipe: " + commandName);
}
@@ -94,28 +116,30 @@ public class RecipeParser {
return;
}
- private void setupRecipeCommands() {
- recipeCommands = new HashMap<String, RecipeCommand>();
+ protected HashMap<String, RecipeCommand> createRecipeCommands() {
+ HashMap<String, RecipeCommand> commands = new HashMap<String, RecipeCommand>();
RecipeCommand[] knownCommands = new RecipeCommand[] { new ConfigdefRecipeCommand(), //
new DeployRecipeCommand() //
};
for (RecipeCommand recipeCommand : knownCommands) {
- recipeCommands.put(recipeCommand.getName(), recipeCommand);
+ commands.put(recipeCommand.getName(), recipeCommand);
}
+
+ return commands;
}
- private Set<String> getReplacementVariables(String cmdLine) {
+ protected Set<String> getReplacementVariables(String cmdLine) {
Set<String> replacementVariables = null;
Matcher matcher = this.replacementVariableDeclarationPattern.matcher(cmdLine);
while (matcher.find()) {
String replacementDeclaration = matcher.group();
- Matcher matcherInner = this.replacementVariableNamePattern.matcher(replacementDeclaration);
- if (!matcherInner.find()) {
+ Matcher nameMatcher = this.replacementVariableNamePattern.matcher(replacementDeclaration);
+ if (!nameMatcher.find()) {
throw new IllegalArgumentException("Bad replacement declaration [" + replacementDeclaration + "]");
}
- String replacementVariable = matcherInner.group();
+ String replacementVariable = nameMatcher.group();
if (!replacementVariable.startsWith(this.systemReplacementVariablePrefix)) {
if (replacementVariables == null) {
replacementVariables = new HashSet<String>(1);
@@ -127,7 +151,43 @@ public class RecipeParser {
return replacementVariables;
}
- private String[] splitCommandLine(String cmdLine) {
+ protected String replaceReplacementVariables(RecipeContext context, String input) {
+
+ // don't bother if we have no values to replace them with
+ Configuration replacementValues = context.getReplacementVariableValues();
+ if (replacementValues == null) {
+ return input;
+ }
+
+ TemplateEngine templateEngine = null;
+ StringBuffer buffer = new StringBuffer();
+ Matcher matcher = this.replacementVariableDeclarationPattern.matcher(input);
+ while (matcher.find()) {
+ String next = matcher.group();
+ Matcher nameMatcher = this.replacementVariableNamePattern.matcher(next);
+ if (nameMatcher.find()) {
+ String key = nameMatcher.group();
+ String value = replacementValues.getSimpleValue(key, null);
+ if (value == null) {
+ // our replacement values don't know how to replace the key, see if our system info template engine can
+ if (templateEngine == null) {
+ templateEngine = SystemInfoFactory.fetchTemplateEngine();
+ }
+ value = templateEngine.replaceTokens(next);
+ }
+ if (value != null) {
+ next = value;
+ }
+ }
+
+ // If we didn't find a replacement for the key then leave the original value unchanged
+ matcher.appendReplacement(buffer, next);
+ }
+ matcher.appendTail(buffer);
+ return buffer.toString();
+ }
+
+ protected String[] splitCommandLine(String cmdLine) {
ByteArrayInputStream in = new ByteArrayInputStream(cmdLine.getBytes());
StreamTokenizer strtok = new StreamTokenizer(new InputStreamReader(in));
List<String> args = new ArrayList<String>();
@@ -163,11 +223,20 @@ public class RecipeParser {
return args.toArray(new String[args.size()]);
}
- private String[] extractArguments(String[] commandLine) {
+ protected String[] extractArguments(String[] commandLine) {
// strip the first element (the command name) from the array, leaving only the arguments
int newLength = commandLine.length - 1;
String[] argsOnly = new String[newLength];
System.arraycopy(commandLine, 1, argsOnly, 0, newLength);
return argsOnly;
}
+
+ private void setupReplacementPatterns() {
+ // note that we use the same as the core util's template engine
+ // the native system replacement variable prefix is used by the agent-side fact variable names
+ this.replacementVariableDeclarationPattern = Pattern.compile("<%\\s*(\\w+\\.?)+\\s*%>");
+ this.replacementVariableNamePattern = Pattern.compile("(\\w+\\.?)+");
+ this.systemReplacementVariablePrefix = SystemInfoFactory.TOKEN_PREFIX;
+ }
+
}
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index 7d58b88..b2efdaf 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -28,6 +28,8 @@ import java.util.Map;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import org.rhq.core.system.SystemInfoFactory;
+
@Test
public class RecipeParserTest {
private StringBuilder recipe;
@@ -43,7 +45,8 @@ public class RecipeParserTest {
addRecipeCommand("deploy -f tomcat.tar -d <%opt.dir%>/tomcat");
addRecipeCommand("deploy -f jboss.zip -d <%rhq.system.hostname%>/opt/tomcat"); // this is ignored, its an agent fact variable
RecipeParser parser = new RecipeParser();
- RecipeContext context = parser.parseRecipe(getRecipe());
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
Map<String, String> files = context.getDeployFiles();
assert files.containsKey("jboss.tar") : files;
assert files.get("jboss.tar").equals("<% opt.dir %>/jboss") : files;
@@ -55,11 +58,30 @@ public class RecipeParserTest {
assert context.getReplacementVariables().size() == 1 : context.getReplacementVariables();
}
+ public void testSimpleRecipeReplaceReplacementVariables() throws Exception {
+ addRecipeCommand("deploy -f jboss.tar -d <% opt.dir %>/jboss");
+ addRecipeCommand("deploy -f jboss2.tar -d <%unknown%>/jboss");
+ addRecipeCommand("deploy -f jboss3.tar -d <% rhq.system.hostname %>/jboss");
+ RecipeParser parser = new RecipeParser();
+ parser.setReplaceReplacementVariables(true);
+ RecipeContext context = new RecipeContext(getRecipe());
+ context.addReplacementVariableValue("opt.dir", "/foo/bar");
+ parser.parseRecipe(context);
+ Map<String, String> files = context.getDeployFiles();
+ assert files.containsKey("jboss.tar") : files;
+ assert files.get("jboss.tar").equals("/foo/bar/jboss") : files;
+ assert files.containsKey("jboss2.tar") : files;
+ assert files.get("jboss2.tar").equals("<%unknown%>/jboss") : files;
+ assert files.containsKey("jboss3.tar") : files;
+ assert files.get("jboss3.tar").equals(SystemInfoFactory.createSystemInfo().getHostname() + "/jboss") : files;
+ }
+
public void testSimpleRecipe() throws Exception {
addRecipeCommand("deploy -f jboss.tar -d /opt/jboss");
addRecipeCommand("deploy -f tomcat.tar -d /opt/tomcat");
RecipeParser parser = new RecipeParser();
- RecipeContext context = parser.parseRecipe(getRecipe());
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
Map<String, String> files = context.getDeployFiles();
assert files.containsKey("jboss.tar") : files;
assert files.get("jboss.tar").equals("/opt/jboss") : files;
@@ -72,7 +94,8 @@ public class RecipeParserTest {
addRecipeCommand("deploy -f jboss.tar --directory='/opt/jboss'");
addRecipeCommand("deploy -f tomcat.tar \"--directory=/opt/tomcat\"");
RecipeParser parser = new RecipeParser();
- RecipeContext context = parser.parseRecipe(getRecipe());
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
Map<String, String> files = context.getDeployFiles();
assert files.containsKey("jboss1.zip") : files;
assert files.get("jboss1.zip").equals("/opt/jboss1") : files;
@@ -87,7 +110,8 @@ public class RecipeParserTest {
RecipeParser parser = new RecipeParser();
try {
- parser.parseRecipe(getRecipe());
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
assert false : "This should have failed - need to provide a -d to the deploy command";
} catch (Exception ok) {
// to be expected
@@ -97,7 +121,8 @@ public class RecipeParserTest {
addRecipeCommand("deploy -d /opt/jboss");
try {
- parser.parseRecipe(getRecipe());
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
assert false : "This should have failed - need to provide a -f to the deploy command";
} catch (Exception ok) {
// to be expected
@@ -118,7 +143,8 @@ public class RecipeParserTest {
addRecipeCommand("### comment here");
addRecipeCommand("");
RecipeParser parser = new RecipeParser();
- RecipeContext context = parser.parseRecipe(getRecipe());
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
Map<String, String> files = context.getDeployFiles();
assert files.containsKey("jboss.tar") : files;
assert files.get("jboss.tar").equals("/opt/jboss") : files;
diff --git a/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java b/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
index 147f2a5..34902c0 100644
--- a/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
+++ b/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
@@ -70,16 +70,17 @@ public class BundleServerPluginComponent implements ServerPluginComponent, Bundl
public RecipeParseResults parseRecipe(String recipe) throws Exception {
RecipeParser parser = new RecipeParser();
- RecipeContext parserContext = parser.parseRecipe(recipe);
+ RecipeContext recipeContext = new RecipeContext(recipe);
+ parser.parseRecipe(recipeContext);
Set<String> bundleFileNames = new HashSet<String>();
- Map<String, String> deployFiles = deployFiles = parserContext.getDeployFiles();
+ Map<String, String> deployFiles = recipeContext.getDeployFiles();
bundleFileNames.addAll(deployFiles.keySet());
ConfigurationDefinition configDef = null;
- if (parserContext.getReplacementVariables() != null) {
+ if (recipeContext.getReplacementVariables() != null) {
configDef = new ConfigurationDefinition("replacementVariables", null);
- for (String replacementVar : parserContext.getReplacementVariables()) {
+ for (String replacementVar : recipeContext.getReplacementVariables()) {
PropertyDefinitionSimple prop = new PropertyDefinitionSimple(replacementVar, null, false,
PropertySimpleType.STRING);
configDef.put(prop);
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 a1320ad..3fe2852 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
@@ -21,11 +21,14 @@ package org.rhq.plugins.filetemplate;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.bundle.filetemplate.recipe.RecipeParser;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.content.PackageVersion;
@@ -66,6 +69,7 @@ public class FileTemplateBundlePluginServerComponent implements ResourceComponen
BundleVersion bundleVersion = bundleDeployDef.getBundleVersion();
// download all the bundle files to our tmp directory
+ Map<PackageVersion, File> packageVersionFiles = new HashMap<PackageVersion, File>();
File tmpDir = new File(this.resourceContext.getTemporaryDirectory(), "" + bundleVersion.getId());
BundleManagerProvider bundleManager = request.getBundleManagerProvider();
List<PackageVersion> packageVersions = bundleManager.getAllBundleVersionPackageVersions(bundleVersion);
@@ -110,7 +114,13 @@ public class FileTemplateBundlePluginServerComponent implements ResourceComponen
}
}
- // TODO all bundle files are downloaded - now process the bundle
+ // process the recipe
+ String recipe = bundleVersion.getRecipe();
+ RecipeParser parser = new RecipeParser();
+ ProcessingRecipeContext recipeContext = new ProcessingRecipeContext(recipe);
+ recipeContext.setReplacementVariableValues(bundleDeployDef.getConfiguration());
+ parser.setReplaceReplacementVariables(true);
+ parser.parseRecipe(recipeContext);
} catch (Throwable t) {
log.error("Failed to deploy bundle [" + request + "]", t);
diff --git a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
new file mode 100644
index 0000000..1dbad78
--- /dev/null
+++ b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
@@ -0,0 +1,133 @@
+/*
+ * 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.plugins.filetemplate;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.rhq.bundle.filetemplate.recipe.RecipeContext;
+import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.system.ProcessExecution;
+import org.rhq.core.system.ProcessExecutionResults;
+import org.rhq.core.system.SystemInfo;
+
+/**
+ * A recipe context that processes the recipe as it adds stuff to the context
+ *
+ * @author John Mazzitelli
+ */
+public class ProcessingRecipeContext extends RecipeContext {
+
+ private final Map<PackageVersion, File> packageVersionFiles;
+ private final SystemInfo systemInfo;
+ private String baseWorkingDirectory;
+
+ public ProcessingRecipeContext(String recipe, Map<PackageVersion, File> packageVersionFiles, SystemInfo systemInfo,
+ String baseWorkingDirectory) {
+
+ super(recipe);
+ this.packageVersionFiles = packageVersionFiles;
+ this.systemInfo = systemInfo;
+ this.baseWorkingDirectory = baseWorkingDirectory; // the directory that existing bundle filenames will be relative to
+ }
+
+ @Override
+ public void addDeployFile(String filename, String directory) {
+ super.addDeployFile(filename, directory);
+
+ File existingFile = new File(this.baseWorkingDirectory, filename);
+
+ ProcessExecution pe = getUnzipExecution(filename, directory);
+ if (pe != null) {
+ ProcessExecutionResults results = this.systemInfo.executeProcess(pe);
+ if (results.getError() != null) {
+ throw new RuntimeException("Could not unbundle file [" + pe + "]: " + results, results.getError());
+ } else if (results.getExitCode() == null || results.getExitCode().intValue() > 0) {
+ throw new RuntimeException("Failed to unbundle file [" + pe + "]: " + results);
+ }
+ existingFile.delete();
+ } else {
+ // not a zipped format - just move the file to the directory as-is
+ File newFile = new File(directory, filename);
+ if (!existingFile.renameTo(newFile)) {
+ throw new RuntimeException("Failed to move [" + existingFile + "] to [" + newFile + "]");
+ }
+ }
+ }
+
+ @Override
+ public void addReplacementVariables(Set<String> replacementVariables) {
+ super.addReplacementVariables(replacementVariables);
+ }
+
+ private ProcessExecution getUnzipExecution(String filename, String directory) {
+ String exe;
+ List<String> args = null;
+
+ if (filename.endsWith(".tar")) {
+ exe = "tar";
+ args = new ArrayList<String>();
+ args.add("xf");
+ args.add(filename);
+ args.add("-C");
+ args.add(directory);
+ } else if (filename.endsWith(".tar.bz2") || filename.endsWith(".tbz2") || filename.endsWith(".tbz")) {
+ exe = "tar";
+ args = new ArrayList<String>();
+ args.add("xfj");
+ args.add(filename);
+ args.add("-C");
+ args.add(directory);
+ } else if (filename.endsWith(".tar.gz") || filename.endsWith(".tgz")) {
+ exe = "tar";
+ args = new ArrayList<String>();
+ args.add("xfz");
+ args.add(filename);
+ args.add("-C");
+ args.add(directory);
+ } else if (filename.endsWith(".zip")) {
+ exe = "unzip";
+ args = new ArrayList<String>();
+ args.add(filename);
+ args.add("-d");
+ args.add(directory);
+ } else if (filename.endsWith(".rpm")) {
+ exe = "rpm";
+ args = new ArrayList<String>();
+ args.add("-i");
+ args.add(filename);
+ if (directory != null && directory.length() > 0) {
+ args.add("--prefix");
+ args.add(directory);
+ }
+ } else {
+ return null; // isn't a unzippable package, we'll just copy it as is
+ }
+
+ ProcessExecution pe = new ProcessExecution(exe);
+ pe.setArguments(args);
+ pe.setWaitForCompletion(30 * 60 * 1000L);
+ pe.setWorkingDirectory(this.baseWorkingDirectory);
+ return pe;
+ }
+}
commit bf127b50c0157b289c78b9073002931bb131ea00
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 2 13:52:43 2010 -0500
be defensive when building the template engine replacement variables - get as many variables as we can, ignoring native errors if we hit them
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
index 27a1375..573e9c0 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
@@ -26,10 +26,11 @@ import java.io.File;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.net.InetAddress;
import java.net.URL;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
-import java.util.TreeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -43,7 +44,11 @@ import org.rhq.core.util.exception.ThrowableUtil;
* @author John Mazzitelli
*/
public class SystemInfoFactory {
- private static final String TOKEN_PREFIX = "rhq.system.";
+ /**
+ * All template engine replacement variables that this factory's template engine will know about
+ * will be prefixed with this string.
+ */
+ public static final String TOKEN_PREFIX = "rhq.system.";
private static final Log LOG = LogFactory.getLog(SystemInfoFactory.class);
@@ -343,35 +348,60 @@ public class SystemInfoFactory {
public static TemplateEngine fetchTemplateEngine() {
- try{
- SystemInfo systemInfo = createSystemInfo();
-
- Map<String, String> tokens = new HashMap<String, String>();
- tokens.put(TOKEN_PREFIX+"hostname", systemInfo.getHostname());
-
- tokens.put(TOKEN_PREFIX+"os.name", systemInfo.getOperatingSystemName());
- tokens.put(TOKEN_PREFIX+"os.version", systemInfo.getOperatingSystemVersion());
- tokens.put(TOKEN_PREFIX+"os.type", systemInfo.getOperatingSystemType().toString());
- tokens.put(TOKEN_PREFIX+"cpu.count", Integer.toString(systemInfo.getNumberOfCpus()));
- tokens.put(TOKEN_PREFIX+"architecture", systemInfo.getSystemArchitecture());
-
- for (NetworkAdapterInfo networkAdapter : systemInfo.getAllNetworkAdapters()) {
- String key = TOKEN_PREFIX+"interfaces." + networkAdapter.getName();
- tokens.put(key + ".mac", networkAdapter.getMacAddressString());
- tokens.put(key + ".type", networkAdapter.getType());
- tokens.put(key + ".flags", networkAdapter.getAllFlags());
-
- if (!networkAdapter.getUnicastAddresses().isEmpty()) {
- tokens.put(key + ".address", networkAdapter.getUnicastAddresses().get(0).getHostAddress());
+ try {
+ SystemInfo systemInfo = createSystemInfo();
+
+ Map<String, String> tokens = new HashMap<String, String>();
+ tokens.put(TOKEN_PREFIX + "hostname", systemInfo.getHostname());
+
+ tokens.put(TOKEN_PREFIX + "os.name", systemInfo.getOperatingSystemName());
+ tokens.put(TOKEN_PREFIX + "os.version", systemInfo.getOperatingSystemVersion());
+ tokens.put(TOKEN_PREFIX + "os.type", systemInfo.getOperatingSystemType().toString());
+ tokens.put(TOKEN_PREFIX + "architecture", systemInfo.getSystemArchitecture());
+ try {
+ tokens.put(TOKEN_PREFIX + "cpu.count", Integer.toString(systemInfo.getNumberOfCpus()));
+ } catch (Exception e) {
+ tokens.put(TOKEN_PREFIX + "cpu.count", "?");
}
- if (!networkAdapter.getMulticastAddresses().isEmpty()) {
- tokens.put(key + ".multicast.address", networkAdapter.getMulticastAddresses().get(0).getHostAddress());
+
+ List<NetworkAdapterInfo> allNetworkAdapters = null;
+ try {
+ allNetworkAdapters = systemInfo.getAllNetworkAdapters();
+ } catch (Exception e) {
}
- }
- TemplateEngine templateEngine = new TemplateEngine(tokens);
- return templateEngine;
- }catch(Exception e){
- return new TemplateEngine(new HashMap());
+ if (allNetworkAdapters != null) {
+ for (NetworkAdapterInfo networkAdapter : allNetworkAdapters) {
+ String key = TOKEN_PREFIX + "interfaces." + networkAdapter.getName();
+ tokens.put(key + ".mac", networkAdapter.getMacAddressString());
+ tokens.put(key + ".type", networkAdapter.getType());
+ tokens.put(key + ".flags", networkAdapter.getAllFlags());
+
+ if (!networkAdapter.getUnicastAddresses().isEmpty()) {
+ tokens.put(key + ".address", networkAdapter.getUnicastAddresses().get(0).getHostAddress());
+ }
+ if (!networkAdapter.getMulticastAddresses().isEmpty()) {
+ tokens.put(key + ".multicast.address", networkAdapter.getMulticastAddresses().get(0)
+ .getHostAddress());
+ }
+ }
+ }
+
+ // create a base IP address - this one is known to java and should always exist no matter what platform we are on
+ try {
+ try {
+ tokens.put(TOKEN_PREFIX + "interfaces.java.address", InetAddress
+ .getByName(systemInfo.getHostname()).getHostAddress());
+ } catch (Exception e) {
+ tokens.put(TOKEN_PREFIX + "interfaces.java.address", InetAddress.getLocalHost().getHostAddress());
+ }
+ } catch (Exception e2) {
+ }
+
+ TemplateEngine templateEngine = new TemplateEngine(tokens);
+ return templateEngine;
+ } catch (Exception e) {
+ // some rare exception occurred that we didn't expect, rather than blow up entirely, just don't provide any values
+ return new TemplateEngine(new HashMap<String, String>());
}
}
}
\ No newline at end of file
commit 1ad822fe979dbc3e7e05b525ad49022a73b57fd3
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 2 13:04:35 2010 -0500
cherry picking two commits b10d6026bba36c90530077dec3f22475c34ac69c and
3b7d6dc377c6c5e211ce8b868ccd0801f0b57a7a to pick up fixes to the template engine
Catch and exception and return an empty template enginer if SystemInfoFactory throws and exception. Reorder operations in ConfigurationManager to not swallow a null exception.
Conflicts:
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
index 2558b44..27a1375 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
@@ -343,10 +343,12 @@ public class SystemInfoFactory {
public static TemplateEngine fetchTemplateEngine() {
+ try{
SystemInfo systemInfo = createSystemInfo();
Map<String, String> tokens = new HashMap<String, String>();
tokens.put(TOKEN_PREFIX+"hostname", systemInfo.getHostname());
+
tokens.put(TOKEN_PREFIX+"os.name", systemInfo.getOperatingSystemName());
tokens.put(TOKEN_PREFIX+"os.version", systemInfo.getOperatingSystemVersion());
tokens.put(TOKEN_PREFIX+"os.type", systemInfo.getOperatingSystemType().toString());
@@ -366,7 +368,10 @@ public class SystemInfoFactory {
tokens.put(key + ".multicast.address", networkAdapter.getMulticastAddresses().get(0).getHostAddress());
}
}
- TemplateEngine templateEngine = new TemplateEngine(tokens);
+ TemplateEngine templateEngine = new TemplateEngine(tokens);
return templateEngine;
+ }catch(Exception e){
+ return new TemplateEngine(new HashMap());
+ }
}
}
\ No newline at end of file
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 580da62..8c3d50c 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -22,8 +22,18 @@
*/
package org.rhq.core.pc.configuration;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
@@ -46,15 +56,6 @@ import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.core.system.SystemInfoFactory;
import org.rhq.core.template.TemplateEngine;
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
/**
* Manages configuration of all resources across all plugins.
*
@@ -185,21 +186,20 @@ public class ConfigurationManager extends AgentService implements ContainerServi
Configuration structuredConfig = facet.loadStructuredConfiguration();
TemplateEngine templateEngine = SystemInfoFactory.fetchTemplateEngine();
-
+
if (structuredConfig != null) {
prepareConfigForMergeIntoStructured(configuration, structuredConfig);
for (RawConfiguration rawConfig : configuration.getRawConfigurations()) {
String contents = templateEngine.replaceTokens(new String(rawConfig.getContents()));
rawConfig.setContents(contents);
-
+
structuredConfig.addRawConfiguration(rawConfig);
facet.mergeStructuredConfiguration(rawConfig, configuration);
}
}
}
-
private void prepareConfigForMergeIntoStructured(Configuration config, Configuration latestStructured) {
config.getAllProperties().clear();
for (Property property : latestStructured.getProperties()) {
@@ -217,12 +217,14 @@ public class ConfigurationManager extends AgentService implements ContainerServi
prepareConfigForMergeIntoRaws(configuration, rawConfigs);
Queue<RawConfiguration> queue = new LinkedList<RawConfiguration>(rawConfigs);
+ TemplateEngine templateEngine = SystemInfoFactory.fetchTemplateEngine();
while (!queue.isEmpty()) {
RawConfiguration originalRaw = queue.poll();
RawConfiguration mergedRaw = facet.mergeRawConfiguration(configuration, originalRaw);
-
if (mergedRaw != null) {
+ //TODO bypass validation of structured config for template values
+ mergedRaw.setContents(templateEngine.replaceTokens(mergedRaw.getContents()));
updateRawConfig(configuration, originalRaw, mergedRaw);
}
}
@@ -364,7 +366,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
public void validate(Configuration configuration, int resourceId, boolean isStructured)
- throws PluginContainerException {
+ throws PluginContainerException {
boolean daemonOnly = true;
boolean onlyIfStarted = true;
ResourceConfigurationFacet facet = componentService.getComponent(resourceId, ResourceConfigurationFacet.class,
@@ -372,26 +374,27 @@ public class ConfigurationManager extends AgentService implements ContainerServi
if (isStructured) {
return;
} else {
- StringBuilder errorMessage = null;
+ StringBuilder errorMessage = null;
- try{
+ try {
for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
try {
facet.validateRawConfiguration(rawConfiguration);
} catch (IllegalArgumentException e) {
- if (null == errorMessage){
+ if (null == errorMessage) {
errorMessage = new StringBuilder();
}
- errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+"." );
+ errorMessage.append("file " + rawConfiguration.getPath() + " failed validation with "
+ + e.getMessage() + ".");
}
}
- }catch(Throwable t){
+ } catch (Throwable t) {
errorMessage = new StringBuilder();
- errorMessage.append("configuation validation failed with" + t.getMessage()+".");
- }
- if (null != errorMessage){
- throw new PluginContainerException(errorMessage.toString());
- }
- }
+ errorMessage.append("configuation validation failed with" + t.getMessage() + ".");
+ }
+ if (null != errorMessage) {
+ throw new PluginContainerException(errorMessage.toString());
+ }
+ }
}
}
commit 93681f0a83acd915eec2aad84b17304f9545a04b
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Jan 27 21:16:56 2010 -0500
Modified the key for template replacement.
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
index 3a29fff..2558b44 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
@@ -43,6 +43,8 @@ import org.rhq.core.util.exception.ThrowableUtil;
* @author John Mazzitelli
*/
public class SystemInfoFactory {
+ private static final String TOKEN_PREFIX = "rhq.system.";
+
private static final Log LOG = LogFactory.getLog(SystemInfoFactory.class);
private static final String NATIVE_LIBRARY_CLASS_NAME = "org.hyperic.sigar.Sigar";
@@ -344,15 +346,15 @@ public class SystemInfoFactory {
SystemInfo systemInfo = createSystemInfo();
Map<String, String> tokens = new HashMap<String, String>();
- tokens.put("rhq.hostname", systemInfo.getHostname());
- tokens.put("rhq.os.name", systemInfo.getOperatingSystemName());
- tokens.put("rhq.os.version", systemInfo.getOperatingSystemVersion());
- tokens.put("rhq.os.type", systemInfo.getOperatingSystemType().toString());
- tokens.put("rhq.cpu.count", Integer.toString(systemInfo.getNumberOfCpus()));
- tokens.put("rhq.architecture", systemInfo.getSystemArchitecture());
+ tokens.put(TOKEN_PREFIX+"hostname", systemInfo.getHostname());
+ tokens.put(TOKEN_PREFIX+"os.name", systemInfo.getOperatingSystemName());
+ tokens.put(TOKEN_PREFIX+"os.version", systemInfo.getOperatingSystemVersion());
+ tokens.put(TOKEN_PREFIX+"os.type", systemInfo.getOperatingSystemType().toString());
+ tokens.put(TOKEN_PREFIX+"cpu.count", Integer.toString(systemInfo.getNumberOfCpus()));
+ tokens.put(TOKEN_PREFIX+"architecture", systemInfo.getSystemArchitecture());
for (NetworkAdapterInfo networkAdapter : systemInfo.getAllNetworkAdapters()) {
- String key = "rhq.interfaces." + networkAdapter.getName();
+ String key = TOKEN_PREFIX+"interfaces." + networkAdapter.getName();
tokens.put(key + ".mac", networkAdapter.getMacAddressString());
tokens.put(key + ".type", networkAdapter.getType());
tokens.put(key + ".flags", networkAdapter.getAllFlags());
14 years, 2 months
[rhq] Branch 'raw-config' - modules/enterprise
by John Sanda
modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy | 31 ----------
modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy | 22 -------
modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy | 11 ---
3 files changed, 64 deletions(-)
New commits:
commit 46f83dfe0640ae09003a44e7c47b2cc15be8e17b
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Mar 2 14:25:56 2010 -0500
Deleting script that were accidentally included in a previous commit
diff --git a/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy b/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy
deleted file mode 100644
index 7b0fe62..0000000
--- a/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.guest
-
-class GuestServer {
-
- String scriptsDir
-
- String suiteFile
-
- String outputDir
-
- def executeTests() {
- def basedir = '/Users/john/Development/redhat/imanage/rhq/modules/enterprise/server/jar'
- scriptsDir = "$basedir/src/test/script"
- suiteFile = "$basedir/src/test/resources/guest-testng.xml"
- outputDir = "$basedir/target"
-
- def classLoader = new GroovyClassLoader(Thread.currentThread().contextClassLoader)
- def testRunnerScriptURL = classLoader.getResource("org/guest/GuestTestRunner.groovy")
- def scriptEngine = new GroovyScriptEngine(".", classLoader)
- def binding = new Binding([
- 'scriptsDir': scriptsDir,
- 'suiteFile': suiteFile,
- 'outputDir': outputDir,
- 'scriptsClassLoader': classLoader
- ])
-
- scriptEngine.run(testRunnerScriptURL.toURI().path, binding)
- }
-
-}
-
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy b/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy
deleted file mode 100644
index 288a0f9..0000000
--- a/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.guest
-
-import javax.servlet.ServletException
-import javax.servlet.http.HttpServlet
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-class GuestServlet extends HttpServlet {
-
- protected void doGet(HttpServletRequest request, HttpServletResponse response) {
- doPost(request, response)
- }
-
- protected void doPost(HttpServletRequest request, HttpServletResponse response) {
- def scriptsDir = request.getParameter("scriptsDir")
- def suiteFile = request.getParameter("suiteFile")
- def outputDir = request.getParameter("outputDir")
-
- new GuestServer(scriptsDir: scriptsDir, suiteFile: suiteFile, outputDir: outputDir).executeTests()
- }
-
-}
diff --git a/modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy b/modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy
deleted file mode 100644
index 922bad1..0000000
--- a/modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.guest
-
-import org.testng.xml.XmlSuite
-import org.testng.TestNG
-
-scriptsClassLoader.addURL(new File(scriptsDir).toURI().toURL())
-
-def testNG = new TestNG()
-testNG.commandLineSuite = new XmlSuite(fileName: suiteFile)
-testNG.outputDirectory = outputDir
-testNG.run()
\ No newline at end of file
14 years, 2 months
[rhq] Branch 'raw-config' - modules/core modules/enterprise
by John Sanda
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationValidationException.java | 2 -
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java | 20 ++--------
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 2 -
3 files changed, 7 insertions(+), 17 deletions(-)
New commits:
commit a3654c9264048a7217eb1a825964db8f07739f7b
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Mar 2 13:53:54 2010 -0500
Making ConfigurationValidationException a checked exception so that the EJB container treats it as an application exception
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationValidationException.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationValidationException.java
index 03628b7..913be20 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationValidationException.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationValidationException.java
@@ -21,7 +21,7 @@ package org.rhq.core.domain.configuration;
import java.util.Collections;
import java.util.Map;
-public class ConfigurationValidationException extends RuntimeException {
+public class ConfigurationValidationException extends Exception {
private static final long serialVersionUID = -6924768743906659205L;
/**
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
index 6460a81..d3907b2 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
@@ -196,21 +196,11 @@ public class ResourceConfigurationEditor extends ResourceConfigurationViewer imp
return "nochange";
}
}
- } catch (EJBException e) {
- if (e.getCausedByException() != null &&
- e.getCausedByException() instanceof ConfigurationValidationException) {
- ConfigurationValidationException validationException =
- (ConfigurationValidationException) e.getCausedByException();
- FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update failed: " +
- validationException.getMessage());
- copyErrorMessages(validationException);
- return "failure";
- }
- else {
- FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Unable to contact the remote agent.", e
- .getCause());
- return "failure";
- }
+ } catch (ConfigurationValidationException e) {
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update failed: " +
+ e.getMessage());
+ copyErrorMessages(e);
+ return "failure";
}
// updateRequest will be null if there is no change to the configuration. ConfigurationManagerBean checks to
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 37e4054..41cbf01 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
@@ -1026,7 +1026,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
@Nullable
public ResourceConfigurationUpdate updateResourceConfiguration(Subject subject, int resourceId,
@XmlJavaTypeAdapter(ConfigurationAdapter.class) Configuration newConfiguration)
- throws ResourceNotFoundException {
+ throws ResourceNotFoundException, ConfigurationValidationException {
if (isStructuredAndRawSupported(resourceId)) {
throw new ConfigurationUpdateNotSupportedException("Cannot update a resource configuration that "
14 years, 2 months
[rhq] Branch 'gwt' - 3 commits - modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 59 +++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Presenter.java | 37 -----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/View.java | 51 +++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewRenderer.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 12 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java | 31 ----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java | 30 ----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 14 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java | 29 ----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 25 ---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java | 40 ------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/places/Place.java | 66 ----------
12 files changed, 72 insertions(+), 325 deletions(-)
New commits:
commit 38af78cff487e16ec7b69d7197fbad3ed46137a2
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Tue Mar 2 13:15:28 2010 -0500
fix so #Resource/xxxxx URLs work again; remove parentView param from ViewRenderer.renderView() method; delete Presenter and Place classes
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 21a1f58..468dcea 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -48,7 +48,7 @@ public class CoreGUI implements EntryPoint {
private static ErrorHandler errorHandler = new ErrorHandler();
- private static BreadcrumbTrailPane breadCrumb;
+ private static BreadcrumbTrailPane breadCrumbTrailPane;
private static Canvas content;
@@ -145,9 +145,9 @@ public class CoreGUI implements EntryPoint {
rootCanvas.addMember(menuBarView);
- breadCrumb = new BreadcrumbTrailPane();
+ breadCrumbTrailPane = new BreadcrumbTrailPane();
- rootCanvas.addMember(breadCrumb);
+ rootCanvas.addMember(breadCrumbTrailPane);
DOM.setInnerHTML(RootPanel.get("Loading-Panel").getElement(), "");
@@ -186,7 +186,7 @@ public class CoreGUI implements EntryPoint {
}
ViewId viewId = new ViewId(viewIdName, parentView.getId());
boolean lastNode = (i == (viewIdNamesSize - 1));
- parentView = viewRenderer.renderView(viewId, parentView, lastNode);
+ parentView = viewRenderer.renderView(viewId, lastNode);
breadcrumbs.add(parentView.getBreadcrumb());
}
} catch (UnknownViewException e) {
@@ -194,35 +194,13 @@ public class CoreGUI implements EntryPoint {
// in the list. The breadcrumbs list will contain breadcrumbs for only the names that were
// recognized.
System.err.println(e.getMessage());
+ // TODO: Should we add a new token to the History to point to the valid location
+ // we ended up at?
}
System.out.println("Breadcrumbs: " + breadcrumbs);
- breadCrumb.setBreadcrumbs(breadcrumbs);
-
- /*breadCrumb.initialize(path);
- ArrayList<Place> trail = breadCrumb.getTrail();
-
- Place base = trail.get(0);
-
- if (content != null && content instanceof Presenter) {
- Presenter p = ((Presenter) content);
- if (!p.fireDisplay(base, trail.subList(1, trail.size()))) {
- Canvas c = createContent(base.getId());
- setContent(c);
-
- if (trail.size() >= 2 && c instanceof Presenter) {
- ((Presenter) c).fireDisplay(trail.get(0), trail.subList(1, trail.size()));
- }
- }
- } else {
- Canvas c = createContent(base.getId());
- setContent(c);
- if (trail.size() >= 2 && c instanceof Presenter) {
- ((Presenter) c).fireDisplay(trail.get(0), trail.subList(1, trail.size()));
- }
- }*/
-
- breadCrumb.refresh();
+ breadCrumbTrailPane.setBreadcrumbs(breadcrumbs);
+ breadCrumbTrailPane.refresh();
}
});
@@ -289,12 +267,12 @@ public class CoreGUI implements EntryPoint {
for (ViewId current = viewId.getParent(); current != null; current = current.getParent()) {
index++;
}
- List<Breadcrumb> breadcrumbs = breadCrumb.getBreadcrumbs();
+ List<Breadcrumb> breadcrumbs = breadCrumbTrailPane.getBreadcrumbs();
if (index < breadcrumbs.size()) {
Breadcrumb breadcrumb = breadcrumbs.get(index);
if (breadcrumb.getName().equals(viewId.getName())) {
breadcrumbs.set(index, new Breadcrumb(breadcrumb.getName(), displayName));
- breadCrumb.refresh();
+ breadCrumbTrailPane.refresh();
}
}
}
@@ -305,14 +283,16 @@ public class CoreGUI implements EntryPoint {
setHeight100(); // (900);
}
- public View renderView(ViewId viewId, View parentView, boolean lastNode) throws UnknownViewException {
+ public View renderView(ViewId viewId, boolean lastNode) throws UnknownViewException {
String path = viewId.getPath();
Canvas canvas = createContent(path);
if (canvas == null) {
throw new UnknownViewException();
}
setContent(canvas);
- return new View(viewId);
+ ViewRenderer descendantViewRender = (canvas instanceof ViewRenderer) ?
+ (ViewRenderer)canvas : null;
+ return new View(viewId, descendantViewRender);
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Presenter.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Presenter.java
deleted file mode 100644
index 84fa7e5..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Presenter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client;
-
-import org.rhq.enterprise.gui.coregui.client.places.Place;
-
-import java.util.List;
-
-/**
- * @deprecated replaced by {@link ViewRenderer}
- *
- * @author Greg Hinkle
- */
-@Deprecated
-public interface Presenter {
-
- boolean fireDisplay(Place baseLocation, List<Place> subLocations);
-
- Place getPlace();
-
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewRenderer.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewRenderer.java
index d3f237f..8a9279a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewRenderer.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewRenderer.java
@@ -28,8 +28,7 @@ public interface ViewRenderer {
* TODO
*
* @param viewId
- *@param parentView @return
* @param lastNode @throws UnknownViewException
*/
- View renderView(ViewId viewId, View parentView, boolean lastNode) throws UnknownViewException;
+ View renderView(ViewId viewId, boolean lastNode) throws UnknownViewException;
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 90611b0..1e4e517 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -146,7 +146,6 @@ public class AdministrationView extends HLayout implements ViewRenderer {
return section;
}
-
private SectionStackSection buildManagementClusterSection() {
final SectionStackSection section = new SectionStackSection("Management Cluster");
section.setExpanded(true);
@@ -346,8 +345,8 @@ public class AdministrationView extends HLayout implements ViewRenderer {
}
- public View renderView(ViewId viewId, View parentView, boolean lastNode) throws UnknownViewException {
- String parentPath = parentView.getId().getPath();
+ public View renderView(ViewId viewId, boolean lastNode) throws UnknownViewException {
+ String parentPath = viewId.getParent().getPath();
if (parentPath.equals("Administration")) {
SectionStackSection stackSection = this.sectionStack.getSection(viewId.getName());
if (stackSection != null) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
index 8f71101..3f15169 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
@@ -18,18 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.roles;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
-import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
-
-import com.smartgwt.client.docs.CheckboxField;
import com.smartgwt.client.types.Autofit;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.types.SelectionAppearance;
-import com.smartgwt.client.types.SelectionStyle;
-import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.IButton;
@@ -37,25 +28,18 @@ import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
-import com.smartgwt.client.widgets.form.events.SubmitValuesEvent;
-import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
-import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
import com.smartgwt.client.widgets.grid.events.SelectionEvent;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.layout.SectionStack;
-import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
-import java.util.List;
-
/**
* @author Greg Hinkle
*/
-public class RolesView extends VLayout implements Presenter {
+public class RolesView extends VLayout {
@Override
@@ -185,17 +169,4 @@ public class RolesView extends VLayout implements Presenter {
editView.editNew();
}
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- if (!getPlace().equals(base)) {
- return false;
- }
-
-
- return true;
- }
-
- public Place getPlace() {
- return new Place("Roles", "Manage Roles");
- }
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
index c2c0c6f..bf6d742 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
@@ -18,21 +18,10 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.users;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
-import org.rhq.enterprise.gui.coregui.client.admin.roles.RoleEditView;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
-
-import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Autofit;
import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.SelectionAppearance;
-import com.smartgwt.client.types.SelectionStyle;
-import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
-import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.Window;
@@ -43,17 +32,14 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
import com.smartgwt.client.widgets.grid.events.SelectionEvent;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
-import java.util.List;
-
/**
* @author Greg Hinkle
*/
-public class UsersView extends VLayout implements Presenter {
+public class UsersView extends VLayout {
public UsersView() {
super();
@@ -185,18 +171,4 @@ public class UsersView extends VLayout implements Presenter {
editView.editNew();
}
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- if (!base.equals(getPlace())) {
- return false;
- }
- if (subLocations.size() > 0) {
- int userId = Integer.parseInt(subLocations.get(0).getId());
- }
- return true;
- }
-
- public Place getPlace() {
- return new Place("users", "Users");
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
index ba07d21..7764657 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
@@ -18,11 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.client.dashboard;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.SmallGraphView;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
import com.google.gwt.user.client.Random;
import com.smartgwt.client.widgets.AnimationCallback;
@@ -33,12 +31,10 @@ import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
-import java.util.List;
-
/**
* @author Greg Hinkle
*/
-public class DashboardView extends VLayout implements Presenter {
+public class DashboardView extends VLayout {
private static String[] colors = new String[]{
"FF6600", "808000", "008000", "008080", "0000FF", "666699",
@@ -187,12 +183,4 @@ public class DashboardView extends VLayout implements Presenter {
addMember(portalLayout);
}
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- return base.equals(getPlace());
- }
-
- public Place getPlace() {
- return new Place("Dashboard", "Dashboard");
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java
index 38fa943..bb6c190 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java
@@ -20,10 +20,8 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupListView;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions.GroupDefinitionListView;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
import com.smartgwt.client.types.ContentsType;
import com.smartgwt.client.types.VisibilityMode;
@@ -38,12 +36,10 @@ import com.smartgwt.client.widgets.tree.Tree;
import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeNode;
-import java.util.List;
-
/**
* @author Greg Hinkle
*/
-public class ResourcesView extends HLayout implements Presenter {
+public class ResourcesView extends HLayout {
public static final String VIEW_PATH = "Resources";
@@ -173,11 +169,9 @@ public class ResourcesView extends HLayout implements Presenter {
section.addItem(treeGrid);
-
return section;
}
-
public void setContent(Canvas newContent) {
if (contentCanvas.getChildren().length > 0)
contentCanvas.getChildren()[0].destroy();
@@ -186,25 +180,4 @@ public class ResourcesView extends HLayout implements Presenter {
contentCanvas.addChild(newContent);
contentCanvas.draw();
}
-
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- if (base.equals(getPlace())) {
- if (!subLocations.isEmpty()) {
- if (contentCanvas.getChildren().length > 0) {
- Canvas element = contentCanvas.getChildren()[0];
- if (element instanceof Presenter) {
- ((Presenter) element).fireDisplay(subLocations.get(0), subLocations.subList(1, subLocations.size() - 1));
- }
- }
- }
- return true;
- }
- return false;
- }
-
-
- public Place getPlace() {
- return new Place("Resources", "Resources");
- }
}
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 f97a858..38f36a4 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
@@ -20,7 +20,6 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import org.rhq.enterprise.gui.coregui.client.components.SimpleCollapsiblePanel;
import org.rhq.enterprise.gui.coregui.client.components.SubTabLayout;
@@ -28,7 +27,6 @@ import org.rhq.enterprise.gui.coregui.client.components.configuration.Configurat
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.GraphListView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
import com.smartgwt.client.types.Side;
import com.smartgwt.client.widgets.HTMLFlow;
@@ -37,14 +35,13 @@ import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import java.util.EnumSet;
-import java.util.List;
/**
* Right panel of the resource view.
*
* @author Greg Hinkle
*/
-public class ResourceDetailView extends VLayout implements Presenter, ResourceSelectListener {
+public class ResourceDetailView extends VLayout implements ResourceSelectListener {
private Resource resource;
@@ -61,7 +58,6 @@ public class ResourceDetailView extends VLayout implements Presenter, ResourceSe
private Tab contentTab;
private TabSet topTabSet;
-
HTMLFlow title = new HTMLFlow();
public void setResource(Resource resource) {
@@ -109,19 +105,6 @@ public class ResourceDetailView extends VLayout implements Presenter, ResourceSe
// CoreGUI.addBreadCrumb(getPlace());
}
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- if (base.equals(getPlace())) {
-
- }
- return true;
-
- }
-
- public Place getPlace() {
- return new Place(String.valueOf(resource.getId()), resource.getName());
- }
-
public void onResourceSelected(Resource resource) {
this.resource = resource;
@@ -142,10 +125,6 @@ public class ResourceDetailView extends VLayout implements Presenter, ResourceSe
topTabSet.updateTab(summaryTab, summarySet);
-
-
-
-
SubTabLayout monitoringSet = new SubTabLayout();
monitoringSet.registerSubTab("Graphs", new GraphListView(resource)); // new FullHTMLPane("/rhq/common/monitor/graphs.xhtml?id=" + resource.getId()));
monitoringSet.registerSubTab("Tables", new FullHTMLPane("/rhq/common/monitor/tables.xhtml?id=" + resource.getId()));
@@ -154,7 +133,6 @@ public class ResourceDetailView extends VLayout implements Presenter, ResourceSe
monitoringSet.registerSubTab("Schedules", new FullHTMLPane("/rhq/resource/monitor/schedules.xhtml?id=" + resource.getId()));
topTabSet.updateTab(monitoringTab, monitoringSet);
-
topTabSet.updateTab(configurationTab, new ConfigurationEditor(resource.getId(), resource.getResourceType().getId()));
topTabSet.setSelectedTab(selectedTab);
@@ -203,7 +181,6 @@ public class ResourceDetailView extends VLayout implements Presenter, ResourceSe
}
});
-
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java
index 738fa17..61a7267 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java
@@ -27,23 +27,19 @@ import org.rhq.enterprise.gui.coregui.client.View;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewRenderer;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
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.ResourcesView;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.layout.HLayout;
-import java.util.List;
-
/**
* @author Greg Hinkle
*/
-public class ResourceView extends HLayout implements Presenter, ViewRenderer {
+public class ResourceView extends HLayout implements ViewRenderer {
private Canvas contentCanvas;
@@ -90,27 +86,6 @@ public class ResourceView extends HLayout implements Presenter, ViewRenderer {
}
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- try {
- if (base.equals(getPlace())) {
- if (subLocations.size() > 0) {
- Place resourcePlace = subLocations.get(0);
- int resourceId = Integer.parseInt(resourcePlace.getId());
-
- if (selectedResource == null || selectedResource.getId() != resourceId) {
- setSelectedResource(resourceId, null);
- }
- }
- return true;
- } else {
- return false;
- }
- } catch (Exception e) {
- return false;
- }
- }
-
-
public void setSelectedResource(final int resourceId, final ViewId viewId) {
Resource resource = this.treeView.getResource(resourceId);
if (resource != null) {
@@ -140,19 +115,12 @@ public class ResourceView extends HLayout implements Presenter, ViewRenderer {
}
}
-
public void setSelectedResource(Resource resource) {
this.selectedResource = resource;
this.treeView.setSelectedResource(resource);
this.detailView.onResourceSelected(resource);
}
-
- public Place getPlace() {
-// return new Place("Resource[" + selectedResource.getId() + "]", "Resource - " + selectedResource.getName());
- return new Place("Resource", "Resource");
- }
-
public void setContent(Canvas newContent) {
if (contentCanvas.getChildren().length > 0)
contentCanvas.getChildren()[0].destroy();
@@ -160,8 +128,8 @@ public class ResourceView extends HLayout implements Presenter, ViewRenderer {
contentCanvas.draw();
}
- public View renderView(ViewId viewId, View parentView, boolean lastNode) throws UnknownViewException {
- String parentPath = parentView.getId().getPath();
+ public View renderView(ViewId viewId, boolean lastNode) throws UnknownViewException {
+ String parentPath = viewId.getParent().getPath();
if (!parentPath.equals("Resource")) {
throw new UnknownViewException();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/places/Place.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/places/Place.java
deleted file mode 100644
index cb63156..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/places/Place.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client.places;
-
-/**
- * @deprecated replaced by {@link org.rhq.enterprise.gui.coregui.client.View} and
- * {@link org.rhq.enterprise.gui.coregui.client.Breadcrumb}
- *
- * @author Greg Hinkle
- */
-@Deprecated
-public class Place {
-
- private String id;
- private String name;
-
- public Place(String id, String name) {
- this.id = id;
- this.name = name;
- }
-
- public String getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- Place place = (Place) o;
-
- if (!id.equals(place.id)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- return id.hashCode();
- }
-}
commit d62a17440a0d3d45d446a0f598ab564cf74308f3
Merge: cdfa722... 5c46dee...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Tue Mar 2 12:02:59 2010 -0500
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit cdfa722fbe40368c3b47b9525df970c2d95714a7
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Tue Mar 2 12:02:40 2010 -0500
replace getCanvas() method in View class with getDescendantViewRenderer() and refactor callers; add javadoc to View class
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 67881a4..21a1f58 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -36,7 +36,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-
/**
* @author Greg Hinkle
*/
@@ -174,14 +173,16 @@ public class CoreGUI implements EntryPoint {
List<String> viewIdNames = path.equals("") ? Collections.<String>emptyList() : Arrays.asList(path.split("\\/"));
View parentView = CoreGUI.this.rootView;
- ViewRenderer viewRenderer = (ViewRenderer)parentView.getCanvas();
+ ViewRenderer viewRenderer = parentView.getDescendantViewRenderer();
List<Breadcrumb> breadcrumbs = new ArrayList<Breadcrumb>(viewIdNames.size());
try {
for (int i = 0, viewIdNamesSize = viewIdNames.size(); i < viewIdNamesSize; i++) {
String viewIdName = viewIdNames.get(i);
- Canvas parentCanvas = parentView.getCanvas();
- if (parentCanvas != null && parentCanvas instanceof ViewRenderer) {
- viewRenderer = (ViewRenderer) parentCanvas;
+ // See if the parent view provided a view renderer to use for its descendants. If not,
+ // continue using the view renderer that renderer the parent view.
+ ViewRenderer descendantViewRenderer = parentView.getDescendantViewRenderer();
+ if (descendantViewRenderer != null) {
+ viewRenderer = descendantViewRenderer;
}
ViewId viewId = new ViewId(viewIdName, parentView.getId());
boolean lastNode = (i == (viewIdNamesSize - 1));
@@ -311,7 +312,7 @@ public class CoreGUI implements EntryPoint {
throw new UnknownViewException();
}
setContent(canvas);
- return new View(viewId, canvas);
+ return new View(viewId);
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/View.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/View.java
index 6c37f97..ae1a10b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/View.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/View.java
@@ -18,31 +18,33 @@
*/
package org.rhq.enterprise.gui.coregui.client;
-import com.smartgwt.client.widgets.Canvas;
-
/**
- * TODO
+ * A view in the GUI which has a bookmarkable URL. The fragment portion of the URL is what
+ * uniquely identifies the view. View id's are hierarchical and are therefore represented as
+ * paths (e.g. "http://localhost:7080/coregui/CoreGUI.html#Resource/10001" is a view URL,
+ * whose view id is "Resource/1001". The URL of its parent view is
+ * ""http://localhost:7080/coregui/CoreGUI.html#Resource", whose view id is "Resource".
*
* @author Ian Springer
*/
public class View {
private ViewId id;
- private Canvas canvas;
+ private ViewRenderer descendantViewRender;
private Breadcrumb breadcrumb;
public View(ViewId id) {
this(id, null, null);
}
- public View(ViewId id, Canvas canvas) {
- this(id, canvas, null);
+ public View(ViewId id, ViewRenderer descendantViewRender) {
+ this(id, descendantViewRender, null);
}
public View(ViewId id, Breadcrumb breadcrumb) {
this(id, null, breadcrumb);
}
- public View(ViewId id, Canvas canvas, Breadcrumb breadcrumb) {
+ public View(ViewId id, ViewRenderer descendantViewRender, Breadcrumb breadcrumb) {
if (id == null) {
throw new IllegalArgumentException("Id is null.");
}
@@ -55,27 +57,48 @@ public class View {
} else {
this.breadcrumb = new Breadcrumb(id.getName());
}
- this.canvas = canvas;
+ this.descendantViewRender = descendantViewRender;
}
+ /**
+ * Returns this view's unique id.
+ *
+ * @return this view's unique id
+ */
public ViewId getId() {
- return id;
+ return this.id;
}
- public Canvas getCanvas() {
- return canvas;
+ /**
+ * Returns a view renderer that should be used to render descendant views, or null if
+ * the view renderer that rendered this view should also be used to render descendant
+ * views.
+ *
+ * @return a view renderer that should be used to render descendant views, or null if
+ * the view renderer that rendered this view should also be used to render
+ * descendant views
+ */
+ public ViewRenderer getDescendantViewRenderer() {
+ return this.descendantViewRender;
}
+ /**
+ * Returns info that should be used when rendering a breadcrumb for this view in the
+ * breadcrumb trail, or null if a default breadcrumb should be used.
+ *
+ * @return info that should be used when rendering a breadcrumb for this view in the
+ * breadcrumb trail, or null if a default breadcrumb should be used
+ */
public Breadcrumb getBreadcrumb() {
- return breadcrumb;
+ return this.breadcrumb;
}
@Override
public String toString() {
return "View[" +
"id=" + id +
- ", canvas=" + canvas +
- ", breadcrumb=" + breadcrumb +
+ ", descendantViewRender=" + this.descendantViewRender +
+ ", breadcrumb=" + this.breadcrumb +
']';
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 18673f1..90611b0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -357,10 +357,9 @@ public class AdministrationView extends HLayout implements ViewRenderer {
}
return new View(viewId, new Breadcrumb(viewId.getName(), false));
}
- } else if (parentPath.equals("Administration/Reports")) {
- FullHTMLPane pane = new FullHTMLPane(IFRAME_URL_INVENTORY_SUMMARY_REPORT);
- setContent(pane);
- return new View(viewId, pane);
+ } else if (parentPath.equals("Administration/Reports")) {
+ setContent(new FullHTMLPane(IFRAME_URL_INVENTORY_SUMMARY_REPORT));
+ return new View(viewId);
}
throw new UnknownViewException();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java
index 048db28..738fa17 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java
@@ -178,6 +178,6 @@ public class ResourceView extends HLayout implements Presenter, ViewRenderer {
// Use "..." as temporary display name for breadcrumb. If the Resource is fetched successfully, the display name
// will be updated to be the Resource's name.
Breadcrumb breadcrumb = new Breadcrumb(viewId.getName(), "...");
- return new View(viewId, this.detailView, breadcrumb);
+ return new View(viewId, breadcrumb);
}
}
14 years, 2 months
[rhq] Branch 'raw-config' - modules/enterprise
by John Sanda
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java | 6 +++++-
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/raw.xhtml | 1 +
2 files changed, 6 insertions(+), 1 deletion(-)
New commits:
commit 285f1836f984953660f66ec7e42e3e6beab7fd9e
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Mar 2 12:53:25 2010 -0500
Prepending '**' to the file names in the menu for files that have validation errors
A better visual indicator for validation errors would be to render the file names in the menu
in a red font. I was unable to get the CSS working for that though, and due to time
constraints went with this solution.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index 68a7887..2fbeac3 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -101,9 +101,13 @@ public class RawConfigUIBean {
/**
* @return The name of the raw config file excluding the path. If the file has been modified, an asterisk is
- * prepended to the name.
+ * prepended to the name. If the file has validation errors, two asterisks are prepended to the name.
*/
public String getFileDisplayName() {
+ if (errorMessage != null) {
+ return "** " + getFileName();
+ }
+
if (isModified()) {
return "* " + getFileName();
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/raw.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/raw.xhtml
index af38dba..7d13acb 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/raw.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/raw.xhtml
@@ -96,6 +96,7 @@
<div class="raw-outer-table-left-col-footer">
<br/>
<div class="raw-outer-table-left-col-footer-content">* - Contains uncommitted changes.</div>
+ <div class="raw-outer-table-left-col-footer-content">** - Contains validation errors.</div>
</div>
</c:if>
14 years, 2 months
[rhq] Branch 'raw-config' - modules/enterprise
by John Sanda
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 6 ++++++
1 file changed, 6 insertions(+)
New commits:
commit c7a6065e78a9e96a83bec83e3329a05cb107e025
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Mar 2 12:32:13 2010 -0500
Modifying resource config update operations to validate configs that support raw-only and structured-only
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 ea805b1..37e4054 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
@@ -1035,6 +1035,12 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
+ "whether the structured or raw was updated.");
}
+ Resource resource = entityManager.find(Resource.class, resourceId);
+ ConfigurationDefinition configDef = resource.getResourceType().getResourceConfigurationDefinition();
+ boolean isStructured = configDef.getConfigurationFormat() == ConfigurationFormat.STRUCTURED;
+
+ validateResourceConfiguration(subject, resourceId, newConfiguration, isStructured);
+
// must do this in a separate transaction so it is committed prior to sending the agent request
// (consider synchronizing to avoid the condition where someone calls this method twice quickly
// in two different txs which would put two updates in INPROGRESS and cause havoc)
14 years, 2 months
[rhq] Branch 'raw-config' - 2 commits - modules/core modules/enterprise
by John Sanda
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java | 8 --
modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy | 31 ++++++++
modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy | 22 +++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java | 37 ++++++----
modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy | 11 ++
5 files changed, 90 insertions(+), 19 deletions(-)
New commits:
commit f6d8e99d5363b5516268e7c403bb598f7eaaebad
Merge: a1d88c9... e8349c2...
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Mar 2 12:16:00 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config
commit a1d88c9715509fc0cfe58506e6a60214b020c4e1
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Mar 2 12:14:28 2010 -0500
Updating ConfigurationManager to catch any exceptions thrown during a validation call
Initial refactoring of ResourceConfigurationEditor to support validation changes. Validation errors
are now propagated via an exception and the error messages are now parsed out of the exception.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 15d3c2d..ebdeb2a 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -331,8 +331,6 @@ public class ConfigurationManager extends AgentService implements ContainerServi
public void validate(Configuration configuration, int resourceId, boolean isStructured)
throws ConfigurationValidationException {
- boolean success = true;
-
boolean daemonOnly = true;
boolean onlyIfStarted = true;
ResourceConfigurationFacet facet;
@@ -358,12 +356,12 @@ public class ConfigurationManager extends AgentService implements ContainerServi
for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
try {
facet.validateRawConfiguration(rawConfiguration);
- } catch (IllegalArgumentException e) {
+ } catch (Throwable t) {
if (errors == null) {
errors = new HashMap<String, String>();
}
- errors.put(rawConfiguration.getPath(), e.getMessage());
- rawConfiguration.errorMessage = e.getMessage();
+ errors.put(rawConfiguration.getPath(), t.getMessage());
+ rawConfiguration.errorMessage = t.getMessage();
}
}
if (errors != null) {
diff --git a/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy b/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy
new file mode 100644
index 0000000..7b0fe62
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServer.groovy
@@ -0,0 +1,31 @@
+package org.guest
+
+class GuestServer {
+
+ String scriptsDir
+
+ String suiteFile
+
+ String outputDir
+
+ def executeTests() {
+ def basedir = '/Users/john/Development/redhat/imanage/rhq/modules/enterprise/server/jar'
+ scriptsDir = "$basedir/src/test/script"
+ suiteFile = "$basedir/src/test/resources/guest-testng.xml"
+ outputDir = "$basedir/target"
+
+ def classLoader = new GroovyClassLoader(Thread.currentThread().contextClassLoader)
+ def testRunnerScriptURL = classLoader.getResource("org/guest/GuestTestRunner.groovy")
+ def scriptEngine = new GroovyScriptEngine(".", classLoader)
+ def binding = new Binding([
+ 'scriptsDir': scriptsDir,
+ 'suiteFile': suiteFile,
+ 'outputDir': outputDir,
+ 'scriptsClassLoader': classLoader
+ ])
+
+ scriptEngine.run(testRunnerScriptURL.toURI().path, binding)
+ }
+
+}
+
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy b/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy
new file mode 100644
index 0000000..288a0f9
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/groovy/org/guest/GuestServlet.groovy
@@ -0,0 +1,22 @@
+package org.guest
+
+import javax.servlet.ServletException
+import javax.servlet.http.HttpServlet
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+class GuestServlet extends HttpServlet {
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
+ doPost(request, response)
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) {
+ def scriptsDir = request.getParameter("scriptsDir")
+ def suiteFile = request.getParameter("suiteFile")
+ def outputDir = request.getParameter("outputDir")
+
+ new GuestServer(scriptsDir: scriptsDir, suiteFile: suiteFile, outputDir: outputDir).executeTests()
+ }
+
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
index c10bd22..c4696e0 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
@@ -184,12 +184,6 @@ public class ResourceConfigurationEditor extends ResourceConfigurationViewer imp
case FAILURE:
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update request with id "
+ updateRequest.getId() + " failed.", updateRequest.getErrorMessage());
- // for (RawConfiguration raw : resourceConfiguration.getRawConfigurations()) {
- // String message = raw.errorMessage;
- // if (message != null) {
- // FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, raw.getPath(), message);
- // }
- // }
copyErrorMessages(updateRequest);
return "failure";
@@ -199,9 +193,20 @@ public class ResourceConfigurationEditor extends ResourceConfigurationViewer imp
}
}
} catch (EJBException e) {
- FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Unable to contact the remote agent.", e
- .getCause());
- return "failure";
+ if (e.getCausedByException() != null &&
+ e.getCausedByException() instanceof ConfigurationValidationException) {
+ ConfigurationValidationException validationException =
+ (ConfigurationValidationException) e.getCausedByException();
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update failed: " +
+ validationException.getMessage());
+ copyErrorMessages(validationException);
+ return "failure";
+ }
+ else {
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Unable to contact the remote agent.", e
+ .getCause());
+ return "failure";
+ }
}
// updateRequest will be null if there is no change to the configuration. ConfigurationManagerBean checks to
@@ -221,6 +226,15 @@ public class ResourceConfigurationEditor extends ResourceConfigurationViewer imp
}
}
+ private void copyErrorMessages(ConfigurationValidationException exception) {
+ for (String path : exception.errors.keySet()) {
+ RawConfigUIBean rawUIBean = findRawConfigUIBeanByPath(path);
+ if (rawUIBean != null) {
+ rawUIBean.setErrorMessage(exception.errors.get(path));
+ }
+ }
+ }
+
private void copyErrorMessages(AbstractResourceConfigurationUpdate update) {
Configuration updatedConfiguration = update.getConfiguration();
for (RawConfiguration updatedRaw : updatedConfiguration.getRawConfigurations()) {
@@ -228,11 +242,6 @@ public class ResourceConfigurationEditor extends ResourceConfigurationViewer imp
if (rawUIBean != null) {
rawUIBean.setErrorMessage(updatedRaw.errorMessage);
}
-
- // RawConfiguration raw = findRawConfigurationByPath(updatedRaw.getPath());
- // if (raw != null) {
- // raw.errorMessage = updatedRaw.errorMessage;
- // }
}
}
diff --git a/modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy b/modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy
new file mode 100644
index 0000000..922bad1
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/resources/org/guest/GuestTestRunner.groovy
@@ -0,0 +1,11 @@
+package org.guest
+
+import org.testng.xml.XmlSuite
+import org.testng.TestNG
+
+scriptsClassLoader.addURL(new File(scriptsDir).toURI().toURL())
+
+def testNG = new TestNG()
+testNG.commandLineSuite = new XmlSuite(fileName: suiteFile)
+testNG.outputDirectory = outputDir
+testNG.run()
\ No newline at end of file
14 years, 2 months
[rhq] Branch 'gwt' - 3 commits - modules/core modules/enterprise
by Greg Hinkle
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupDefinitionCriteria.java | 108 +++++
modules/enterprise/gui/coregui/pom.xml | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java | 36 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionEditorView.java | 38 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 79 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleGroupsEditorItem.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 137 ++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java | 40 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/SubjectRolesEditorItem.java | 126 ++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java | 101 +++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java | 203 +++++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java | 87 ++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SimpleCollapsiblePanel.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java | 182 ++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionDataSource.java | 114 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java | 173 ++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java | 20
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 20
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 14
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java | 19
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerLocal.java | 3
29 files changed, 1438 insertions(+), 121 deletions(-)
New commits:
commit 5c46dee953d93d777bac6ce77ff2b6a9e0eda0f6
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Tue Mar 2 10:51:14 2010 -0500
Moving to avoid conflict
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java
index 3abac57..1e647c5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java
@@ -107,7 +107,7 @@ public class Breadcrumb {
}
} else {
first = false;
- }
+ }
displayName.append(currentChar);
}
return displayName.toString();
commit 698cc9d42a499d76f4c0b54ffe51d4bc77c6557e
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Tue Mar 2 10:43:00 2010 -0500
Group Definition list view, datasource and server side access
Subject create, update, delete *
Role create, update, delete *
* Not completed. Still working on grid to grid copy/drag to assign component
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 482fa08..039f356 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -137,7 +137,7 @@ public class Role implements Serializable {
@OneToMany(mappedBy = "role", cascade = javax.persistence.CascadeType.ALL)
private Set<RoleNotification> roleNotifications = new HashSet<RoleNotification>();
- protected Role() {
+ public Role() {
fsystem = Boolean.FALSE;
}
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml
index 0e72200..f248a15 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -180,7 +180,7 @@
<inplace>false</inplace>
<logLevel>INFO</logLevel>
<runTarget>http://localhost:7080/coregui/CoreGUI.html</runTarget>
- <extraJvmArgs>-Xmx512m</extraJvmArgs>
+ <extraJvmArgs>-Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M</extraJvmArgs>
<localWorkers>2</localWorkers>
<draftCompile>true</draftCompile>
<buildOutputDirectory>target/gwtclasses</buildOutputDirectory>
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
new file mode 100644
index 0000000..e5579cf
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
@@ -0,0 +1,36 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client;
+
+import com.smartgwt.client.widgets.layout.HLayout;
+
+/**
+ * @author Greg Hinkle
+ */
+public class Footer extends HLayout {
+
+ public Footer() {
+ super();
+
+ setHeight(100);
+ setBackgroundColor("gray");
+
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionEditorView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionEditorView.java
index c788499..123e47d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionEditorView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionEditorView.java
@@ -23,6 +23,8 @@ import org.rhq.enterprise.gui.coregui.client.components.SimpleCollapsiblePanel;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
+import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
@@ -30,6 +32,7 @@ import com.smartgwt.client.widgets.form.fields.HeaderItem;
import java.util.ArrayList;
import java.util.EnumSet;
+import java.util.HashSet;
import java.util.Set;
/**
@@ -38,14 +41,16 @@ import java.util.Set;
public class PermissionEditorView extends CanvasItem {
- private Set<Permission> permissions = EnumSet.noneOf(Permission.class);
+ private Set<Permission> selectedPermissions = EnumSet.noneOf(Permission.class);
+
+ private DynamicForm parentForm;
private DynamicForm form;
+
public PermissionEditorView(String name, String title) {
super(name, title);
-
setCanvas(new SimpleCollapsiblePanel("Permissions", buildForm()));
}
@@ -90,10 +95,37 @@ public class PermissionEditorView extends CanvasItem {
public void setPermissions(Set<Permission> permissions) {
- this.permissions = permissions;
+ this.selectedPermissions = permissions;
for (Permission p : Permission.values()) {
form.setValue(p.name(), permissions.contains(p));
}
+
+ form.addItemChangedHandler(new ItemChangedHandler() {
+ public void onItemChanged(ItemChangedEvent itemChangedEvent) {
+ for (Permission p : Permission.values()) {
+ if ((Boolean)form.getValue(p.name())) {
+ selectedPermissions.add(p);
+ } else {
+ selectedPermissions.remove(p);
+ }
+ }
+ }
+ });
+
form.markForRedraw();
}
+
+ public Set<Permission> getPermissions() {
+ return selectedPermissions;
+ }
+
+ @Override
+ public Object getValue() {
+ System.out.println("Finding Value");
+ return super.getValue();
+ }
+
+ public void setParentForm(DynamicForm parentForm) {
+ this.parentForm = parentForm;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
index 56b913e..a6b8bd8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
@@ -19,24 +19,34 @@
package org.rhq.enterprise.gui.coregui.client.admin.roles;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
+import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.events.SubmitValuesEvent;
+import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.ResetItem;
import com.smartgwt.client.widgets.form.fields.SectionItem;
import com.smartgwt.client.widgets.form.fields.SubmitItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Set;
/**
@@ -44,6 +54,9 @@ import java.util.Set;
*/
public class RoleEditView extends VLayout {
+ private Role roleBeingEdited;
+
+
private Label message = new Label("Select a role to edit...");
@@ -81,29 +94,45 @@ public class RoleEditView extends VLayout {
editCanvas.addMember(editLabel);
form = new DynamicForm();
- form.setAutoFetchData(true);
form.setDataSource(RolesDataSource.getInstance());
- TextItem idItem = new TextItem("id","Id");
+ TextItem idItem = new TextItem("id", "Id");
- TextItem nameItem = new TextItem("name","Name");
+ TextItem nameItem = new TextItem("name", "Name");
permissionEditorItem = new PermissionEditorView("permissionEditor", "Permissions");
permissionEditorItem.setShowTitle(false);
permissionEditorItem.setColSpan(2);
- assignedGroupEditorItem = new RoleGroupsEditorItem("assignedGroups","Assigned Groups");
+
+ assignedGroupEditorItem = new RoleGroupsEditorItem("assignedGroups", "Assigned Groups");
assignedGroupEditorItem.setShowTitle(false);
assignedGroupEditorItem.setColSpan(2);
+ SubmitItem saveButton = new SubmitItem("save", "Save");
+
+ saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ save();
+ System.out.println("Save is done");
+ }
+ });
+
+ form.addSubmitValuesHandler(new SubmitValuesHandler() {
+ public void onSubmitValues(SubmitValuesEvent submitValuesEvent) {
+ Object o = submitValuesEvent.getValues();
+ System.out.println("O: " + o);
+ }
+ });
+
+
form.setItems(
idItem,
nameItem,
permissionEditorItem,
assignedGroupEditorItem,
- new SubmitItem("save", "Save"), new ResetItem("reset", "Reset"));
-
+ saveButton, new ResetItem("reset", "Reset"));
editCanvas.addMember(form);
@@ -111,11 +140,13 @@ public class RoleEditView extends VLayout {
}
public void editRecord(Record record) {
+ this.roleBeingEdited = (Role) record.getAttributeAsObject("entity");
message.hide();
editCanvas.show();
try {
- editLabel.setContents("Editing user " + record.getAttribute("name"));
+ editLabel.setContents("Editing Role " + record.getAttribute("name"));
form.editRecord(record);
+ permissionEditorItem.setParentForm(form);
permissionEditorItem.setPermissions((Set<Permission>) record.getAttributeAsObject("permissions"));
assignedGroupEditorItem.setGroups((PageList<ResourceGroup>) record.getAttributeAsObject("assignedGroups"));
} catch (Throwable t) {
@@ -130,4 +161,38 @@ public class RoleEditView extends VLayout {
markForRedraw();
}
+
+ public void editNew() {
+ ListGridRecord r = new ListGridRecord();
+ Role newRole = new Role(null); // todo make default constructor public
+ RolesDataSource.copyValues(newRole, r);
+ editRecord(r);
+ form.setSaveOperationType(DSOperationType.ADD);
+
+//
+// HashSet<Permission> permissions = new HashSet<Permission>();
+// HashMap values = new HashMap();
+// values.put("permssions", permissions);
+//
+// form.editNewRecord();
+
+
+ editLabel.setContents("Create Role");
+// permissionEditorItem.setPermissions(permissions);
+
+// message.hide();
+// editCanvas.show();
+ }
+
+
+
+ public void save() {
+ System.out.println("Saving role");
+ form.saveData();
+ }
+
+
+ public DynamicForm getForm() {
+ return form;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleGroupsEditorItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleGroupsEditorItem.java
index 1a2da36..6eff51e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleGroupsEditorItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleGroupsEditorItem.java
@@ -53,7 +53,7 @@ public class RoleGroupsEditorItem extends CanvasItem {
HLayout layout = new HLayout(10);
availableGroupGrid = new ListGrid();
- availableGroupGrid.setMinHeight(350);
+ availableGroupGrid.setHeight(350);
availableGroupGrid.setCanDragRecordsOut(true);
availableGroupGrid.setDragTrackerMode(DragTrackerMode.RECORD);
availableGroupGrid.setDragDataAction(DragDataAction.MOVE);
@@ -79,7 +79,7 @@ public class RoleGroupsEditorItem extends CanvasItem {
layout.addMember(moveButtonStack);
assignedGroupGrid = new ListGrid();
- assignedGroupGrid.setMinHeight(350);
+ assignedGroupGrid.setHeight(350);
assignedGroupGrid.setCanDragRecordsOut(true);
assignedGroupGrid.setCanAcceptDroppedRecords(true);
assignedGroupGrid.setDataSource(new ResourceGroupsDataSource());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
index bf100c0..6f8894b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
@@ -18,23 +18,36 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.roles;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.RoleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import com.google.gwt.core.client.JavaScriptObject;
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.DataSourceField;
+import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.rpc.RPCResponse;
+import com.smartgwt.client.util.JSOHelper;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
/**
* @author Greg Hinkle
*/
@@ -71,6 +84,10 @@ public class RolesDataSource extends RPCDataSource {
RoleCriteria criteria = new RoleCriteria();
criteria.setPageControl(getPageControl(request));
+ Integer subjectId = request.getCriteria().getAttributeAsInt("subjectId");
+ if (subjectId != null) {
+ criteria.setFilterSubjectId(subjectId);
+ }
criteria.setFetchResourceGroups(true);
criteria.setFetchPermissions(true);
@@ -92,12 +109,8 @@ public class RolesDataSource extends RPCDataSource {
for (int x = 0; x < result.size(); x++) {
Role role = result.get(x);
ListGridRecord record = new ListGridRecord();
- record.setAttribute("id", role.getId());
- record.setAttribute("name", role.getName());
- record.setAttribute("resourceGroups", role.getResourceGroups());
- record.setAttribute("permissions", role.getPermissions());
- record.setAttribute("subjects", role.getSubjects());
+ copyValues(role, record);
records[x] = record;
}
@@ -109,4 +122,118 @@ public class RolesDataSource extends RPCDataSource {
});
}
+
+ @Override
+ protected void executeAdd(final DSRequest request, final DSResponse response) {
+ JavaScriptObject data = request.getData();
+ final ListGridRecord rec = new ListGridRecord(data);
+ Role newRole = new Role("newName"); // TODO GH: Make default constructor public
+ copyValues(rec, newRole);
+
+ roleService.createRole(newRole, new AsyncCallback<Role>() {
+ public void onFailure(Throwable caught) {
+ Map<String,String> errors = new HashMap<String, String>();
+ errors.put("name", "A role with name already exists.");
+ response.setErrors(errors);
+// CoreGUI.getErrorHandler().handleError("Failed to create role",caught);
+ response.setStatus(RPCResponse.STATUS_VALIDATION_ERROR);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(Role result) {
+ ListGridRecord record = new ListGridRecord();
+ copyValues(result,record);
+ response.setData(new Record[] {record});
+ processResponse(request.getRequestId(),response);
+ }
+ });
+
+ }
+
+ @Override
+ protected void executeUpdate(final DSRequest request, final DSResponse response) {
+ final ListGridRecord record = getEditedRecord(request);
+ System.out.println("Updating record: " + record);
+ Role updatedRole = new Role("foo");
+ copyValues(record, updatedRole);
+ roleService.updateRole(updatedRole, new AsyncCallback<Role>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to update role",caught);
+ }
+
+ public void onSuccess(Role result) {
+ System.out.println("Role Updated");
+ copyValues(result,record);
+ response.setData(new Record[] {record});
+ processResponse(request.getRequestId(),response);
+ }
+ });
+ }
+
+ @Override
+ protected void executeRemove(final DSRequest request, final DSResponse response) {
+ JavaScriptObject data = request.getData();
+ final ListGridRecord rec = new ListGridRecord(data);
+ Role newRole = new Role("newName"); // TODO GH: Make default constructor public
+ copyValues(rec, newRole);
+
+ roleService.removeRoles(new Integer[]{newRole.getId()}, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to delete role",caught);
+ }
+
+ public void onSuccess(Void result) {
+ System.out.println("Role deleted");
+ response.setData(new Record[]{rec});
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+ private static void copyValues(ListGridRecord from, Role to) {
+ to.setId(from.getAttributeAsInt("id"));
+ to.setName(from.getAttributeAsString("name"));
+// to.setDate (from.getAttributeAsDate ("date"));
+// from.getAttributeAsIntArray("resourceGroups");
+ to.setResourceGroups((Set<ResourceGroup>) from.getAttributeAsObject("resourceGroups"));
+ to.setPermissions((Set<Permission>) from.getAttributeAsObject("permissions"));
+ to.setSubjects((Set<Subject>) from.getAttributeAsObject("subjects"));
+ }
+
+ static void copyValues(Role from, ListGridRecord to) {
+ to.setAttribute("id", from.getId());
+ to.setAttribute("name", from.getName());
+ to.setAttribute("resourceGroups", from.getResourceGroups());
+ to.setAttribute("permissions", from.getPermissions());
+ to.setAttribute("subjects", from.getSubjects());
+
+ to.setAttribute("entity", from);
+ }
+
+
+ private ListGridRecord getEditedRecord(DSRequest request) {
+ // Retrieving values before edit
+ JavaScriptObject oldValues = request.getAttributeAsJavaScriptObject("oldValues");
+ // Creating new record for combining old values with changes
+ ListGridRecord newRecord = new ListGridRecord();
+ // Copying properties from old record
+ JSOHelper.apply(oldValues, newRecord.getJsObj());
+ // Retrieving changed values
+ JavaScriptObject data = request.getData();
+ // Apply changes
+ JSOHelper.apply(data, newRecord.getJsObj());
+ return newRecord;
+ }
+
+ public static ListGridRecord[] buildRecords(Collection<Role> roles) {
+ ListGridRecord[] roleRecords = new ListGridRecord[roles.size()];
+ int i = 0;
+ for (Role role : roles) {
+ ListGridRecord record = new ListGridRecord();
+ copyValues(role, record);
+ roleRecords[i++] = record;
+ }
+ return roleRecords;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
index bc88bad..8f71101 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
@@ -20,6 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.roles;
import org.rhq.enterprise.gui.coregui.client.Presenter;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
import org.rhq.enterprise.gui.coregui.client.places.Place;
import com.smartgwt.client.docs.CheckboxField;
@@ -33,8 +34,11 @@ import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.form.events.SubmitValuesEvent;
+import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
@@ -88,7 +92,7 @@ public class RolesView extends VLayout implements Presenter {
idField.setType(ListGridFieldType.INTEGER);
- ListGridField nameField = new ListGridField("username", "Name");
+ ListGridField nameField = new ListGridField("name", "Name");
listGrid.setFields(idField, nameField);
@@ -104,8 +108,10 @@ public class RolesView extends VLayout implements Presenter {
public void onClick(ClickEvent clickEvent) {
SC.confirm("Are you sure you want to delete " + listGrid.getSelection().length + " resources?",
new BooleanCallback() {
- public void execute(Boolean aBoolean) {
-
+ public void execute(Boolean accepted) {
+ if (accepted) {
+ listGrid.removeSelectedData();
+ }
}
}
);
@@ -113,10 +119,20 @@ public class RolesView extends VLayout implements Presenter {
});
+
+ final IButton addButton = new IButton("Add Role");
+ addButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ createRole();
+ }
+ });
+
+
final Label tableInfo = new Label("Total: " + listGrid.getTotalRows());
tableInfo.setWrap(false);
toolStrip.addMember(removeButton);
+ toolStrip.addMember(addButton);
toolStrip.addMember(new LayoutSpacer());
toolStrip.addMember(tableInfo);
@@ -148,8 +164,26 @@ public class RolesView extends VLayout implements Presenter {
}
}
});
+ }
+
+
+
+ public void createRole() {
+
+ RoleEditView editView = new RoleEditView();
+ final Window roleEditor = new Window();
+ roleEditor.setTitle("Create Role");
+ roleEditor.setWidth(800);
+ roleEditor.setHeight(800);
+ roleEditor.setIsModal(true);
+ roleEditor.setShowModalMask(true);
+ roleEditor.setCanDragResize(true);
+ roleEditor.centerInPage();
+ roleEditor.addItem(editView);
+ roleEditor.show();
+ editView.editNew();
}
public boolean fireDisplay(Place base, List<Place> subLocations) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/SubjectRolesEditorItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/SubjectRolesEditorItem.java
new file mode 100644
index 0000000..ab61eac
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/SubjectRolesEditorItem.java
@@ -0,0 +1,126 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.admin.users;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesDataSource;
+import org.rhq.enterprise.gui.coregui.client.components.SimpleCollapsiblePanel;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
+
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.types.DSOperationType;
+import com.smartgwt.client.types.DragDataAction;
+import com.smartgwt.client.types.DragTrackerMode;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.TransferImgButton;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VStack;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Greg Hinkle
+ */
+public class SubjectRolesEditorItem extends CanvasItem {
+
+ private Set<Role> assignedRoles;
+ private Subject subject;
+
+ private ListGrid assignedRoleGrid;
+ private ListGrid availableRoleGrid;
+
+ public SubjectRolesEditorItem(String name, String title) {
+ super(name, title);
+ setShowTitle(false);
+ setColSpan(2);
+ setWidth("90%");
+ setCanvas(new SimpleCollapsiblePanel("Assigned Roles", buildForm()));
+ }
+
+ private Canvas buildForm() {
+
+ HLayout layout = new HLayout(10);
+
+ availableRoleGrid = new ListGrid();
+ availableRoleGrid.setHeight(250);
+ availableRoleGrid.setCanDragRecordsOut(true);
+ availableRoleGrid.setDragTrackerMode(DragTrackerMode.RECORD);
+ availableRoleGrid.setDragDataAction(DragDataAction.MOVE);
+ availableRoleGrid.setDataSource(RolesDataSource.getInstance());
+ availableRoleGrid.setAutoFetchData(true);
+ availableRoleGrid.setFields(new ListGridField("id", 50), new ListGridField("name"));
+
+ layout.addMember(availableRoleGrid);
+
+ VStack moveButtonStack = new VStack(10);
+ moveButtonStack.setWidth(50);
+
+ TransferImgButton addButton = new TransferImgButton(TransferImgButton.RIGHT);
+ TransferImgButton removeButton = new TransferImgButton(TransferImgButton.LEFT);
+ TransferImgButton addAllButton = new TransferImgButton(TransferImgButton.RIGHT_ALL);
+ TransferImgButton removeAllButton = new TransferImgButton(TransferImgButton.LEFT_ALL);
+
+ moveButtonStack.addMember(addButton);
+ moveButtonStack.addMember(removeButton);
+ moveButtonStack.addMember(addAllButton);
+ moveButtonStack.addMember(removeAllButton);
+
+ layout.addMember(moveButtonStack);
+
+ assignedRoleGrid = new ListGrid();
+ assignedRoleGrid.setHeight(250);
+ assignedRoleGrid.setCanDragRecordsOut(true);
+ assignedRoleGrid.setCanAcceptDroppedRecords(true);
+// assignedRoleGrid.setDataSource(RolesDataSource.getInstance());
+ assignedRoleGrid.setFields(new ListGridField("id", 50), new ListGridField("name"));
+
+ layout.addMember(assignedRoleGrid);
+
+
+ return layout;
+ }
+
+ public void setRoles(Set<Role> assignedRoles) {
+ this.assignedRoles = assignedRoles;
+
+ assignedRoleGrid.setData(RolesDataSource.buildRecords(assignedRoles));
+ }
+
+ public Set<Role> getRoles() {
+ return this.assignedRoles;
+ }
+
+ public Subject getSubject() {
+ return subject;
+ }
+
+ public void setSubject(Subject subject) {
+ this.subject = subject;
+ if (subject != null) {
+ assignedRoleGrid.setCriteria(new Criteria("subjectId", String.valueOf(subject.getId())));
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java
index 83e599d..1b74870 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java
@@ -19,30 +19,52 @@
package org.rhq.enterprise.gui.coregui.client.admin.users;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Role;
+import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesDataSource;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesView;
+import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
import com.google.gwt.user.client.ui.Widget;
import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.Record;
import com.smartgwt.client.docs.FormLayout;
+import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.BooleanItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.ResetItem;
import com.smartgwt.client.widgets.form.fields.SectionItem;
+import com.smartgwt.client.widgets.form.fields.SubmitItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import java.util.List;
+import java.util.Set;
/**
* @author Greg Hinkle
*/
-public class UserEditView extends HLayout {
+public class UserEditView extends VLayout {
- private Subject subject;
- private Subject originalSubject;
+ private Label message = new Label("Select a user to edit...");
+
+ private SubjectRolesEditorItem subjectRolesEditorItem ;
+
+ private VLayout editCanvas;
+ private HeaderLabel editLabel;
+ private DynamicForm form;
+
+ private Subject subject;
@Override
protected void onInit() {
@@ -51,26 +73,16 @@ public class UserEditView extends HLayout {
setWidth100();
setHeight100();
- SectionStack sectionStack = new SectionStack();
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
+ buildSubjectEditor();
+ form.hide();
- sectionStack.setWidth100();
- sectionStack.setHeight100();
-
- SectionStackSection subjectSection = new SectionStackSection("Edit Subject");
- subjectSection.setItems(buildSubjectEditor());
-
- SectionStackSection roleSection = new SectionStackSection("Edit Subject's Roles");
- roleSection.setItems(buildRoleEditor());
-
- sectionStack.setSections(subjectSection, roleSection );
-
- addMember(buildSubjectEditor());
+ addMember(message);
+ addMember(form);
}
private Canvas buildSubjectEditor() {
- DynamicForm form = new DynamicForm();
+ form = new DynamicForm();
form.setWidth100();
SectionItem userEditSection = new SectionItem("userEditSection", "Edit User");
@@ -96,19 +108,28 @@ public class UserEditView extends HLayout {
UsersDataSource ds = UsersDataSource.getInstance();
- ds.filterData(new Criteria("id", "2"));
form.setUseAllDataSourceFields(true);
form.setDataSource(ds);
- form.setAutoFetchData(true);
- form.getField("id").hide();
+ subjectRolesEditorItem = new SubjectRolesEditorItem("rolesEditor","Assigned Roles");
+
- FormItem[] forms = form.getFields();
+ SubmitItem saveButton = new SubmitItem("save", "Save");
-
+ saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ form.saveData();
+ System.out.println("Save is done");
+ }
+ });
+ TextItem departmentItem = new TextItem("department");
+
+ ResetItem resetButton = new ResetItem("reset", "Reset");
+
+ form.setItems(departmentItem, subjectRolesEditorItem, saveButton, resetButton);
return form;
@@ -116,12 +137,38 @@ public class UserEditView extends HLayout {
}
- private Canvas buildRoleEditor() {
+ public void editRecord(Record record) {
+ form.getDataSource().getField("username").setCanEdit(false);
+
+ subjectRolesEditorItem.setSubject((Subject) record.getAttributeAsObject("entity"));
+ subjectRolesEditorItem.setRoles((Set<Role>) record.getAttributeAsObject("roles"));
+
+ try {
+ form.editRecord(record);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ message.hide();
+ form.show();
+ form.setSaveOperationType(DSOperationType.UPDATE);
+
+ }
+
+ public void editNone() {
+ message.show();
+ form.hide();
+ }
+
+ public void editNew() {
+ form.getDataSource().getField("username").setCanEdit(true);
- RolesView rv = new RolesView();
- // set subject criteria
- return rv;
+ ListGridRecord r = new ListGridRecord();
+ Subject subject = new Subject(); // todo make default constructor public
+ UsersDataSource.copyValues(subject, r);
+ editRecord(r);
+ form.setSaveOperationType(DSOperationType.ADD);
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
index dcf7199..8e88e06 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
@@ -19,23 +19,38 @@
package org.rhq.enterprise.gui.coregui.client.admin.users;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.SubjectCriteria;
+import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.SubjectGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
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.DataSourceField;
+import com.smartgwt.client.data.FieldValueExtractor;
+import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.rpc.RPCResponse;
+import com.smartgwt.client.types.FieldType;
+import com.smartgwt.client.util.JSOHelper;
+import com.smartgwt.client.widgets.form.validator.LengthRangeValidator;
+import com.smartgwt.client.widgets.form.validator.MatchesFieldValidator;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
/**
* @author Greg Hinkle
*/
@@ -53,21 +68,40 @@ public class UsersDataSource extends RPCDataSource {
return INSTANCE;
}
-
+
protected UsersDataSource() {
super("Users");
DataSourceField idDataField = new DataSourceIntegerField("id", "ID");
idDataField.setPrimaryKey(true);
+ idDataField.setCanEdit(false);
+
+ DataSourceTextField usernameField = new DataSourceTextField("username", "User Name", 100, true);
+ usernameField.setRequired(true);
+
+ DataSourceTextField firstName = new DataSourceTextField("firstName", "First Name", 100, true);
+
+ DataSourceTextField lastName = new DataSourceTextField("lastName", "Last Name", 100, true);
+
+ DataSourceTextField password = new DataSourceTextField("password", "Password", 100, false);
+ password.setType(FieldType.PASSWORD);
+
+ LengthRangeValidator passwordValdidator = new LengthRangeValidator();
+ passwordValdidator.setMin(6);
+ passwordValdidator.setErrorMessage("Password must be at least six characters");
+ password.setValidators(passwordValdidator);
+
- DataSourceTextField usernameField = new DataSourceTextField("username", "User Name");
- usernameField.setCanEdit(false);
+ DataSourceTextField passwordVerify = new DataSourceTextField("passwordVerify", "Verify", 100, false);
+ passwordVerify.setType(FieldType.PASSWORD);
- DataSourceTextField firstName = new DataSourceTextField("firstName", "First Name");
+ MatchesFieldValidator passwordsEqualValidator = new MatchesFieldValidator();
+ passwordsEqualValidator.setOtherField("password");
+ passwordsEqualValidator.setErrorMessage("Passwords do not match");
+ passwordVerify.setValidators(passwordsEqualValidator);
- DataSourceTextField lastName = new DataSourceTextField("lastName", "Last Name");
- DataSourceTextField email = new DataSourceTextField("email", "Email Address");
+ DataSourceTextField email = new DataSourceTextField("email", "Email Address", 100, true);
DataSourceTextField phone = new DataSourceTextField("phoneNumber", "Phone");
@@ -79,13 +113,13 @@ public class UsersDataSource extends RPCDataSource {
roles.setMultiple(true);
- setFields(idDataField, usernameField, firstName, lastName, phone, email, department);
+ setFields(idDataField, usernameField, firstName, lastName, password, passwordVerify, phone, email, department);
}
public void executeFetch(final DSRequest request, final DSResponse response) {
final long start = System.currentTimeMillis();
-
+
SubjectCriteria criteria = new SubjectCriteria();
criteria.setPageControl(getPageControl(request));
@@ -101,26 +135,155 @@ public class UsersDataSource extends RPCDataSource {
System.out.println("Data retrieved in: " + (System.currentTimeMillis() - start));
ListGridRecord[] records = new ListGridRecord[result.size()];
- for (int x=0; x<result.size(); x++) {
- Subject res = result.get(x);
+ for (int x = 0; x < result.size(); x++) {
+ Subject subject = result.get(x);
ListGridRecord record = new ListGridRecord();
- record.setAttribute("id",res.getId());
- record.setAttribute("username",res.getName());
-// record.setAttribute("name",res.getFirstName() + " " + res.getLastName());
- record.setAttribute("firstName", res.getFirstName());
- record.setAttribute("lastName", res.getLastName());
- record.setAttribute("factive", res.getFactive());
- record.setAttribute("department", res.getDepartment());
- record.setAttribute("phoneNumber", res.getPhoneNumber());
- record.setAttribute("email",res.getEmailAddress());
+
+ copyValues(subject, record);
+
records[x] = record;
}
response.setData(records);
- response.setTotalRows(result.getTotalSize()); // for paging to work we have to specify size of full result set
+ response.setTotalRows(result.getTotalSize()); // for paging to work we have to specify size of full result set
processResponse(request.getRequestId(), response);
}
});
}
+
+
+ @Override
+ protected void executeAdd(final DSRequest request, final DSResponse response) {
+ JavaScriptObject data = request.getData();
+ final ListGridRecord rec = new ListGridRecord(data);
+ Subject newSubject = new Subject();
+ copyValues(rec, newSubject);
+
+ subjectService.createSubject(newSubject, new AsyncCallback<Subject>() {
+ public void onFailure(Throwable caught) {
+ // TODO better exceptions so we can set the right validation errors
+ Map<String,String> errors = new HashMap<String, String>();
+ errors.put("username", "A user with this name already exists.");
+ response.setErrors(errors);
+// CoreGUI.getErrorHandler().handleError("Failed to create role",caught);
+ response.setStatus(RPCResponse.STATUS_VALIDATION_ERROR);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(Subject result) {
+ ListGridRecord record = new ListGridRecord();
+ copyValues(result,record);
+ response.setData(new Record[] {record});
+ processResponse(request.getRequestId(),response);
+ }
+ });
+
+ }
+
+ @Override
+ protected void executeUpdate(final DSRequest request, final DSResponse response) {
+ final ListGridRecord record = getEditedRecord(request);
+ System.out.println("Updating record: " + record);
+ final Subject updatedSubject = new Subject();
+ copyValues(record, updatedSubject);
+ subjectService.updateSubject(updatedSubject, new AsyncCallback<Subject>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to update subject",caught);
+ }
+
+ public void onSuccess(final Subject result) {
+
+ String password = record.getAttributeAsString("password");
+ if (password != null) {
+ subjectService.changePassword(updatedSubject.getName(), password, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to update subject's password",caught);
+ }
+
+ public void onSuccess(Void nothing) {
+ System.out.println("Subject Updated");
+ copyValues(result,record);
+ response.setData(new Record[] {record});
+ processResponse(request.getRequestId(),response);
+
+ }
+ });
+ } else {
+ System.out.println("Subject Updated");
+ copyValues(result,record);
+ response.setData(new Record[] {record});
+ processResponse(request.getRequestId(),response);
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void executeRemove(final DSRequest request, final DSResponse response) {
+ JavaScriptObject data = request.getData();
+ final ListGridRecord rec = new ListGridRecord(data);
+ Subject subjectToDelete = new Subject(); // TODO GH: Make default constructor public
+ copyValues(rec, subjectToDelete);
+
+ subjectService.deleteSubjects(new int[]{subjectToDelete.getId()}, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to delete role",caught);
+ }
+
+ public void onSuccess(Void result) {
+ System.out.println("Subject deleted");
+ response.setData(new Record[]{rec});
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+
+
+ private static void copyValues(ListGridRecord from, Subject to) {
+ to.setId(from.getAttributeAsInt("id"));
+ to.setName(from.getAttributeAsString("username"));
+ to.setFirstName(from.getAttributeAsString("firstName"));
+ to.setLastName(from.getAttributeAsString("lastName"));
+ to.setFactive(from.getAttributeAsBoolean("factive"));
+ to.setDepartment(from.getAttributeAsString("department"));
+ to.setPhoneNumber(from.getAttributeAsString("phoneNumber"));
+ to.setEmailAddress(from.getAttributeAsString("email"));
+
+ to.setRoles((Set<Role>) from.getAttributeAsObject("roles"));
+ }
+
+ static void copyValues(Subject from, ListGridRecord to) {
+ to.setAttribute("id", from.getId());
+ to.setAttribute("username", from.getName());
+ to.setAttribute("firstName", from.getFirstName());
+ to.setAttribute("lastName", from.getLastName());
+ to.setAttribute("factive", from.getFactive());
+ to.setAttribute("department", from.getDepartment());
+ to.setAttribute("phoneNumber", from.getPhoneNumber());
+ to.setAttribute("email", from.getEmailAddress());
+
+ to.setAttribute("roles",from.getRoles());
+
+ to.setAttribute("entity", from);
+ }
+
+
+
+ private ListGridRecord getEditedRecord(DSRequest request) {
+ // Retrieving values before edit
+ JavaScriptObject oldValues = request.getAttributeAsJavaScriptObject("oldValues");
+ // Creating new record for combining old values with changes
+ ListGridRecord newRecord = new ListGridRecord();
+ // Copying properties from old record
+ JSOHelper.apply(oldValues, newRecord.getJsObj());
+ // Retrieving changed values
+ JavaScriptObject data = request.getData();
+ // Apply changes
+ JSOHelper.apply(data, newRecord.getJsObj());
+ return newRecord;
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
index b6757ea..c2c0c6f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.gui.coregui.client.admin.users;
import org.rhq.enterprise.gui.coregui.client.Presenter;
+import org.rhq.enterprise.gui.coregui.client.admin.roles.RoleEditView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
import org.rhq.enterprise.gui.coregui.client.places.Place;
@@ -34,6 +35,7 @@ import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
@@ -51,24 +53,25 @@ import java.util.List;
/**
* @author Greg Hinkle
*/
-public class UsersView extends SectionStack implements Presenter {
-
-
+public class UsersView extends VLayout implements Presenter {
+ public UsersView() {
+ super();
+ setWidth100();
+ setHeight100();
+ }
@Override
protected void onInit() {
super.onInit();
- setVisibilityMode(VisibilityMode.MULTIPLE);
- setWidth100();
- setHeight100();
- final UsersDataSource datasource = UsersDataSource.getInstance();
+ final UsersDataSource datasource = UsersDataSource.getInstance();
VLayout gridHolder = new VLayout();
gridHolder.setWidth100();
- gridHolder.setHeight100();
+ gridHolder.setHeight("50%");
+ gridHolder.setShowResizeBar(true);
final ListGrid listGrid = new ListGrid();
listGrid.setWidth100();
@@ -79,21 +82,19 @@ public class UsersView extends SectionStack implements Presenter {
// listGrid.setAutoFitData(Autofit.HORIZONTAL);
listGrid.setAlternateRecordStyles(true);
// listGrid.setAutoFitData(Autofit.HORIZONTAL);
- listGrid.setSelectionType(SelectionStyle.SIMPLE);
- listGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
+// listGrid.setSelectionType(SelectionStyle.SIMPLE);
+// listGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
listGrid.setShowFilterEditor(true);
ListGridField idField = new ListGridField("id", "Id", 55);
idField.setType(ListGridFieldType.INTEGER);
-
+
ListGridField nameField = new ListGridField("username", "Name", 100);
+ ListGridField emailField = new ListGridField("email", "Email Address");
- ListGridField descriptionField = new ListGridField("name", "Name", 150);
- ListGridField emailField = new ListGridField("email", "Email Address", 100);
-
- listGrid.setFields(idField, nameField, descriptionField, emailField);
+ listGrid.setFields(idField, nameField, emailField);
gridHolder.addMember(listGrid);
@@ -105,10 +106,10 @@ public class UsersView extends SectionStack implements Presenter {
removeButton.setDisabled(true);
removeButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
- SC.confirm("Are you sure you want to delete " + listGrid.getSelection().length + " resources?",
+ SC.confirm("Are you sure you want to delete " + listGrid.getSelection().length + " users?",
new BooleanCallback() {
public void execute(Boolean aBoolean) {
-
+ // todo
}
}
);
@@ -116,20 +117,32 @@ public class UsersView extends SectionStack implements Presenter {
});
-
final Label tableInfo = new Label("Total: " + listGrid.getTotalRows());
tableInfo.setWrap(false);
+
+ final IButton addButton = new IButton("Add Role");
+ addButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ createUser();
+ }
+ });
+
+
toolStrip.addMember(removeButton);
+ toolStrip.addMember(addButton);
toolStrip.addMember(new LayoutSpacer());
toolStrip.addMember(tableInfo);
gridHolder.addMember(toolStrip);
+ final UserEditView userEditor = new UserEditView();
+
+
listGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
- int selectedCount = ((ListGrid)selectionEvent.getSource()).getSelection().length;
+ int selectedCount = ((ListGrid) selectionEvent.getSource()).getSelection().length;
tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + selectedCount + " selected)");
removeButton.setDisabled(selectedCount == 0);
}
@@ -141,22 +154,36 @@ public class UsersView extends SectionStack implements Presenter {
listGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
- for (Canvas c : detailsSection.getItems())
- c.destroy();
-
- detailsSection.setItems(new UserEditView());
- detailsSection.setExpanded(true);
- expandSection(1);
+ if (selectionEvent.getState()) {
+ userEditor.editRecord(selectionEvent.getRecord());
+ } else {
+ userEditor.editNone();
+ }
}
});
- SectionStackSection gridSection = new SectionStackSection("Search Users");
- gridSection.setExpanded(true);
- gridSection.setItems(gridHolder);
- addSection(gridSection);
- addSection(detailsSection);
+ addMember(gridHolder);
+ addMember(userEditor);
+ }
+
+
+ public void createUser() {
+
+ UserEditView editView = new UserEditView();
+
+ final Window roleEditor = new Window();
+ roleEditor.setTitle("Create User");
+ roleEditor.setWidth(800);
+ roleEditor.setHeight(800);
+ roleEditor.setIsModal(true);
+ roleEditor.setShowModalMask(true);
+ roleEditor.setCanDragResize(true);
+ roleEditor.centerInPage();
+ roleEditor.addItem(editView);
+ roleEditor.show();
+ editView.editNew();
}
public boolean fireDisplay(Place base, List<Place> subLocations) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SimpleCollapsiblePanel.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SimpleCollapsiblePanel.java
index e516d00..cb09a01 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SimpleCollapsiblePanel.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SimpleCollapsiblePanel.java
@@ -52,6 +52,7 @@ public class SimpleCollapsiblePanel extends VLayout {
button.setShowRollOver(false);
button.setActionType(SelectionType.RADIO);
button.setBorder(null);
+ button.setAutoFit(true);
button.setIcon("[skin]/images/SectionHeader/opener_opened.png");
@@ -66,6 +67,7 @@ public class SimpleCollapsiblePanel extends VLayout {
} else {
button.setIcon("[skin]/images/SectionHeader/opener_closed.png");
content.hide();
+ setHeight(30);
}
getParentElement().markForRedraw();
markForRedraw();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java
index d1fc4a3..d0cc937 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java
@@ -20,6 +20,8 @@ package org.rhq.enterprise.gui.coregui.client.gwt;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
+import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
+import org.rhq.core.domain.resource.group.GroupDefinition;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
@@ -36,4 +38,5 @@ public interface ResourceGroupGWTService extends RemoteService {
PageList<ResourceGroup> findResourceGroupsByCriteria(ResourceGroupCriteria criteria);
+ PageList<GroupDefinition> findGroupDefinitionsByCriteria(ResourceGroupDefinitionCriteria criteria);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java
index 66123f9..230dbdc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java
@@ -32,4 +32,9 @@ public interface RoleGWTService extends RemoteService {
PageList<Role> findRolesByCriteria(RoleCriteria criteria);
+ Role createRole(Role role);
+
+ Role updateRole(Role role);
+
+ void removeRoles(Integer[] roleIds);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
new file mode 100644
index 0000000..538fc95
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
@@ -0,0 +1,182 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.groups;
+
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
+
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.SelectionAppearance;
+import com.smartgwt.client.types.SelectionStyle;
+import com.smartgwt.client.util.BooleanCallback;
+import com.smartgwt.client.util.SC;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent;
+import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
+import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import java.util.ArrayList;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceGroupListView extends VLayout {
+
+ private ListGrid listGrid;
+
+
+ public ResourceGroupListView() {
+
+ setWidth100();
+ setHeight100();
+
+// DynamicForm searchPanel = new DynamicForm();
+// final TextItem searchBox = new TextItem("query", "Search Resources");
+// searchBox.setValue("");
+// searchPanel.setWrapItemTitles(false);
+// searchPanel.setFields(searchBox);
+//
+//
+// addMember(searchPanel);
+
+
+ final ResourceGroupsDataSource datasource = new ResourceGroupsDataSource();
+
+ VLayout gridHolder = new VLayout();
+
+ listGrid = new ListGrid();
+ listGrid.setWidth100();
+ listGrid.setHeight100();
+ listGrid.setDataSource(datasource);
+ listGrid.setAutoFetchData(true);
+ listGrid.setAlternateRecordStyles(true);
+// listGrid.setAutoFitData(Autofit.HORIZONTAL);
+// listGrid.setCriteria(new Criteria("name", searchPanel.getValueAsString("query")));
+
+ listGrid.setSelectionType(SelectionStyle.SIMPLE);
+ listGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
+ listGrid.setResizeFieldsInRealTime(true);
+
+
+ ListGridField idField = new ListGridField("id", "Id", 55);
+ idField.setType(ListGridFieldType.INTEGER);
+ ListGridField nameField = new ListGridField("name", "Name", 250);
+ nameField.setCellFormatter(new CellFormatter() {
+ public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
+ return "<a href=\"#ResourceGroup/" + listGridRecord.getAttribute("id") +"\">" + o + "</a>";
+ }
+ });
+
+
+ ListGridField descriptionField = new ListGridField("description", "Description");
+ ListGridField typeNameField = new ListGridField("typeName", "Type", 130);
+ ListGridField pluginNameField = new ListGridField("pluginName", "Plugin", 100);
+ ListGridField categoryField = new ListGridField("category", "Category", 60);
+
+ ListGridField availabilityField = new ListGridField("currentAvailability", "Availability", 55);
+
+ availabilityField.setAlign(Alignment.CENTER);
+ listGrid.setFields(idField, nameField, descriptionField, typeNameField, pluginNameField, categoryField, availabilityField);
+
+
+ gridHolder.addMember(listGrid);
+
+ ToolStrip toolStrip = new ToolStrip();
+ toolStrip.setMembersMargin(15);
+
+ final IButton removeButton = new IButton("Remove");
+ removeButton.setDisabled(true);
+ removeButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ SC.confirm("Are you sure you want to delete " + listGrid.getSelection().length + " resources?",
+ new BooleanCallback() {
+ public void execute(Boolean aBoolean) {
+
+ }
+ }
+ );
+ }
+ });
+
+
+
+
+ final Label tableInfo = new Label("Total: " + listGrid.getTotalRows());
+ tableInfo.setWrap(false);
+
+ toolStrip.addMember(removeButton);
+ toolStrip.addMember(new LayoutSpacer());
+ toolStrip.addMember(tableInfo);
+
+ gridHolder.addMember(toolStrip);
+
+
+ listGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ int selectedCount = ((ListGrid)selectionEvent.getSource()).getSelection().length;
+ tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + selectedCount + " selected)");
+ removeButton.setDisabled(selectedCount == 0);
+ }
+ });
+
+
+
+ addMember(gridHolder);
+
+
+ listGrid.addDataArrivedHandler(new DataArrivedHandler() {
+ public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
+ int selectedCount = ((ListGrid)dataArrivedEvent.getSource()).getSelection().length;
+ tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + selectedCount + " selected)");
+ }
+ });
+
+ /*
+ searchBox.addKeyPressHandler(new KeyPressHandler() {
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getCharacterValue() == KeyCodes.KEY_ENTER) {
+ datasource.setQuery((String) searchBox.getValue());
+ Criteria c = new Criteria("name", (String) searchBox.getValue());
+ long start = System.currentTimeMillis();
+ listGrid.fetchData(c);
+ System.out.println("Loaded in: " + (System.currentTimeMillis() - start));
+ }
+ }
+ });*/
+ }
+
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
index 69a8968..1f88e32 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
@@ -109,10 +109,11 @@ public class ResourceGroupsDataSource extends RPCDataSource {
record.setAttribute("description", group.getDescription());
record.setAttribute("groupCategory", group.getGroupCategory());
- record.setAttribute("resourceType", group.getResourceType());
- record.setAttribute("typeName", group.getResourceType().getName());
- record.setAttribute("pluginName", group.getResourceType().getPlugin());
-
+ if (group.getResourceType() != null) {
+ record.setAttribute("resourceType", group.getResourceType());
+ record.setAttribute("typeName", group.getResourceType().getName());
+ record.setAttribute("pluginName", group.getResourceType().getPlugin());
+ }
records[x] = record;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionDataSource.java
new file mode 100644
index 0000000..b5a9b89
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionDataSource.java
@@ -0,0 +1,114 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions;
+
+import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
+import org.rhq.core.domain.resource.group.GroupDefinition;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.DataSourceField;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.rpc.RPCResponse;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+/**
+ * @author Greg Hinkle
+ */
+public class GroupDefinitionDataSource extends RPCDataSource {
+
+
+ private ResourceGroupGWTServiceAsync groupService = GWTServiceLookup.getResourceGroupService();
+
+
+ public GroupDefinitionDataSource() {
+ super();
+
+ DataSourceField idDataField = new DataSourceIntegerField("id", "ID");
+ idDataField.setPrimaryKey(true);
+ idDataField.setCanEdit(false);
+
+ DataSourceTextField nameField = new DataSourceTextField("name", "Name");
+ DataSourceTextField descriptionField = new DataSourceTextField("description", "Description");
+ DataSourceTextField expressionField = new DataSourceTextField("expression", "Expression");
+ DataSourceTextField recalculationIntervalField = new DataSourceTextField("recalculationInterval", "Recalculation Interval");
+ DataSourceTextField modifiedTimeField = new DataSourceTextField("modifiedTime", "Modified Time");
+ DataSourceTextField createdTimeField = new DataSourceTextField("createdTime", "Created Time");
+ DataSourceTextField lastCalculationTimeField = new DataSourceTextField("lastCalculationTime", "Last Calculation Time");
+ DataSourceTextField nextCalculationTimeField = new DataSourceTextField("nextCalculationTime", "Next Calculation Time");
+ DataSourceTextField managedResourceGroupsField = new DataSourceTextField("managedResourceGroups", "Managed Resource Groups");
+
+
+ setFields(idDataField, nameField, descriptionField, expressionField, recalculationIntervalField, modifiedTimeField, createdTimeField, lastCalculationTimeField, nextCalculationTimeField, managedResourceGroupsField);
+
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+ ResourceGroupDefinitionCriteria criteria = new ResourceGroupDefinitionCriteria();
+ criteria.setPageControl(getPageControl(request));
+
+ groupService.findGroupDefinitionsByCriteria(criteria, new AsyncCallback<PageList<GroupDefinition>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load group definitions", caught);
+ }
+
+ public void onSuccess(PageList<GroupDefinition> result) {
+
+
+ response.setStatus(RPCResponse.STATUS_SUCCESS);
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+
+ }
+ });
+ }
+
+
+ public ListGridRecord[] buildRecords(PageList<GroupDefinition> definitions) {
+
+ ListGridRecord[] records = new ListGridRecord[definitions.size()];
+ int i = 0;
+ for (GroupDefinition def : definitions) {
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute("id", def.getId());
+ record.setAttribute("name", def.getName());
+ record.setAttribute("description", def.getDescription());
+ record.setAttribute("expression", def.getExpression());
+ record.setAttribute("recalculationInterval", def.getRecalculationInterval());
+ record.setAttribute("modifiedTime", def.getModifiedTime());
+ record.setAttribute("createdTime", def.getCreatedTime());
+ record.setAttribute("lastCalculationTime", def.getLastCalculationTime());
+ record.setAttribute("nextCalculationTime", def.getNextCalculationTime());
+ record.setAttribute("managedResourceGroups", def.getManagedResourceGroups());
+
+ records[i++] = record;
+ }
+
+ return records;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
new file mode 100644
index 0000000..91dc3ba
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
@@ -0,0 +1,173 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions;
+
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
+
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.SelectionAppearance;
+import com.smartgwt.client.types.SelectionStyle;
+import com.smartgwt.client.util.BooleanCallback;
+import com.smartgwt.client.util.SC;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+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 com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
+import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+/**
+ * @author Greg Hinkle
+ */
+public class GroupDefinitionListView extends VLayout {
+
+ private ListGrid listGrid;
+
+
+ public GroupDefinitionListView() {
+
+ setWidth100();
+ setHeight100();
+
+// DynamicForm searchPanel = new DynamicForm();
+// final TextItem searchBox = new TextItem("query", "Search Resources");
+// searchBox.setValue("");
+// searchPanel.setWrapItemTitles(false);
+// searchPanel.setFields(searchBox);
+//
+//
+// addMember(searchPanel);
+
+
+ final GroupDefinitionDataSource datasource = new GroupDefinitionDataSource();
+
+ VLayout gridHolder = new VLayout();
+
+ listGrid = new ListGrid();
+ listGrid.setWidth100();
+ listGrid.setHeight100();
+ listGrid.setDataSource(datasource);
+ listGrid.setAutoFetchData(true);
+ listGrid.setAlternateRecordStyles(true);
+// listGrid.setAutoFitData(Autofit.HORIZONTAL);
+// listGrid.setCriteria(new Criteria("name", searchPanel.getValueAsString("query")));
+
+ listGrid.setSelectionType(SelectionStyle.SIMPLE);
+ listGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
+ listGrid.setResizeFieldsInRealTime(true);
+
+
+ ListGridField idField = new ListGridField("id", "Id", 55);
+ idField.setType(ListGridFieldType.INTEGER);
+ ListGridField nameField = new ListGridField("name", "Name", 250);
+ nameField.setCellFormatter(new CellFormatter() {
+ public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
+ return "<a href=\"#ResourceGroupDefinition/" + listGridRecord.getAttribute("id") +"\">" + o + "</a>";
+ }
+ });
+
+
+ ListGridField descriptionField = new ListGridField("description", "Description");
+//// ListGridField typeNameField = new ListGridField("typeName", "Type", 130);
+//// ListGridField pluginNameField = new ListGridField("pluginName", "Plugin", 100);
+//// ListGridField categoryField = new ListGridField("category", "Category", 60);
+////
+//// ListGridField availabilityField = new ListGridField("currentAvailability", "Availability", 55);
+//
+// availabilityField.setAlign(Alignment.CENTER);
+// listGrid.setFields(idField, nameField, descriptionField, typeNameField, pluginNameField, categoryField, availabilityField);
+
+
+ gridHolder.addMember(listGrid);
+
+ ToolStrip toolStrip = new ToolStrip();
+ toolStrip.setMembersMargin(15);
+
+ final IButton removeButton = new IButton("Remove");
+ removeButton.setDisabled(true);
+ removeButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ SC.confirm("Are you sure you want to delete " + listGrid.getSelection().length + " resources?",
+ new BooleanCallback() {
+ public void execute(Boolean aBoolean) {
+
+ }
+ }
+ );
+ }
+ });
+
+
+
+
+ final Label tableInfo = new Label("Total: " + listGrid.getTotalRows());
+ tableInfo.setWrap(false);
+
+ toolStrip.addMember(removeButton);
+ toolStrip.addMember(new LayoutSpacer());
+ toolStrip.addMember(tableInfo);
+
+ gridHolder.addMember(toolStrip);
+
+
+ listGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ int selectedCount = ((ListGrid)selectionEvent.getSource()).getSelection().length;
+ tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + selectedCount + " selected)");
+ removeButton.setDisabled(selectedCount == 0);
+ }
+ });
+
+
+
+ addMember(gridHolder);
+
+
+ listGrid.addDataArrivedHandler(new DataArrivedHandler() {
+ public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
+ int selectedCount = ((ListGrid)dataArrivedEvent.getSource()).getSelection().length;
+ tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + selectedCount + " selected)");
+ }
+ });
+
+ /*
+ searchBox.addKeyPressHandler(new KeyPressHandler() {
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getCharacterValue() == KeyCodes.KEY_ENTER) {
+ datasource.setQuery((String) searchBox.getValue());
+ Criteria c = new Criteria("name", (String) searchBox.getValue());
+ long start = System.currentTimeMillis();
+ listGrid.fetchData(c);
+ System.out.println("Loaded in: " + (System.currentTimeMillis() - start));
+ }
+ }
+ });*/
+ }
+
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java
index b3bf91f..38fa943 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourcesView.java
@@ -21,6 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.Presenter;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupListView;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions.GroupDefinitionListView;
import org.rhq.enterprise.gui.coregui.client.places.Place;
import com.smartgwt.client.types.ContentsType;
@@ -130,14 +132,14 @@ public class ResourcesView extends HLayout implements Presenter {
treeGrid.setShowHeader(false);
Tree tree = new Tree();
- final TreeNode manageServersNode = new TreeNode("Groups");
- final TreeNode manageAgentsNode = new TreeNode("DynaGroups");
+ final TreeNode groupsNode = new TreeNode("Groups");
+ final TreeNode groupDefinitions = new TreeNode("DynaGroups");
final TreeNode manageAffinityGroupsNode = new TreeNode("Special Groups");
final TreeNode managePartitionEventsNode = new TreeNode("Greg's Groups");
tree.setRoot(new TreeNode("clustering",
- manageServersNode,
- manageAgentsNode,
+ groupsNode,
+ groupDefinitions,
manageAffinityGroupsNode,
managePartitionEventsNode));
@@ -152,10 +154,12 @@ public class ResourcesView extends HLayout implements Presenter {
pane.setHeight100();
String url = null;
- if (selectionEvent.getRecord() == manageServersNode) {
- url = "/rhq/ha/listServers.xhtml";
- } else if (selectionEvent.getRecord() == manageAgentsNode) {
- url = "/rhq/ha/listAgents.xhtml";
+ if (selectionEvent.getRecord() == groupsNode) {
+ setContent(new ResourceGroupListView());
+ return;
+ } else if (selectionEvent.getRecord() == groupDefinitions) {
+ setContent(new GroupDefinitionListView());
+ return;
} else if (selectionEvent.getRecord() == manageAffinityGroupsNode) {
url = "/rhq/ha/listAffinityGroups.xhtml";
} else if (selectionEvent.getRecord() == managePartitionEventsNode) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java
index 766f6a5..5fcee6b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java
@@ -20,6 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.util;
import com.smartgwt.client.util.SC;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -28,7 +29,7 @@ import java.util.List;
public class ErrorHandler {
- private List<String> errors;
+ private ArrayList<String> errors = new ArrayList<String>();
public void handleError(String message, Throwable t) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
index c979e3f..f484c29 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
@@ -49,20 +49,28 @@ public abstract class RPCDataSource extends DataSource {
setClientOnly(false);
setDataProtocol(DSProtocol.CLIENTCUSTOM);
setDataFormat(DSDataFormat.CUSTOM);
+
}
+
+
@Override
protected Object transformRequest(DSRequest request) {
try {
+ DSResponse response = createResponse(request);
+
switch (request.getOperationType()) {
case FETCH:
- DSResponse response = createResponse(request);
executeFetch(request, response);
break;
case ADD:
+ executeAdd(request, response);
+ break;
case UPDATE:
+ executeUpdate(request, response);
+ break;
case REMOVE:
- super.transformRequest(request);
+ executeRemove(request, response);
break;
default:
super.transformRequest(request);
@@ -123,6 +131,14 @@ public abstract class RPCDataSource extends DataSource {
throw new UnsupportedOperationException("This dataSource does not support removal.");
}
+ protected void executeAdd(final DSRequest request, final DSResponse response) {
+ throw new UnsupportedOperationException("This dataSource does not support addition.");
+ }
+
+ protected void executeUpdate(final DSRequest request, final DSResponse response) {
+ throw new UnsupportedOperationException("This dataSource does not support updates.");
+ }
+
private DSResponse createResponse(DSRequest request) {
DSResponse response = new DSResponse();
response.setAttribute("clientContext", request.getAttributeAsObject("clientContext"));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java
index a4ae911..867de6e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java
@@ -21,12 +21,15 @@ package org.rhq.enterprise.gui.coregui.server.gwt;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
+import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
+import org.rhq.core.domain.resource.group.GroupDefinition;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerBean;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
+import org.rhq.enterprise.server.resource.group.definition.GroupDefinitionManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -36,10 +39,19 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class ResourceGroupGWTServiceImpl extends AbstractGWTServiceImpl implements ResourceGroupGWTService {
private ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager();
+ private GroupDefinitionManagerLocal definitionManager = LookupUtil.getGroupDefinitionManager();
+
public PageList<ResourceGroup> findResourceGroupsByCriteria(ResourceGroupCriteria criteria) {
return SerialUtility.prepare(groupManager.findResourceGroupsByCriteria(getSessionSubject(), criteria),
"ResourceGroupService.findResourceGroupsByCriteria");
}
+ // TODO GH: build and expose findResourceGroupCompositesByCriteria
+
+ public PageList<GroupDefinition> findGroupDefinitionsByCriteria(ResourceGroupDefinitionCriteria criteria) {
+ return SerialUtility.prepare(definitionManager.findGroupDefinitionsByCriteria(getSessionSubject(), criteria),
+ "ResourceGroupService.findGroupDefinitionsByCriteria");
+ }
+
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java
index 360e078..373322f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java
@@ -47,4 +47,19 @@ public class RoleGWTServiceImpl extends AbstractGWTServiceImpl implements RoleGW
return SerialUtility.prepare(roleManager.findRolesByCriteria(getSessionSubject(), criteria),
"RoleService.findRolesByCriteria");
}
+
+ public Role createRole(Role role) {
+ return SerialUtility.prepare(roleManager.createRole(getSessionSubject(), role),
+ "RoleService.createRole");
+ }
+
+ public Role updateRole(Role role) {
+ return SerialUtility.prepare(roleManager.updateRole(getSessionSubject(), role),
+ "RoleService.updateRole");
+ }
+
+ public void removeRoles(Integer[] roleIds) {
+ roleManager.deleteRoles(getSessionSubject(), roleIds);
+ }
+
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index f347e10..a46900c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
@@ -39,19 +39,20 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
public void changePassword(String username, String password) {
- // TODO: Implement this method.
+ subjectManager.changePassword(getSessionSubject(), username, password);
}
public void createPrincipal(String username, String password) {
- // TODO: Implement this method.
+ subjectManager.createPrincipal(getSessionSubject(), username, password);
}
public Subject createSubject(Subject subjectToCreate) {
- return null; // TODO: Implement this method.
+ return SerialUtility.prepare(subjectManager.createSubject(getSessionSubject(), subjectToCreate),
+ "SubjectManager.createSubject");
}
public void deleteSubjects(int[] subjectIds) {
- // TODO: Implement this method.
+ subjectManager.deleteSubjects(getSessionSubject(),subjectIds);
}
public Subject login(String username, String password) {
@@ -63,11 +64,12 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
public void logout(Subject subject) {
- // TODO: Implement this method.
+ subjectManager.logout(subject.getSessionId());
}
public Subject updateSubject(Subject subjectToModify) {
- return null; // TODO: Implement this method.
+ return SerialUtility.prepare(subjectManager.updateSubject(getSessionSubject(), subjectToModify),
+ "SubjectManager.updateSubject");
}
public PageList<Subject> findSubjectsByCriteria(SubjectCriteria criteria) {
commit c5a5bf943e8e0f1e584ec5650a9707be919a7868
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Tue Mar 2 10:39:55 2010 -0500
Group Definition criteria query access
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupDefinitionCriteria.java
new file mode 100644
index 0000000..9116dc8
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupDefinitionCriteria.java
@@ -0,0 +1,108 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.domain.criteria;
+
+import org.rhq.core.domain.resource.group.GroupDefinition;
+import org.rhq.core.domain.util.PageOrdering;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+/**
+ * @author Greg Hinkle
+ */
+(a)XmlAccessorType(XmlAccessType.FIELD)
+@SuppressWarnings("unused")
+public class ResourceGroupDefinitionCriteria extends Criteria {
+ private static final long serialVersionUID = 1L;
+
+
+ private Integer filterId;
+ private String filterName;
+ private String filterDescription;
+ private Boolean filterRecursive;
+ private String filterExpression;
+
+ private boolean fetchManagedResourceGroups;
+
+ private PageOrdering sortName;
+ private PageOrdering sortDescription;
+ private PageOrdering sortRecursive;
+ private PageOrdering sortExpression;
+
+
+ public ResourceGroupDefinitionCriteria() {
+ super(GroupDefinition.class);
+ }
+
+ @Override
+ public Class getPersistentClass() {
+ return GroupDefinition.class;
+ }
+
+ public void addFilterId(Integer filterId) {
+ this.filterId = filterId;
+ }
+
+ public void addFilterName(String filterName) {
+ this.filterName = filterName;
+ }
+
+ public void addFilterDescription(String filterDescription) {
+ this.filterDescription = filterDescription;
+ }
+
+ public void addFilterRecursive(Boolean filterRecursive) {
+ this.filterRecursive = filterRecursive;
+ }
+
+ public void addFilterExpression(String filterExpression) {
+ this.filterExpression = filterExpression;
+ }
+
+
+ public void fetchManagedResourceGroups(boolean fetchManagedResourceGroups) {
+ this.fetchManagedResourceGroups = fetchManagedResourceGroups;
+ }
+
+
+ public void addSortName(PageOrdering sortName) {
+ addSortField("name");
+ this.sortName = sortName;
+ }
+
+ public void addSortDescription(PageOrdering sortDescription) {
+ addSortField("description");
+ this.sortDescription = sortDescription;
+ }
+
+ public void addSortRecursive(PageOrdering sortRecursive) {
+ addSortField("recursive");
+ this.sortRecursive = sortRecursive;
+ }
+
+ public void addSortExpression(PageOrdering sortExpression) {
+ addSortField("expression");
+ this.sortExpression = sortExpression;
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
index 3a3f842..9dc3430 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
@@ -51,6 +51,8 @@ import org.rhq.core.db.PostgresqlDatabaseType;
import org.rhq.core.db.SQLServerDatabaseType;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.ResourceFacets;
import org.rhq.core.domain.resource.group.GroupDefinition;
@@ -65,6 +67,7 @@ import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
@@ -81,6 +84,8 @@ import org.rhq.enterprise.server.resource.group.definition.framework.ExpressionE
import org.rhq.enterprise.server.resource.group.definition.framework.InvalidExpressionException;
import org.rhq.enterprise.server.resource.group.definition.mbean.GroupDefinitionRecalculationThreadMonitor;
import org.rhq.enterprise.server.resource.group.definition.mbean.GroupDefinitionRecalculationThreadMonitorMBean;
+import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
+import org.rhq.enterprise.server.util.CriteriaQueryRunner;
@Stateless
@javax.annotation.Resource(name = "RHQ_DS", mappedName = RHQConstants.DATASOURCE_JNDI_NAME)
@@ -555,6 +560,20 @@ public class GroupDefinitionManagerBean implements GroupDefinitionManagerLocal {
}
}
+ public PageList<GroupDefinition> findGroupDefinitionsByCriteria(Subject subject, ResourceGroupDefinitionCriteria criteria) {
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
+ if (authorizationManager.isInventoryManager(subject) == false) {
+ if (criteria.isInventoryManagerRequired()) {
+ throw new PermissionException("Subject [" + subject.getName()
+ + "] requires InventoryManager permission for requested query criteria.");
+ }
+ }
+
+ CriteriaQueryRunner<GroupDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator, entityManager);
+
+ return queryRunner.execute();
+ }
+
public int getGroupDefinitionCount(Subject subject) {
if (authorizationManager.isInventoryManager(subject)) {
Query queryCount = PersistenceUtility.createCountQuery(entityManager, GroupDefinition.QUERY_FIND_ALL);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerLocal.java
index a7c8a86..4738625 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerLocal.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.server.resource.group.definition;
import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
import org.rhq.core.domain.resource.group.GroupDefinition;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.core.domain.util.PageControl;
@@ -60,6 +61,8 @@ public interface GroupDefinitionManagerLocal {
PageList<GroupDefinition> getGroupDefinitions(Subject subject, PageControl pc);
+ PageList<GroupDefinition> findGroupDefinitionsByCriteria(Subject subject, ResourceGroupDefinitionCriteria criteria);
+
int getGroupDefinitionCount(Subject subject);
int getAutoRecalculationGroupDefinitionCount(Subject subject);
14 years, 2 months
[rhq] Branch 'raw-config' - modules/core modules/enterprise
by Adam Young
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationValidationException.java | 3 --
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java | 6 ++++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 2 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java | 12 ++++++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 6 +++++
5 files changed, 25 insertions(+), 4 deletions(-)
New commits:
commit e8349c224d74fe7a351bafc2be2f36317a10b7d3
Author: Adam Young <ayoung(a)redhat.com>
Date: Tue Mar 2 11:44:34 2010 -0500
More work on the exception handling for validate.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationValidationException.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationValidationException.java
index d187d4a..8dfa6e7 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationValidationException.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationValidationException.java
@@ -25,11 +25,10 @@ package org.rhq.core.clientapi.agent.configuration;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-public class ConfigurationValidationException extends RuntimeException implements Serializable{
+public class ConfigurationValidationException extends Exception implements Serializable {
/**
*
*/
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
index c10bd22..f482616 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ResourceConfigurationEditor.java
@@ -102,9 +102,13 @@ public class ResourceConfigurationEditor extends ResourceConfigurationViewer imp
private Configuration translateToStructured() throws ResourceNotFoundException, ConfigurationValidationException {
ConfigurationManagerLocal configurationMgr = LookupUtil.getConfigurationManager();
- return configurationMgr.translateResourceConfiguration(loggedInUser.getSubject(), resourceId,
+ Configuration result = configurationMgr.translateResourceConfiguration(loggedInUser.getSubject(), resourceId,
resourceConfiguration, RAW_MODE);
+ configurationMgr.validateResourceConfiguration(loggedInUser.getSubject(), resourceId, result, true);
+
+ return result;
+
}
@Observer("rawConfigUpdate")
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 71370f2..ea805b1 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
@@ -992,7 +992,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
return newUpdate;
}
- private void validateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
+ public void validateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
boolean isStructured) throws ConfigurationValidationException {
Resource resource = entityManager.find(Resource.class, resourceId);
if (resource == null) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java
index 0d7ae1b..05d7b88 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java
@@ -277,4 +277,16 @@ public interface ConfigurationManagerRemote {
Configuration translateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
boolean fromStructured) throws ResourceNotFoundException, ConfigurationValidationException;
+ /**
+ * Calls down to the plugin to determine if the configuration is valid or not.
+ * @param subject to determine if the caller has permissions to perform the action
+ * @param resourceId the resource that the configuration is for
+ * @param configuration the configuration, with either the raw of structured modified
+ * that will be validated by the plugin
+ * @param isStructured true if the structured config should be validated, false, the raw config is validated
+ * @throws ConfigurationValidationException if the specified configuration is invalid
+ */
+ public void validateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
+ boolean isStructured) throws ConfigurationValidationException;
+
}
\ No newline at end of file
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 75ebb67..7029438 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
@@ -492,6 +492,11 @@ public class WebservicesManagerBean implements WebservicesRemote {
return configurationManager.translateResourceConfiguration(subject, resourceId, configuration, fromStructured);
}
+ public void validateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
+ boolean isStructured) throws ConfigurationValidationException {
+ configurationManager.validateResourceConfiguration(subject, resourceId, configuration, isStructured);
+ }
+
//CONFIGURATIONMANAGER: END ----------------------------------
//CONTENTMANAGER: BEGIN ----------------------------------
@@ -1077,4 +1082,5 @@ public class WebservicesManagerBean implements WebservicesRemote {
public List<EntitlementCertificate> getCertificates(Subject subject, int resourceId) {
return entitlementManager.getCertificates(subject, resourceId);
}
+
}
14 years, 2 months
[rhq] Branch 'gwt' - 2 commits - modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadCrumb.java | 106 ----------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java | 17 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadcrumbTrailPane.java | 106 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 91 ++------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/report/InventorySummaryReportView.java | 35 ---
modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/downloads-body.xhtml | 101 +++++++++
modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/report/resourceInstallReport-body.xhtml | 2
8 files changed, 244 insertions(+), 218 deletions(-)
New commits:
commit 12b9f3e85501ef0657e83e2528447c223f0e9606
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Tue Mar 2 11:25:37 2010 -0500
rename BreadCrumb class to BreadcrumbTrailRenderer; start using FullHTMLPane in AdministrationView; add IFRAME-based Administratio/Settings/Downloads view; fix links on Administration/Reports/InventorySummary view
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadCrumb.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadCrumb.java
deleted file mode 100644
index c57c352..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadCrumb.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client;
-
-import com.google.gwt.user.client.Window;
-import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.HTMLPane;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * GWT widget for the breadcrumb trail, which is displayed at the top of each page.
- *
- * @author Greg Hinkle
- * @author Ian Springer
- */
-public class BreadCrumb extends HTMLPane {
-
- private List<Breadcrumb> breadcrumbs = new ArrayList<Breadcrumb>();
-
- public BreadCrumb() {
- setHeight(28);
- setBackgroundColor("#E6E3E3");
- setPadding(5);
- setOverflow(Overflow.CLIP_V);
- }
-
- public List<Breadcrumb> getBreadcrumbs() {
- return this.breadcrumbs;
- }
-
- public void setBreadcrumbs(List<Breadcrumb> breadcrumbs) {
- this.breadcrumbs = breadcrumbs;
- }
-
- public void refresh() {
- try {
- boolean first = true;
- StringBuilder path = new StringBuilder();
- StringBuilder content = new StringBuilder();
- content.append("<div class=\"BreadCrumb\">");
- for (int i = 0, trailSize = this.breadcrumbs.size(); i < trailSize; i++) {
- if (!first) {
- path.append("/");
- content.append(" > ");
- } else {
- first = false;
- }
-
- Breadcrumb breadcrumb = breadcrumbs.get(i);
- path.append(breadcrumb.getName());
-
- if ((i == (trailSize - 1) || !breadcrumb.isHyperlink())) {
- // last item in trail is the current page and so should not be a link
- content.append(breadcrumb.getDisplayName());
- } else {
- content.append("<a href=\"#");
- // NOTE: We have to call toString() below, because GWT chokes if you try to append a StringBuilder.
- content.append(path.toString());
- content.append("\">");
- content.append(breadcrumb.getDisplayName());
- content.append("</a>");
- }
- content.append("\n");
- }
- content.append("</div>");
-
- setContents(content.toString());
- } catch (Throwable t) {
- System.err.println("Failed to refresh bread crumb HTML - cause: " + t);
- }
-
- String title = "RHQ";
- if (!breadcrumbs.isEmpty()) {
- title += ": " + this.breadcrumbs.get(this.breadcrumbs.size() - 1);
- }
- Window.setTitle(title);
-
- redraw();
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder("BreadCrumb[");
- result.append(this.breadcrumbs);
- result.append("]");
- return result.toString();
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadcrumbTrailPane.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadcrumbTrailPane.java
new file mode 100644
index 0000000..c522ce2
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadcrumbTrailPane.java
@@ -0,0 +1,106 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client;
+
+import com.google.gwt.user.client.Window;
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.HTMLPane;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * GWT widget for the breadcrumb trail, which is displayed at the top of each page.
+ *
+ * @author Greg Hinkle
+ * @author Ian Springer
+ */
+public class BreadcrumbTrailPane extends HTMLPane {
+
+ private List<Breadcrumb> breadcrumbs = new ArrayList<Breadcrumb>();
+
+ public BreadcrumbTrailPane() {
+ setHeight(28);
+ setBackgroundColor("#E6E3E3");
+ setPadding(5);
+ setOverflow(Overflow.CLIP_V);
+ }
+
+ public List<Breadcrumb> getBreadcrumbs() {
+ return this.breadcrumbs;
+ }
+
+ public void setBreadcrumbs(List<Breadcrumb> breadcrumbs) {
+ this.breadcrumbs = breadcrumbs;
+ }
+
+ public void refresh() {
+ try {
+ boolean first = true;
+ StringBuilder path = new StringBuilder();
+ StringBuilder content = new StringBuilder();
+ content.append("<div class=\"BreadCrumb\">");
+ for (int i = 0, trailSize = this.breadcrumbs.size(); i < trailSize; i++) {
+ if (!first) {
+ path.append("/");
+ content.append(" > ");
+ } else {
+ first = false;
+ }
+
+ Breadcrumb breadcrumb = breadcrumbs.get(i);
+ path.append(breadcrumb.getName());
+
+ if ((i == (trailSize - 1) || !breadcrumb.isHyperlink())) {
+ // last item in trail is the current page and so should not be a link
+ content.append(breadcrumb.getDisplayName());
+ } else {
+ content.append("<a href=\"#");
+ // NOTE: We have to call toString() below, because GWT chokes if you try to append a StringBuilder.
+ content.append(path.toString());
+ content.append("\">");
+ content.append(breadcrumb.getDisplayName());
+ content.append("</a>");
+ }
+ content.append("\n");
+ }
+ content.append("</div>");
+
+ setContents(content.toString());
+ } catch (Throwable t) {
+ System.err.println("Failed to refresh bread crumb HTML - cause: " + t);
+ }
+
+ String title = "RHQ";
+ if (!breadcrumbs.isEmpty()) {
+ title += ": " + this.breadcrumbs.get(this.breadcrumbs.size() - 1);
+ }
+ Window.setTitle(title);
+
+ redraw();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder result = new StringBuilder("BreadCrumb[");
+ result.append(this.breadcrumbs);
+ result.append("]");
+ return result.toString();
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 24dbe6e..67881a4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -49,7 +49,7 @@ public class CoreGUI implements EntryPoint {
private static ErrorHandler errorHandler = new ErrorHandler();
- private static BreadCrumb breadCrumb;
+ private static BreadcrumbTrailPane breadCrumb;
private static Canvas content;
@@ -146,7 +146,7 @@ public class CoreGUI implements EntryPoint {
rootCanvas.addMember(menuBarView);
- breadCrumb = new BreadCrumb();
+ breadCrumb = new BreadcrumbTrailPane();
rootCanvas.addMember(breadCrumb);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index e8804bd..18673f1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -24,11 +24,9 @@ import org.rhq.enterprise.gui.coregui.client.View;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewRenderer;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
-import org.rhq.enterprise.gui.coregui.client.admin.report.InventorySummaryReportView;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesView;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersView;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
+import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import com.smartgwt.client.types.ContentsType;
import com.smartgwt.client.types.VisibilityMode;
@@ -45,14 +43,19 @@ import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeNode;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
/**
*
* @author Greg Hinkle
*/
-public class AdministrationView extends HLayout implements Presenter, ViewRenderer {
+public class AdministrationView extends HLayout implements ViewRenderer {
+ public static final String VIEW_PATH = "Administration";
+
+ public static final String SUBVIEW_PATH_REPORTS = VIEW_PATH + ViewId.PATH_SEPARATOR + "Reports";
+ public static final String SUBVIEW_PATH_REPORTS_INVENTORY_SUMMARY = SUBVIEW_PATH_REPORTS + ViewId.PATH_SEPARATOR + "InventorySummary";
+
+ private static final String IFRAME_URL_INVENTORY_SUMMARY_REPORT = "/rhq/admin/report/resourceInstallReport-body.xhtml";
private SectionStack sectionStack;
@@ -256,10 +259,11 @@ public class AdministrationView extends HLayout implements Presenter, ViewRender
Tree tree = new Tree();
final TreeNode manageSettings = new TreeNode("System Settings");
final TreeNode manageTemplates = new TreeNode("Templates");
+ final TreeNode manageDownloads = new TreeNode("Downloads");
final TreeNode manageLicense = new TreeNode("License");
tree.setRoot(new TreeNode("System Configuration",
- manageSettings, manageTemplates, manageLicense));
+ manageSettings, manageTemplates, manageDownloads, manageLicense));
systemConfigTreeGrid.setData(tree);
@@ -267,19 +271,21 @@ public class AdministrationView extends HLayout implements Presenter, ViewRender
systemConfigTreeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
if (selectionEvent.getState()) {
- HTMLPane pane = new HTMLPane();
- pane.setContentsType(ContentsType.PAGE);
- pane.setWidth100();
- pane.setHeight100();
-
- String url = null;
+ String url;
if (selectionEvent.getRecord() == manageSettings) {
url = "/admin/config/Config.do?mode=edit";
} else if (selectionEvent.getRecord() == manageTemplates) {
url = "/admin/config/EditDefaults.do?mode=monitor&viewMode=all";
+ } else if (selectionEvent.getRecord() == manageDownloads) {
+ url = "/rhq/admin/downloads-body.xhtml";
+ } else if (selectionEvent.getRecord() == manageLicense) {
+ url = "/admin/license/LicenseAdmin.do?mode=view";
+ } else {
+ throw new IllegalStateException("Unknown record selected: " + selectionEvent.getRecord());
}
+ url += "&nomenu=true";
- pane.setContentsURL(url + "&nomenu=true");
+ FullHTMLPane pane = new FullHTMLPane(url);
setContent(pane);
for (TreeGrid treeGrid : treeGrids) {
if (treeGrid != systemConfigTreeGrid) {
@@ -315,9 +321,7 @@ public class AdministrationView extends HLayout implements Presenter, ViewRender
reportsTreeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
if (selectionEvent.getState()) {
- HTMLPane pane = new InventorySummaryReportView();
- setContent(pane);
- CoreGUI.goTo(InventorySummaryReportView.PATH);
+ CoreGUI.goTo(SUBVIEW_PATH_REPORTS_INVENTORY_SUMMARY);
for (TreeGrid treeGrid : treeGrids) {
if (treeGrid != reportsTreeGrid) {
treeGrid.deselectAllRecords();
@@ -332,7 +336,6 @@ public class AdministrationView extends HLayout implements Presenter, ViewRender
return section;
}
-
public void setContent(Canvas newContent) {
if (contentCanvas.getChildren().length > 0)
@@ -343,54 +346,6 @@ public class AdministrationView extends HLayout implements Presenter, ViewRender
}
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- try {
- if (base.equals(getPlace())) {
- if (!subLocations.isEmpty()) {
- Place child = subLocations.get(0);
- String childId = child.getId();
- if (childId.equals("Reports")) {
- if (subLocations.size() >= 2) {
- Place grandchild = subLocations.get(1);
- String grandchildId = grandchild.getId();
- if (grandchildId.equals("InventorySummary")) {
- HTMLPane pane = new InventorySummaryReportView();
- setContent(pane);
- return true;
- }
- }
- }
- }
- }
- } catch (Exception e) {
- System.err.println(e);
- }
- return false;
- }
-
- public Place getPlace() {
- return new Place("Administration", "Administration");
- }
-
- public List<Breadcrumb> render(List<String> breadcrumbNames) {
- if (breadcrumbNames == null || breadcrumbNames.size() < 2) {
- return Collections.emptyList();
- }
- List<Breadcrumb> renderedBreadcrumbs = new ArrayList<Breadcrumb>(breadcrumbNames.size());
- String firstBreadcrumbName = breadcrumbNames.get(0);
- if (firstBreadcrumbName.equals("Reports")) {
- String secondBreadcrumbName = breadcrumbNames.get(1);
- if (secondBreadcrumbName.equals("InventorySummary")) {
- HTMLPane pane = new InventorySummaryReportView();
- setContent(pane);
- renderedBreadcrumbs.add(new Breadcrumb("Reports"));
- renderedBreadcrumbs.add(new Breadcrumb("InventorySummary"));
- }
- }
- return renderedBreadcrumbs;
- }
-
public View renderView(ViewId viewId, View parentView, boolean lastNode) throws UnknownViewException {
String parentPath = parentView.getId().getPath();
if (parentPath.equals("Administration")) {
@@ -403,9 +358,9 @@ public class AdministrationView extends HLayout implements Presenter, ViewRender
return new View(viewId, new Breadcrumb(viewId.getName(), false));
}
} else if (parentPath.equals("Administration/Reports")) {
- InventorySummaryReportView canvas = new InventorySummaryReportView();
- setContent(canvas);
- return new View(viewId, canvas);
+ FullHTMLPane pane = new FullHTMLPane(IFRAME_URL_INVENTORY_SUMMARY_REPORT);
+ setContent(pane);
+ return new View(viewId, pane);
}
throw new UnknownViewException();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/report/InventorySummaryReportView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/report/InventorySummaryReportView.java
deleted file mode 100644
index 1faeba5..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/report/InventorySummaryReportView.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.rhq.enterprise.gui.coregui.client.admin.report;
-
-import com.smartgwt.client.types.ContentsType;
-import com.smartgwt.client.widgets.HTMLPane;
-import org.rhq.enterprise.gui.coregui.client.BreadCrumb;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.Presenter;
-import org.rhq.enterprise.gui.coregui.client.places.Place;
-
-import java.util.List;
-
-/**
- * @author Ian Springer
- */
-public class InventorySummaryReportView extends HTMLPane implements Presenter {
- public static final String PATH = "Administration/Reports/InventorySummary";
- public static final Place PLACE = new Place(PATH.substring(PATH.lastIndexOf('/') + 1), null);
- private static final String URL = "/rhq/admin/report/resourceInstallReport-body.xhtml";
-
- public InventorySummaryReportView() {
- super();
- setContentsType(ContentsType.PAGE);
- setWidth100();
- setHeight100();
- setContentsURL(URL);
- }
-
- public boolean fireDisplay(Place base, List<Place> subLocations) {
- return false;
- }
-
- public Place getPlace() {
- return PLACE;
- }
-}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/downloads-body.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/downloads-body.xhtml
new file mode 100644
index 0000000..ce33488
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/downloads-body.xhtml
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+
+<ui:composition
+ template="/rhq/layout/main.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
+
+ <ui:param name="disableMenu" value="true"/>
+ <ui:param name="disableBreadcrumbs" value="true"/>
+
+ <ui:define name="body">
+
+ <rich:panel>
+ <f:facet name="header">
+ <h:outputText value="Downloads"/>
+ </f:facet>
+
+ <h:panelGrid columns="1" width="100%">
+
+ <h:outputLink value="/agentupdate/download">
+ <h:graphicImage value="/images/icons/Save_32.png"/>
+ <h:outputText value="Download Agent Installer"/>
+ </h:outputLink>
+
+ <h:panelGroup>
+ <span class="DisplayLabel">Agent Version: </span>
+ <h:outputText value="#{DownloadsUIBean.agentVersionProperties['rhq-agent.latest.version']}"/><br/>
+ <span class="DisplayLabel">Agent Build: </span>
+ <h:outputText value="#{DownloadsUIBean.agentVersionProperties['rhq-agent.latest.build-number']}"/><br/>
+ <span class="DisplayLabel">Agent MD5: </span>
+ <h:outputText value="#{DownloadsUIBean.agentVersionProperties['rhq-agent.latest.md5']}"/>
+ </h:panelGroup>
+
+
+ <h3>Agent Install</h3>
+
+ <p>
+ <b>java -jar <agent-download.jar> --install[=<new agent dir>]</b><br/>
+ When specified, this will install a new agent
+ without attempting to update any existing
+ agent. If you do not specify the directory,
+ the default is:.
+ Note the directory will be the parent of the
+ new agent home installation directory.
+ This is mutually exclusive of --update
+ </p>
+
+
+ <h3>Agent Update</h3>
+
+ <p>
+ <b>java -jar <agent-download.jar> --update[=<old agent home>]</b><br/>
+ When specified, this will update an existing
+ agent. If you do not specify the directory
+ where the existing agent is, the default is:
+ rhq-agent
+ This is mutually exclusive of --install
+ </p>
+
+
+ <h3>Connector Downloads</h3>
+ <ui:repeat var="download" value="#{DownloadsUIBean.connectorDownloadFiles}">
+ <h:outputLink value="/downloads/connectors/#{download.name}">
+ <h:outputText value="#{download.name}"/>
+ </h:outputLink>
+ <br/>
+ </ui:repeat>
+
+ </h:panelGrid>
+ </rich:panel>
+
+ <rich:panel>
+ <f:facet name="header">
+ <h:outputText value="Command Line Client Download"/>
+ </f:facet>
+
+ <h:panelGrid columns="1" width="100%">
+
+ <h:outputLink value="/client/download">
+ <h:graphicImage value="/images/icons/Save_32.png"/>
+ <h:outputText value="Download Client Installer"/>
+ </h:outputLink>
+
+ <h:panelGroup>
+ <span class="DisplayLabel">Client Version: </span> <h:outputText value="#{DownloadsUIBean.clientVersionProperties['rhq-server.version']}"/><br/>
+ <span class="DisplayLabel">Client Build: </span> <h:outputText value="#{DownloadsUIBean.clientVersionProperties['rhq-server.build-number']}"/>
+ </h:panelGroup>
+
+ </h:panelGrid>
+ </rich:panel>
+
+ </ui:define>
+</ui:composition>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/report/resourceInstallReport-body.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/report/resourceInstallReport-body.xhtml
index 65ce5ee..81ac667 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/report/resourceInstallReport-body.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/report/resourceInstallReport-body.xhtml
@@ -48,7 +48,7 @@
<f:facet name="header">
Type
</f:facet>
- <h:outputLink value="#Resources" target="_top">
+ <h:outputLink value="/coregui/CoreGUI.html#Resources" target="_top">
<h:outputText value="#{installReport.typeName}"/>
</h:outputLink>
</rich:column>
commit cadfa16f30d8bad35db39e03a24baae9ef09914f
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Tue Mar 2 08:14:08 2010 -0500
small improvement to getDefaultDisplayName()
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java
index 4d61b96..3abac57 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java
@@ -98,12 +98,17 @@ public class Breadcrumb {
StringBuilder displayName = new StringBuilder();
boolean first = true;
for (int i = 0; i < this.name.length(); i++) {
- char c = this.name.charAt(i);
- if (Character.isUpperCase(c) && !first) {
- displayName.append(" ");
- }
- first = false;
- displayName.append(c);
+ char currentChar = this.name.charAt(i);
+ if (!first) {
+ if (Character.isUpperCase(currentChar)) {
+ if ((i + 1) == this.name.length() || Character.isLowerCase(this.name.charAt(i + 1))) {
+ displayName.append(" ");
+ }
+ }
+ } else {
+ first = false;
+ }
+ displayName.append(currentChar);
}
return displayName.toString();
}
14 years, 2 months