modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
| 16 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
| 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
| 102 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ValidationStateChangeListener.java
| 27 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tree/EnhancedTreeNode.java
| 12 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
| 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
| 32 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ResourceConfigurationEditView.java
| 34 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationEditView.java
| 34 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
| 30 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
| 73 +++++++
modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
| 28 ++
14 files changed, 330 insertions(+), 72 deletions(-)
New commits:
commit 114cb5096cc46be1c78eeda894f8567b6a616306
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Sep 29 19:23:13 2010 -0400
fix various bugs in config component; add new MessageBar component for displaying
JSF-like messages
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
index 336aff1..938b07f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
@@ -27,6 +27,9 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+/**
+ *
+ */
public class StringUtils {
private static final Set<String> LOWERCASE_WORDS = new
HashSet<String>();
static {
@@ -62,18 +65,17 @@ public class StringUtils {
+ target.substring(nextDash + 2);
}
- result.append(Character.toUpperCase(target.charAt(0)));
-
StringBuilder currentWord = new StringBuilder();
char currentChar;
- char previousChar = target.charAt(0);
- for (int i = 1; i < target.length(); i++) {
+ char previousChar = 0;
+ for (int i = 0; i < target.length(); i++) {
currentChar = target.charAt(i);
- // Obey multi-digit numbers and acronyms
- if ((Character.isDigit(currentChar) &&
!Character.isDigit(previousChar))
+ // Make sure to insert spaces in the middle of acronyms or multi-digit
numbers.
+ if ((i != 0) &&
+ ((Character.isDigit(currentChar) &&
!Character.isDigit(previousChar))
|| (Character.isUpperCase(currentChar) &&
(!Character.isUpperCase(previousChar)
- || ((i < (target.length() - 1)) &&
Character.isLowerCase(target.charAt(i + 1)))))) {
+ || ((i < (target.length() - 1)) &&
Character.isLowerCase(target.charAt(i + 1))))))) {
// We're at the start of a new word.
appendWord(result, currentWord);
currentWord = new StringBuilder();
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
index b82482c..c90ca57 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
@@ -25,7 +25,6 @@ import com.smartgwt.client.widgets.HTMLPane;
* @author Greg Hinkle
*/
public class FullHTMLPane extends HTMLPane {
-
public FullHTMLPane() {
setWidth100();
setHeight100();
@@ -34,8 +33,7 @@ public class FullHTMLPane extends HTMLPane {
public FullHTMLPane(String url) {
this();
- System.out.println("Creating IFrame pane with URL [" + url +
"]...");
+ //System.out.println("Creating IFrame pane with URL [" + url +
"]...");
setContentsURL(url);
}
-
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
index 1de6dd2..432cd2b 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
@@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -64,8 +65,10 @@ import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+import com.smartgwt.client.widgets.form.validator.FloatRangeValidator;
import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
import com.smartgwt.client.widgets.form.validator.RegExpValidator;
+import com.smartgwt.client.widgets.form.validator.Validator;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
@@ -107,6 +110,7 @@ import
org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.core.domain.configuration.definition.constraint.Constraint;
+import org.rhq.core.domain.configuration.definition.constraint.FloatRangeConstraint;
import org.rhq.core.domain.configuration.definition.constraint.IntegerRangeConstraint;
import org.rhq.core.domain.configuration.definition.constraint.RegexConstraint;
import org.rhq.core.domain.resource.ResourceType;
@@ -129,6 +133,7 @@ import
org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* @author Greg Hinkle
+ * @author Ian Springer
*/
public class ConfigurationEditor extends LocatableVLayout {
@@ -153,6 +158,9 @@ public class ConfigurationEditor extends LocatableVLayout {
private IButton saveButton;
private boolean readOnly = false;
+ private Set<String> invalidPropertyNames = new HashSet<String>();
+ private Set<ValidationStateChangeListener> validationStateChangeListeners =
+ new HashSet<ValidationStateChangeListener>();
public static enum ConfigType {
plugin, resource
@@ -206,6 +214,14 @@ public class ConfigurationEditor extends LocatableVLayout {
return this.valuesManager.validate();
}
+ public boolean isValid() {
+ return this.valuesManager.hasErrors();
+ }
+
+ public void addValidationStateChangeListener(ValidationStateChangeListener
validationStateChangeListener) {
+ this.validationStateChangeListeners.add(validationStateChangeListener);
+ }
+
@Override
protected void onDraw() {
super.onDraw();
@@ -286,7 +302,7 @@ public class ConfigurationEditor extends LocatableVLayout {
if (definition.getConfigurationFormat() == ConfigurationFormat.RAW
|| definition.getConfigurationFormat() ==
ConfigurationFormat.STRUCTURED_AND_RAW) {
- System.out.println("Loading files view");
+ System.out.println("Loading files view...");
Tab tab = new LocatableTab("Files", "Files");
tab.setPane(buildRawPane());
tabSet.addTab(tab);
@@ -294,7 +310,7 @@ public class ConfigurationEditor extends LocatableVLayout {
if (definition.getConfigurationFormat() == ConfigurationFormat.STRUCTURED
|| definition.getConfigurationFormat() ==
ConfigurationFormat.STRUCTURED_AND_RAW) {
- System.out.println("loading properties view");
+ System.out.println("Loading properties view...");
Tab tab = new LocatableTab("Properties", "Properties");
tab.setPane(buildStructuredPane());
tabSet.addTab(tab);
@@ -462,7 +478,7 @@ public class ConfigurationEditor extends LocatableVLayout {
return section;
}
- private DynamicForm buildPropertiesForm(String locatorId,
ArrayList<PropertyDefinition> definitions,
+ private DynamicForm buildPropertiesForm(String locatorId,
List<PropertyDefinition> definitions,
AbstractPropertyMap propertyMap) {
LocatableDynamicForm form = new LocatableDynamicForm(locatorId);
form.setValuesManager(valuesManager);
@@ -499,6 +515,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
form.setFields(fields.toArray(new FormItem[fields.size()]));
+
return form;
}
@@ -516,7 +533,7 @@ public class ConfigurationEditor extends LocatableVLayout {
fields.add(nameItem);
- FormItem valueItem = null;
+ FormItem valueItem;
if (propertyDefinition instanceof PropertyDefinitionSimple) {
valueItem = buildSimpleField(fields, (PropertyDefinitionSimple)
propertyDefinition, oddRow, property);
fields.add(valueItem);
@@ -714,7 +731,7 @@ public class ConfigurationEditor extends LocatableVLayout {
return rows;
}
- private ListGridRecord buildSummaryRecord(ArrayList<PropertyDefinition>
definitions, PropertyMap rowMap) {
+ private ListGridRecord buildSummaryRecord(List<PropertyDefinition> definitions,
PropertyMap rowMap) {
ListGridRecord record = new ListGridRecord();
for (PropertyDefinition subDef : definitions) {
PropertyDefinitionSimple subDefSimple = (PropertyDefinitionSimple) subDef;
@@ -778,7 +795,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
List<PropertyDefinitionEnumeration> enumeratedValues =
propertyDefinition.getEnumeratedValues();
- if (enumeratedValues != null && enumeratedValues.size() > 0) {
+ if (enumeratedValues != null && !enumeratedValues.isEmpty()) {
LinkedHashMap<String, String> valueOptions = new
LinkedHashMap<String, String>();
for (PropertyDefinitionEnumeration option :
propertyDefinition.getEnumeratedValues()) {
@@ -837,24 +854,8 @@ public class ConfigurationEditor extends LocatableVLayout {
valueItem.setRequired(propertyDefinition.isRequired());
- if (propertyDefinition.getConstraints() != null) {
- Set<Constraint> constraints = propertyDefinition.getConstraints();
- for (Constraint c : constraints) {
- if (c instanceof IntegerRangeConstraint) {
- IntegerRangeConstraint integerConstraint = ((IntegerRangeConstraint)
c);
- IntegerRangeValidator validator = new IntegerRangeValidator();
-
- if (integerConstraint.getMinimum() != null)
- validator.setMin(integerConstraint.getMinimum().intValue());
- if (integerConstraint.getMaximum() != null)
- validator.setMax(integerConstraint.getMaximum().intValue());
- valueItem.setValidators(validator);
- } else if (c instanceof RegexConstraint) {
-
- valueItem.setValidators(new RegExpValidator("^" +
((RegexConstraint) c).getDetails() + "$"));
- }
- }
- }
+ List<Validator> validators = buildValidators(propertyDefinition,
valueItem);
+ valueItem.setValidators(validators.toArray(new Validator[validators.size()]));
/*
Click handlers seem to be turned off for disabled fields... need an
alternative
@@ -877,7 +878,19 @@ public class ConfigurationEditor extends LocatableVLayout {
finalValueItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent changedEvent) {
- propertySimple.setValue(changedEvent.getValue());
+ boolean wasValidBefore =
ConfigurationEditor.this.invalidPropertyNames.isEmpty();
+ if (changedEvent.getItem().validate()) {
+
ConfigurationEditor.this.invalidPropertyNames.remove(propertySimple.getName());
+ propertySimple.setValue(changedEvent.getValue());
+ } else {
+
ConfigurationEditor.this.invalidPropertyNames.add(propertySimple.getName());
+ }
+ boolean isValidNow =
ConfigurationEditor.this.invalidPropertyNames.isEmpty();
+ if (isValidNow != wasValidBefore) {
+ for (ValidationStateChangeListener validationStateChangeListener :
ConfigurationEditor.this.validationStateChangeListeners) {
+ validationStateChangeListener.validateStateChanged(isValidNow);
+ }
+ }
}
});
@@ -900,10 +913,46 @@ public class ConfigurationEditor extends LocatableVLayout {
return valueItem;
}
+ private List<Validator> buildValidators(PropertyDefinitionSimple
propertyDefinition, FormItem valueItem) {
+ List<Validator> validators = new ArrayList<Validator>();
+ if (propertyDefinition.getConstraints() != null) {
+ Set<Constraint> constraints = propertyDefinition.getConstraints();
+
+ for (Constraint constraint : constraints) {
+ if (constraint instanceof IntegerRangeConstraint) {
+ IntegerRangeConstraint integerConstraint = ((IntegerRangeConstraint)
constraint);
+ IntegerRangeValidator validator = new IntegerRangeValidator();
+ if (integerConstraint.getMinimum() != null) {
+ validator.setMin(integerConstraint.getMinimum().intValue());
+ }
+ if (integerConstraint.getMaximum() != null) {
+ validator.setMax(integerConstraint.getMaximum().intValue());
+ }
+ validators.add(validator);
+ } else if (constraint instanceof FloatRangeConstraint) {
+ FloatRangeConstraint floatConstraint = ((FloatRangeConstraint)
constraint);
+ FloatRangeValidator validator = new FloatRangeValidator();
+ if (floatConstraint.getMinimum() != null) {
+ validator.setMin(floatConstraint.getMinimum().floatValue());
+ }
+ if (floatConstraint.getMaximum() != null) {
+ validator.setMax(floatConstraint.getMaximum().floatValue());
+ }
+ validators.add(validator);
+ } else if (constraint instanceof RegexConstraint) {
+ RegExpValidator validator =
+ new RegExpValidator("^" + ((RegexConstraint)
constraint).getDetails() + "$");
+ validators.add(validator);
+ }
+ }
+ }
+ return validators;
+ }
+
private void displayMapEditor(String locatorId, final ListGrid summaryTable, final
Record existingRecord,
PropertyDefinitionMap definition, final PropertyList list, PropertyMap map) {
- final ArrayList<PropertyDefinition> definitions = new
ArrayList<PropertyDefinition>(definition
+ final List<PropertyDefinition> definitions = new
ArrayList<PropertyDefinition>(definition
.getPropertyDefinitions().values());
Collections.sort(definitions, new PropertyDefinitionComparator());
@@ -994,5 +1043,4 @@ public class ConfigurationEditor extends LocatableVLayout {
return new Integer(o1.getOrder()).compareTo(o2.getOrder());
}
}
-
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ValidationStateChangeListener.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ValidationStateChangeListener.java
new file mode 100644
index 0000000..d8f7a85
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ValidationStateChangeListener.java
@@ -0,0 +1,27 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.configuration;
+
+/**
+ * @author Ian Springer
+ */
+public interface ValidationStateChangeListener {
+ void validateStateChanged(boolean isValid);
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tree/EnhancedTreeNode.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tree/EnhancedTreeNode.java
index bbbcc1b..41e70c6 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tree/EnhancedTreeNode.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tree/EnhancedTreeNode.java
@@ -36,7 +36,17 @@ public class EnhancedTreeNode extends TreeNode {
public EnhancedTreeNode(String name, TreeNode... children) {
super(name, children);
- setTitle(StringUtils.deCamelCase(name));
+ if (name != null) {
+ setTitle(StringUtils.deCamelCase(name));
+ }
+ }
+
+ @Override
+ public void setName(String name) {
+ super.setName(name);
+ if (name != null && getTitle() == null) {
+ setTitle(StringUtils.deCamelCase(name));
+ }
}
public String getID() {
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 b2cadc1..b2c532d 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
@@ -277,7 +277,7 @@ public class ResourceDetailView extends
AbstractTwoLevelTabSetView<ResourceCompo
updateSubTab(this.configurationTab, this.configCurrent, new
ResourceConfigurationEditView(this
.extendLocatorId("ResourceConfigView"), resource), true,
true);
updateSubTab(this.configurationTab, this.configHistory,
ConfigurationHistoryView.getHistoryOf(
- configurationTab.extendLocatorId("HistoryView"),
resource.getId()), true, true);
+ resource.getId()), true, true);
}
if (updateTab(this.eventsTab, facets.contains(ResourceTypeFacet.EVENT), true)) {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
index 32e676a..f8387c9 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
@@ -43,7 +43,6 @@ public class ConfigurationHistoryDataSource extends
RPCDataSource<ResourceConfig
private ConfigurationGWTServiceAsync configurationService =
GWTServiceLookup.getConfigurationService();
-
public ConfigurationHistoryDataSource() {
super();
@@ -76,8 +75,9 @@ public class ConfigurationHistoryDataSource extends
RPCDataSource<ResourceConfig
criteria.setPageControl(getPageControl(request));
- if (request.getCriteria().getValues().get("resourceId") != null) {
-
criteria.addFilterResourceIds((Integer)request.getCriteria().getValues().get("resourceId"));
+ Integer resourceId =
(Integer)request.getCriteria().getValues().get("resourceId");
+ if (resourceId != null) {
+ criteria.addFilterResourceIds(resourceId);
}
configurationService.findResourceConfigurationUpdatesByCriteria(criteria,
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
index 0e51bae..aa11b05 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
@@ -40,22 +40,36 @@ import
org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
*/
public class ConfigurationHistoryView extends TableSection {
public static final String VIEW_ID = "RecentConfigurationChanges";
+ private static final String LOCATOR_ID = "ConfigurationHistory";
+ private static final String TITLE = "Configuration History";
private Integer resourceId;
- public ConfigurationHistoryView(String locatorId) {
- super("ConfigurationHistory", "Configuration History");
+ /**
+ * Use this constructor to view config histories for all viewable Resources.
+ */
+ public ConfigurationHistoryView() {
+ super(LOCATOR_ID, TITLE);
final ConfigurationHistoryDataSource datasource = new
ConfigurationHistoryDataSource();
setDataSource(datasource);
}
- public ConfigurationHistoryView(String locatorId, final int resourceId) {
- super("ConfigurationHistory", "Configuration History", new
Criteria("resourceId", String.valueOf(resourceId)));
+ /**
+ * Use this constructor to view the config history for the Resource with the
specified ID.
+ *
+ * @param resourceId a Resource ID
+ */
+ public ConfigurationHistoryView(int resourceId) {
+ super(LOCATOR_ID, TITLE, createCriteria(resourceId));
this.resourceId = resourceId;
-
- final ConfigurationHistoryDataSource datasource = new
ConfigurationHistoryDataSource();
+ ConfigurationHistoryDataSource datasource = new
ConfigurationHistoryDataSource();
setDataSource(datasource);
+ }
+ private static Criteria createCriteria(int resourceId) {
+ Criteria criteria = new Criteria();
+ criteria.addCriteria("resourceId", Integer.valueOf(resourceId));
+ return criteria;
}
@Override
@@ -143,11 +157,11 @@ public class ConfigurationHistoryView extends TableSection {
}
+
// -------- Static Utility loaders ------------
- public static ConfigurationHistoryView getHistoryOf(String locatorId, int resourceId)
{
-
- return new ConfigurationHistoryView(locatorId, resourceId);
+ public static ConfigurationHistoryView getHistoryOf(int resourceId) {
+ return new ConfigurationHistoryView(resourceId);
}
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ResourceConfigurationEditView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ResourceConfigurationEditView.java
index a0df3e9..7964a74 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ResourceConfigurationEditView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ResourceConfigurationEditView.java
@@ -31,18 +31,21 @@ import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import
org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.ValidationStateChangeListener;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageBar;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* @author Greg Hinkle
*/
-public class ResourceConfigurationEditView extends LocatableVLayout {
-
- Resource resource;
- ConfigurationEditor editor;
+public class ResourceConfigurationEditView extends LocatableVLayout implements
ValidationStateChangeListener {
+ private Resource resource;
+ private ConfigurationEditor editor;
+ private IButton saveButton;
+ private MessageBar messageBar;
public ResourceConfigurationEditView(String locatorId, Resource resource) {
super(locatorId);
@@ -57,26 +60,28 @@ public class ResourceConfigurationEditView extends LocatableVLayout {
}
public void build() {
-
ToolStrip toolStrip = new ToolStrip();
toolStrip.setWidth100();
toolStrip.addMember(new LayoutSpacer());
- IButton saveButton = new LocatableIButton(this.extendLocatorId("Save"),
"Save");
- saveButton.addClickHandler(new ClickHandler() {
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"),
"Save");
+ this.saveButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
save();
}
});
- // saveButton.disable();
+ this.saveButton.disable();
toolStrip.addMember(saveButton);
+ this.messageBar = new MessageBar();
+
editor = new ConfigurationEditor(this.getLocatorId(), resource.getId(),
resource.getResourceType().getId());
editor.setOverflow(Overflow.AUTO);
+ editor.addValidationStateChangeListener(this);
addMember(toolStrip);
-
+ addMember(this.messageBar);
addMember(editor);
}
@@ -96,6 +101,17 @@ public class ResourceConfigurationEditView extends LocatableVLayout {
}
});
+ }
+ @Override
+ public void validateStateChanged(boolean isValid) {
+ if (isValid) {
+ this.saveButton.enable();
+ this.messageBar.hide();
+ } else {
+ this.saveButton.disable();
+ Message message = new Message("One or more properties have invalid
values. The values must be fixed before the configuration can be saved.",
Message.Severity.Error);
+ this.messageBar.setMessage(message);
+ }
}
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationEditView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationEditView.java
index c11cca2..357255a 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationEditView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationEditView.java
@@ -20,7 +20,6 @@ package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventor
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
@@ -31,18 +30,22 @@ import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import
org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.ValidationStateChangeListener;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageBar;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* @author Greg Hinkle
*/
-public class PluginConfigurationEditView extends LocatableVLayout {
+public class PluginConfigurationEditView extends LocatableVLayout implements
ValidationStateChangeListener {
private Resource resource;
private ConfigurationEditor editor;
+ private LocatableIButton saveButton;
+ private MessageBar messageBar;
public PluginConfigurationEditView(String locatorId, Resource resource) {
super(locatorId);
@@ -63,21 +66,24 @@ public class PluginConfigurationEditView extends LocatableVLayout {
toolStrip.addMember(new LayoutSpacer());
- IButton saveButton = new LocatableIButton(this.extendLocatorId("Save"),
"Save");
- saveButton.addClickHandler(new ClickHandler() {
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"),
"Save");
+ this.saveButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
save();
}
});
- // saveButton.disable();
+ this.saveButton.disable();
toolStrip.addMember(saveButton);
+ this.messageBar = new MessageBar();
+
editor = new ConfigurationEditor(this.getLocatorId(), resource.getId(),
resource.getResourceType().getId(),
ConfigurationEditor.ConfigType.plugin);
editor.setOverflow(Overflow.AUTO);
+ editor.addValidationStateChangeListener(this);
addMember(toolStrip);
-
+ addMember(this.messageBar);
addMember(editor);
}
@@ -87,16 +93,28 @@ public class PluginConfigurationEditView extends LocatableVLayout {
GWTServiceLookup.getConfigurationService().updatePluginConfiguration(resource.getId(),
updatedConfiguration,
new AsyncCallback<PluginConfigurationUpdate>() {
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to update
configuration", caught);
+ CoreGUI.getErrorHandler().handleError("Failed to update
connection settings.", caught);
}
public void onSuccess(PluginConfigurationUpdate result) {
CoreGUI.getMessageCenter().notify(
- new Message("Connection settings updated for resource
[" + resource.getName() + "]",
+ new Message("Connection settings updated for Resource
[" + resource.getName() + "].",
Message.Severity.Info));
}
});
}
+
+ @Override
+ public void validateStateChanged(boolean isValid) {
+ if (isValid) {
+ this.saveButton.enable();
+ this.messageBar.hide();
+ } else {
+ this.saveButton.disable();
+ Message message = new Message("One or more properties have invalid
values. The values must be fixed before the configuration can be saved.",
Message.Severity.Error);
+ this.messageBar.setMessage(message);
+ }
+ }
}
\ No newline at end of file
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
index 7627527..48a4455 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
@@ -214,7 +214,7 @@ public class ReportTopView extends LocatableHLayout implements
BookmarkableView
} else if (MeasurementOOBView.VIEW_ID.equals(pageName)) {
content = new
MeasurementOOBView(this.extendLocatorId("SuspectMetrics"));
} else if (ConfigurationHistoryView.VIEW_ID.equals(pageName)) {
- content = new
ConfigurationHistoryView(this.extendLocatorId("RecentConfigChanges"));
+ content = new ConfigurationHistoryView();
} else if (OperationHistoryView.VIEW_ID.equals(pageName)) {
content = new
OperationHistoryView(this.extendLocatorId("RecentOps"));
} else if (AlertsView.VIEW_ID.equals(pageName)) {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
index 7e2eef4..905b0c7 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
@@ -34,14 +34,38 @@ public class Message {
public enum Severity { Info, Warning, Error };
public Message(String title, Severity severity) {
- this.title = title;
- this.severity = severity;
+ this(title, null, severity);
}
public Message(String title, String detail, Severity severity) {
this.title = title;
this.detail = detail;
- this.severity = severity;
+ this.severity = (severity != null) ? severity : Severity.Info;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getDetail() {
+ return detail;
}
+ public Date getFired() {
+ return fired;
+ }
+
+ public Severity getSeverity() {
+ return severity;
+ }
+
+ @Override
+ public String toString() {
+ return "Message{" +
+ "title='" + title + '\'' +
+ ", detail='" + detail + '\'' +
+ ", fired=" + fired +
+ ", severity=" + severity +
+ '}';
+ }
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
new file mode 100644
index 0000000..e025ab1
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
@@ -0,0 +1,73 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.util.message;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.smartgwt.client.widgets.Label;
+
+/**
+ * A bar for displaying a message at the top of a page - the equivalent of the JSF
h:messages component.
+ *
+ * @author Ian Springer
+ */
+public class MessageBar extends Label {
+ public static final Map<Message.Severity, String> SEVERITY_TO_STYLE_NAME_MAP =
new HashMap();
+ static {
+ SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Info, "InfoBlock");
+ SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Warning, "WarnBlock");
+ SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Error, "ErrorBlock");
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ setWidth100();
+ setAutoHeight();
+
+ hide();
+ }
+
+ public void setMessage(Message message) {
+
+ String contents;
+ if (message != null) {
+ contents = message.getTitle();
+ if (message.getDetail() != null) {
+ contents += ": " + message.getDetail();
+ }
+ } else {
+ contents = null;
+ }
+ setContents(contents);
+ if (contents != null) {
+ String styleName = SEVERITY_TO_STYLE_NAME_MAP.get(message.getSeverity());
+ setStyleName(styleName);
+ }
+ markForRedraw();
+ if (contents != null) {
+ show();
+ } else {
+ hide();
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
index 305fcf8..c5d324e 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
+++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
@@ -359,3 +359,31 @@ a:hover {
.editableText {
color: #070;
}
+
+.InfoBlock,.ConfirmationBlock,.WarnBlock,.ErrorBlock,.FatalBlock {
+ padding: 4px;
+ border-width: 1px;
+ border-top-style: solid;
+ font-size: 10px;
+ color: #000000;
+}
+
+.InfoBlock,.ConfirmationBlock {
+ background-color: #BFF1B5; /* light green */
+ border-top-color: #00AC3D; /* medium green */
+}
+
+.WarnBlock {
+ background-color: #FFFD99; /* light yellow */
+ border-top-color: #FF9C15; /* medium orange */
+}
+
+.ErrorBlock {
+ background-color: #FF9999; /* light red */
+ border-top-color: #EE4444; /* medium red */
+}
+
+.FatalBlock {
+ background-color: #FF6666; /* slightly darker light red */
+ border-top-color: #EE1111; /* slightly darker medium red */
+}