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@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 */ +}