modules/core/util/src/main/java/org/rhq/core/util/preferences/FilePreferencesFactory.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/SingleResourceGroupSelectorItem.java | 85 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java | 213 +++- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SingleResourceGroupSelector.java | 2 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 2 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties | 2 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 4 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties | 5 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 2 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties | 4 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 2 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/group/definition/framework/test/ExpressionEvaluatorTest.java | 443 +++------- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java | 87 + 15 files changed, 467 insertions(+), 393 deletions(-)
New commits: commit 438c80560c8faeff638f2640cd8278aa4c214aaf Author: Jay Shaughnessy jshaughn@redhat.com Date: Thu Mar 21 16:12:26 2013 -0400
Bug 832398 RFE: Enable DynaGroups to be created based on the contents of another group
Introduce 'memberof = GroupName' expression into the group definition language. memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java index d370861..7e31550 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/selection/SingleCompatibleResourceGroupSelector.java @@ -31,6 +31,8 @@ import org.rhq.core.domain.criteria.ResourceGroupCriteria; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
+@Deprecated +// could use SingleResourceGroupSelectorItem seeded with addFilterBundleTargetableOnly(true); public class SingleCompatibleResourceGroupSelector extends ComboBoxItem {
public SingleCompatibleResourceGroupSelector(String name, String title) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/SingleResourceGroupSelectorItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/SingleResourceGroupSelectorItem.java new file mode 100644 index 0000000..027cafc --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/SingleResourceGroupSelectorItem.java @@ -0,0 +1,85 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation, and/or the GNU Lesser + * General Public License, version 2.1, also as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License and the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * and the GNU Lesser General Public License along with this program; + * if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.rhq.enterprise.gui.coregui.client.components.selector; + +import com.smartgwt.client.data.DSRequest; +import com.smartgwt.client.types.TextMatchStyle; +import com.smartgwt.client.widgets.form.fields.ComboBoxItem; +import com.smartgwt.client.widgets.grid.ListGridField; + +import org.rhq.core.domain.criteria.ResourceGroupCriteria; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource; + +public class SingleResourceGroupSelectorItem extends ComboBoxItem { + + private ResourceGroupCriteria criteria; + + /** + * @param name + * @param title + * @param criteria initial values for filterId and filterName may be edited in the drop down but will be applied to + * the initial fetch. + */ + public SingleResourceGroupSelectorItem(String name, String title, ResourceGroupCriteria criteria) { + super(name, title); + + ListGridField nameField = new ListGridField("name"); + ListGridField descriptionField = new ListGridField("description"); + + setOptionDataSource(new CompatibleResourceGroupsDataSource()); + + setWidth(240); + setTitle(CoreGUI.getMessages().common_title_resource_group()); + + setValueField("id"); + setDisplayField("name"); + setPickListWidth(450); + setPickListFields(nameField, descriptionField); + setTextMatchStyle(TextMatchStyle.SUBSTRING); + + this.criteria = (null == criteria) ? new ResourceGroupCriteria() : criteria; + } + + protected class CompatibleResourceGroupsDataSource extends ResourceGroupsDataSource { + + @Override + protected ResourceGroupCriteria getFetchCriteria(final DSRequest request) { + // We don't want to use the superclass's getFetchCriteria because our selected value + // is either a Integer (when a real group has been selected) or a String (when a partial search string is selected). + // So, here we create our own criteria. See BZ 802528. + ResourceGroupCriteria result = criteria; + String filterString = getFilter(request, "id", String.class); + if (filterString != null) { + try { + Integer id = new Integer(filterString); + result.addFilterId(id); + } catch (Exception e) { + result.addFilterName(filterString); + } + } + + return result; + } + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java index e7e6181..bb49a93 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java @@ -54,6 +54,7 @@ import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.Messages; import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem; +import org.rhq.enterprise.gui.coregui.client.components.selector.SingleResourceGroupSelectorItem; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.gwt.GroupDefinitionExpressionBuilderGWTServiceAsync; import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVLayout; @@ -78,6 +79,8 @@ public class GroupDefinitionExpressionBuilder extends Window { private SelectItem expressionTypeItem; private SelectItem resourceItem; private RadioGroupItem groupByItem; + private RadioGroupItem memberOfItem; + private SingleResourceGroupSelectorItem memberOfGroupItem; private TextAreaItem expressionItem;
private ArrayList<String> plugins = new ArrayList<String>(); @@ -276,6 +279,33 @@ public class GroupDefinitionExpressionBuilder extends Window { } });
+ this.memberOfItem = new RadioGroupItem("memberOf", MSG.view_dynagroup_exprBuilder_memberOf()); + this.memberOfItem.setTooltip(MSG.view_dynagroup_exprBuilder_memberOf_tooltip()); + this.memberOfItem.setHoverWidth(250); + this.memberOfItem.setDefaultValue(MSG.common_val_no()); + this.memberOfItem.setValueMap(MSG.common_val_yes(), MSG.common_val_no()); + this.memberOfItem.setVertical(false); + this.memberOfItem.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent event) { + enableDisableComponents(); + buildExpressionValue(); + } + }); + + this.memberOfGroupItem = new SingleResourceGroupSelectorItem("memberOfGroup", MSG.common_title_group(), null); + this.memberOfGroupItem.setTooltip(MSG.view_dynagroup_exprBuilder_groupBy_tooltip()); + this.memberOfGroupItem.setHoverWidth(250); + this.memberOfGroupItem.setRedrawOnChange(true); + this.memberOfGroupItem.setWidth("*"); + this.memberOfGroupItem.setDefaultToFirstOption(true); + this.memberOfGroupItem.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent event) { + buildExpressionValue(); + } + }); + this.groupByItem = new RadioGroupItem("groupBy", MSG.view_dynagroup_exprBuilder_groupBy()); this.groupByItem.setTooltip(MSG.view_dynagroup_exprBuilder_groupBy_tooltip()); this.groupByItem.setHoverWidth(250); @@ -332,9 +362,9 @@ public class GroupDefinitionExpressionBuilder extends Window { form.setAutoWidth(); form.setAutoHeight(); form.setCellPadding(5); - form.setFields(this.expressionItem, this.groupByItem, this.resourceItem, this.expressionTypeItem, - this.pluginItem, this.resourceTypeItem, this.propertyNameItem, this.unsetItem, this.compareTypeItem, - this.valueItem, addButton, closeButton); + form.setFields(this.expressionItem, this.memberOfItem, this.memberOfGroupItem, this.groupByItem, + this.resourceItem, this.expressionTypeItem, this.pluginItem, this.resourceTypeItem, this.propertyNameItem, + this.unsetItem, this.compareTypeItem, this.valueItem, addButton, closeButton);
EnhancedVLayout layout = new EnhancedVLayout(); layout.setLayoutMargin(5); @@ -369,56 +399,87 @@ public class GroupDefinitionExpressionBuilder extends Window { public void addExpression(String newExpression); }
+ private boolean shouldMemberOfGroupBeDisabled() { + String expressionType = this.expressionTypeItem.getValueAsString(); + + if (MSG.common_val_no().equals(this.memberOfItem.getValueAsString())) { + return true; + } + return false; // they are enabled otherwise + } + + private boolean shouldResourceAndExpressionTypeBeDisabled() { + String expressionType = this.expressionTypeItem.getValueAsString(); + + if (MSG.common_val_yes().equals(this.memberOfItem.getValueAsString())) { + return true; + } + return false; // they are enabled otherwise + } + private boolean shouldPluginAndResourceTypeBeDisabled() { String expressionType = this.expressionTypeItem.getValueAsString();
+ if (MSG.common_val_yes().equals(this.memberOfItem.getValueAsString())) { + return true; + } if (MSG.view_dynagroup_exprBuilder_expressionType_resource().equals(expressionType)) { return true; - } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(expressionType)) { + } + if (MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(expressionType)) { return true; - } else if ((MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(expressionType)) + } + if ((MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(expressionType)) && (MSG.common_val_yes().equals(groupByItem.getValueAsString()))) { return true; } + return false; // they are enabled otherwise }
private boolean shouldComparisonTypeAndValueBeDisabled() { + boolean memberOf = MSG.common_val_yes().equals(this.memberOfItem.getValueAsString()); boolean groupBy = MSG.common_val_yes().equals(this.groupByItem.getValueAsString()); boolean unset = MSG.common_val_yes().equals(this.unsetItem.getValueAsString()); String expressionType = this.expressionTypeItem.getValueAsString();
- if (groupBy) { + if (groupBy || memberOf || unset) { return true; - } else if (unset) { - return true; - } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(expressionType)) { + } + if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(expressionType)) { return true; } + return false; // they are enabled otherwise }
private boolean shouldGroupByBeDisabled() { + boolean memberOf = MSG.common_val_yes().equals(this.memberOfItem.getValueAsString()); boolean unset = MSG.common_val_yes().equals(this.unsetItem.getValueAsString());
- if (unset) { + if (memberOf || unset) { return true; } return false; // enabled otherwise }
private boolean shouldUnsetBeDisabled() { + boolean memberOf = MSG.common_val_yes().equals(this.memberOfItem.getValueAsString()); boolean groupBy = MSG.common_val_yes().equals(this.groupByItem.getValueAsString());
- if (groupBy) { + if (groupBy || memberOf) { return true; } return false; // enabled otherwise }
private boolean shouldPropertyNameBeDisabled() { + boolean memberOf = MSG.common_val_yes().equals(this.memberOfItem.getValueAsString()); String expressionType = this.expressionTypeItem.getValueAsString();
+ if (memberOf) { + return true; + } if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(expressionType)) { return true; } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(expressionType)) { @@ -546,12 +607,17 @@ public class GroupDefinitionExpressionBuilder extends Window { }
private void enableDisableComponents() { + boolean memberOfGroupDisabled = shouldMemberOfGroupBeDisabled(); + boolean resourceAndExpressionTypeDisabled = shouldResourceAndExpressionTypeBeDisabled(); boolean pluginAndResourceTypeDisabled = shouldPluginAndResourceTypeBeDisabled(); boolean comparisonTypeAndValueDisabled = shouldComparisonTypeAndValueBeDisabled(); boolean groupByDisabled = shouldGroupByBeDisabled(); boolean unsetDisabled = shouldUnsetBeDisabled(); boolean propertyNameDisabled = shouldPropertyNameBeDisabled();
+ this.memberOfGroupItem.setDisabled(memberOfGroupDisabled); + this.resourceItem.setDisabled(resourceAndExpressionTypeDisabled); + this.expressionTypeItem.setDisabled(resourceAndExpressionTypeDisabled); this.pluginItem.setDisabled(pluginAndResourceTypeDisabled); this.resourceTypeItem.setDisabled(pluginAndResourceTypeDisabled); this.compareTypeItem.setDisabled(comparisonTypeAndValueDisabled); @@ -565,83 +631,90 @@ public class GroupDefinitionExpressionBuilder extends Window {
private void buildExpressionValue() {
+ boolean memberOf = MSG.common_val_yes().equals(this.memberOfItem.getValueAsString()); boolean groupBy = MSG.common_val_yes().equals(groupByItem.getValueAsString()); boolean unset = MSG.common_val_yes().equals(unsetItem.getValueAsString());
StringBuilder buf = new StringBuilder();
- if (groupBy) { - buf.append("groupby "); - } - if (unset) { - buf.append("empty "); - } + if (memberOf) { + buf.append("memberof = " + memberOfGroupItem.getDisplayValue());
- buf.append("resource."); - - String resourceLevel = resourceItem.getValueAsString(); - if (MSG.view_dynagroup_exprBuilder_resource_resource().equals(resourceLevel)) { - // do nothing - } else if (MSG.view_dynagroup_exprBuilder_resource_child().equals(resourceLevel)) { - buf.append("child."); - } else if (MSG.view_dynagroup_exprBuilder_resource_parent().equals(resourceLevel)) { - buf.append("parent."); - } else if (MSG.view_dynagroup_exprBuilder_resource_grandparent().equals(resourceLevel)) { - buf.append("grandParent."); - } else if (MSG.view_dynagroup_exprBuilder_resource_greatGrandparent().equals(resourceLevel)) { - buf.append("greatGrandParent."); - } else if (MSG.view_dynagroup_exprBuilder_resource_greatGreatGrandparent().equals(resourceLevel)) { - buf.append("greatGreatGrandParent."); - } + } else {
- String eType = expressionTypeItem.getValueAsString(); - if (MSG.view_dynagroup_exprBuilder_expressionType_resource().equals(eType)) { - buf.append(propertyNameItem.getValueAsString()); - } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(eType)) { - buf.append("type.plugin"); - } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(eType)) { - buf.append("type.category"); - } else if (MSG.view_dynagroup_exprBuilder_expressionType_trait().equals(eType)) { - buf.append("trait[" + propertyNameItem.getValueAsString() + "]"); - } else if (MSG.view_dynagroup_exprBuilder_expressionType_pluginConfig().equals(eType)) { - buf.append("pluginConfiguration[" + propertyNameItem.getValueAsString() + "]"); - } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceConfig().equals(eType)) { - buf.append("resourceConfiguration[" + propertyNameItem.getValueAsString() + "]"); - } + if (groupBy) { + buf.append("groupby "); + } + if (unset) { + buf.append("empty "); + }
- if (!groupBy && !unset) { + buf.append("resource.");
- String selectedComparison = compareTypeItem.getValueAsString(); - if (MSG.view_dynagroup_exprBuilder_comparisonType_equals().equals(selectedComparison)) { + String resourceLevel = resourceItem.getValueAsString(); + if (MSG.view_dynagroup_exprBuilder_resource_resource().equals(resourceLevel)) { // do nothing - } else if (MSG.view_dynagroup_exprBuilder_comparisonType_contains().equals(selectedComparison)) { - buf.append(".contains"); - } else if (MSG.view_dynagroup_exprBuilder_comparisonType_startsWith().equals(selectedComparison)) { - buf.append(".startsWith"); - } else if (MSG.view_dynagroup_exprBuilder_comparisonType_endsWith().equals(selectedComparison)) { - buf.append(".endsWith"); + } else if (MSG.view_dynagroup_exprBuilder_resource_child().equals(resourceLevel)) { + buf.append("child."); + } else if (MSG.view_dynagroup_exprBuilder_resource_parent().equals(resourceLevel)) { + buf.append("parent."); + } else if (MSG.view_dynagroup_exprBuilder_resource_grandparent().equals(resourceLevel)) { + buf.append("grandParent."); + } else if (MSG.view_dynagroup_exprBuilder_resource_greatGrandparent().equals(resourceLevel)) { + buf.append("greatGrandParent."); + } else if (MSG.view_dynagroup_exprBuilder_resource_greatGreatGrandparent().equals(resourceLevel)) { + buf.append("greatGreatGrandParent."); + } + + String eType = expressionTypeItem.getValueAsString(); + if (MSG.view_dynagroup_exprBuilder_expressionType_resource().equals(eType)) { + buf.append(propertyNameItem.getValueAsString()); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(eType)) { + buf.append("type.plugin"); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(eType)) { + buf.append("type.category"); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_trait().equals(eType)) { + buf.append("trait[" + propertyNameItem.getValueAsString() + "]"); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_pluginConfig().equals(eType)) { + buf.append("pluginConfiguration[" + propertyNameItem.getValueAsString() + "]"); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceConfig().equals(eType)) { + buf.append("resourceConfiguration[" + propertyNameItem.getValueAsString() + "]"); }
- buf.append(" = "); + if (!groupBy && !unset) { + + String selectedComparison = compareTypeItem.getValueAsString(); + if (MSG.view_dynagroup_exprBuilder_comparisonType_equals().equals(selectedComparison)) { + // do nothing + } else if (MSG.view_dynagroup_exprBuilder_comparisonType_contains().equals(selectedComparison)) { + buf.append(".contains"); + } else if (MSG.view_dynagroup_exprBuilder_comparisonType_startsWith().equals(selectedComparison)) { + buf.append(".startsWith"); + } else if (MSG.view_dynagroup_exprBuilder_comparisonType_endsWith().equals(selectedComparison)) { + buf.append(".endsWith"); + }
- if (MSG.view_dynagroup_exprBuilder_expressionType_resource().equals(eType) - || MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(eType)) { - buf.append(valueItem.getValueAsString()); + buf.append(" = "); + + if (MSG.view_dynagroup_exprBuilder_expressionType_resource().equals(eType) + || MSG.view_dynagroup_exprBuilder_expressionType_resourceCategory().equals(eType)) { + buf.append(valueItem.getValueAsString()); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(eType)) { + String d = buf.toString(); + buf.append(pluginItem.getValueAsString()); + buf.append("\n"); + buf.append(d.replaceAll("plugin", "name")); + buf.append(resourceTypeItem.getValueAsString()); + } else if (MSG.view_dynagroup_exprBuilder_expressionType_trait().equals(eType) + || MSG.view_dynagroup_exprBuilder_expressionType_pluginConfig().equals(eType) + || MSG.view_dynagroup_exprBuilder_expressionType_resourceConfig().equals(eType)) { + buf.append(valueItem.getValueAsString()); + } } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(eType)) { String d = buf.toString(); - buf.append(pluginItem.getValueAsString()); buf.append("\n"); buf.append(d.replaceAll("plugin", "name")); - buf.append(resourceTypeItem.getValueAsString()); - } else if (MSG.view_dynagroup_exprBuilder_expressionType_trait().equals(eType) - || MSG.view_dynagroup_exprBuilder_expressionType_pluginConfig().equals(eType) - || MSG.view_dynagroup_exprBuilder_expressionType_resourceConfig().equals(eType)) { - buf.append(valueItem.getValueAsString()); } - } else if (MSG.view_dynagroup_exprBuilder_expressionType_resourceType().equals(eType)) { - String d = buf.toString(); - buf.append("\n"); - buf.append(d.replaceAll("plugin", "name")); }
String expressionValueString = buf.toString(); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SingleResourceGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SingleResourceGroupSelector.java index 8928066..fc9bda9 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SingleResourceGroupSelector.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SingleResourceGroupSelector.java @@ -24,7 +24,7 @@ import com.smartgwt.client.types.SelectionStyle; import org.rhq.core.domain.resource.group.GroupCategory;
/** - * This forces the user to only be able to select a single resource. + * This forces the user to only be able to select a single resource group. * * @author Jay Shaughnessy */ diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties index 1f2e209..0d731ab 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties @@ -1472,6 +1472,8 @@ view_dynagroup_exprBuilder_expressionType_trait = Trait view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button. view_dynagroup_exprBuilder_groupBy = Group by view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it. +view_dynagroup_exprBuilder_memberOf = Member of +view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --No plugins-- view_dynagroup_exprBuilder_noProperties = --No properties-- view_dynagroup_exprBuilder_noResourceTypes = --No resource types-- diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties index 255391f..b4ba1e4 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties @@ -1486,6 +1486,8 @@ view_dynagroup_exprBuilder_expressionType_trait = Vlastnost (trait) ##view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button. view_dynagroup_exprBuilder_groupBy = Seskupit podle ##view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it. +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --Žádné zásuvné moduly-- view_dynagroup_exprBuilder_noProperties = --Žádné vlastnosti-- view_dynagroup_exprBuilder_noResourceTypes = --Žádné typy zdrojů-- diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties index 6f6743c..016b160 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties @@ -1330,6 +1330,9 @@ view_dynagroup_exprBuilder_expressionType_resourceConfig = Ressourcen-Konfigurat view_dynagroup_exprBuilder_expressionType_resourceType = Ressourcen-Typ view_dynagroup_exprBuilder_expressionType_trait = Trait view_dynagroup_exprBuilder_groupBy = Gruppieren nach +##view_dynagroup_exprBuilder_groupBy_tooltip = groupby will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, groupby on the cluster name to create a group for each cluster with all cluster members in it. +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --Keine Plugins-- view_dynagroup_exprBuilder_noProperties = --Keine Eigenschaften-- view_dynagroup_exprBuilder_noResourceTypes = --Keine Ressourcen-Typen-- diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties index 09579ae..1f24034 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties @@ -1457,8 +1457,10 @@ view_dynagroup_exprBuilder_expressionType_resourceType = リソースタイプ view_dynagroup_exprBuilder_expressionType_tooltip = この式のプロパティは以下のものに切り替わります。<br/> <b>リソース</b>: 名前やバージョンといったリソースプロパティ<br/> <b>リソースタイプ</b>: 特定タイプのリソースの検索<br/> <b>リソースカテゴリ</b>: プラットフォーム、サーバー、サービスといったカテゴリによるリソース検索<br/> <b>トレイト</b>: モニタされたトレイトのために選択された値を持つリソース<br/> <b>プラグイン構成</b>: コンポーネントのプラグインコンポーネント構成設定による検索<br/> <b>リソース構成</b>: 管理リソースの構成設定による検索 view_dynagroup_exprBuilder_expressionType_trait = トレイト view_dynagroup_exprBuilder_expression_tooltip = これは以下のフォーム内の選択によって表現される完全な式です。このテキストは、"式の追加"ボタンをクリックすると、グループ定義式のテキストに追加されます。 -view_dynagroup_exprBuilder_groupBy = Group by +##view_dynagroup_exprBuilder_groupBy = Group by view_dynagroup_exprBuilder_groupBy_tooltip = GroupByはシステムが入力式からの値についてピボット解析ができるようにします。例えば、クラスター名によるGroupByによって、すべてのクラスターメンバーをその中に含むようなクラスタのグループを作成します。 +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --プラグインなし-- view_dynagroup_exprBuilder_noProperties = --プラグインなし-- view_dynagroup_exprBuilder_noResourceTypes = --リソースタイプなし-- diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties index 84e024a..f832c7d 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties @@ -1218,7 +1218,10 @@ view_dynagroup_exprBuilder_expressionType_pluginConfig = 플러그인 설정 view_dynagroup_exprBuilder_expressionType_resource = 리소스 view_dynagroup_exprBuilder_expressionType_resourceConfig = 리소스 설정 view_dynagroup_exprBuilder_expressionType_trait = 특성 -view_dynagroup_exprBuilder_groupBy = Group by +##view_dynagroup_exprBuilder_groupBy = Group by +##view_dynagroup_exprBuilder_groupBy_tooltip = groupby will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, groupby on the cluster name to create a group for each cluster with all cluster members in it. +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --플러그인 없이-- view_dynagroup_exprBuilder_noProperties = --속성 없이-- view_dynagroup_exprBuilder_pluginLoadFailure = 플러그인 목록을 가져올 수 없습니다 diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties index 262c3c4..bb7d48b 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties @@ -1481,6 +1481,8 @@ view_dynagroup_exprBuilder_expressionType_trait = Caracter�stica view_dynagroup_exprBuilder_expression_tooltip = Esta � a express�o completa com base nas defini��es do formul�rio abaixo. Este texto ser� adicionado ao campo de express�o da defini��o do grupo quando voc� clicar o bot�o "Adicionar Express�o" view_dynagroup_exprBuilder_groupBy = Agrupado por view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy far� com que o resultado da busca seja agrupado de acordo com os valores informados na express�o. Por exemplo, usando GroupBy para o nome de um cluster JBossAS, o resultado criar� um grupo para cada cluster e seus membros. +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --Sem plugins-- view_dynagroup_exprBuilder_noProperties = --Sem propriedades-- view_dynagroup_exprBuilder_noResourceTypes = --Nehum tipo de recurso-- diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index d96d127..f354bd8 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -2654,6 +2654,10 @@ view_admin_systemSettings_LDAPBindPW_name = Пароль ##view_configEdit_unset = Unset? ##view_configEdit_value = Value ##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> +##view_dynagroup_exprBuilder_groupBy = Group by +##view_dynagroup_exprBuilder_groupBy_tooltip = groupby will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, groupby on the cluster name to create a group for each cluster with all cluster members in it. +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. ##view_group_common_emptyGroup = An empty group is always considered as mixed. ##view_group_detail_explicitAvail = Group availability for explicit members (does not include recursive members). ##view_group_detail_failLoad = Failed to load group for group with ID [{0}] diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties index 9159a53..e19f5f2 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties @@ -1459,6 +1459,8 @@ view_dynagroup_exprBuilder_expressionType_trait = \u7279\u5f81 view_dynagroup_exprBuilder_expression_tooltip = This is the full expression that is represented by the selections in the form below. This text will be added to your group definition expression text when you click the "Add Expression" button. view_dynagroup_exprBuilder_groupBy = \u5206\u7ec4 view_dynagroup_exprBuilder_groupBy_tooltip = GroupBy will cause the system to pivot on the values from the entered expressions creating a separate group for each value. For example, GroupBy on the cluster name to create a group for each cluster with all cluster members in it. +##view_dynagroup_exprBuilder_memberOf = Member of +##view_dynagroup_exprBuilder_memberOf_tooltip = memberof will restrict the dynagroup members to be a subset of the specified resource group. Specifying multiple memberof conditions will restrict the dynagroup members to be a subset of the union of members of the specified groups. view_dynagroup_exprBuilder_noPlugins = --\u65e0\u63d2\u4ef6-- view_dynagroup_exprBuilder_noProperties = -\u65e0\u5c5e\u6027-- view_dynagroup_exprBuilder_noResourceTypes = --\u65e0\u8d44\u6e90\u7c7b\u578b-- diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/group/definition/framework/test/ExpressionEvaluatorTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/group/definition/framework/test/ExpressionEvaluatorTest.java index a1c8a65..92919c5 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/group/definition/framework/test/ExpressionEvaluatorTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/group/definition/framework/test/ExpressionEvaluatorTest.java @@ -25,8 +25,8 @@ import java.util.List; import org.testng.annotations.Test;
import org.rhq.core.domain.resource.group.DuplicateExpressionTypeException; -import org.rhq.enterprise.server.resource.group.definition.framework.ExpressionEvaluator; import org.rhq.core.domain.resource.group.InvalidExpressionException; +import org.rhq.enterprise.server.resource.group.definition.framework.ExpressionEvaluator; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.util.QueryUtility;
@@ -154,7 +154,15 @@ public class ExpressionEvaluatorTest extends AbstractEJB3Test { " AND simple.stringValue IS NULL " + // " AND simple.configuration = pluginConf " + // " AND simpleDef.configurationDefinition = pluginConfDef " + // - " AND simple.name = simpleDef.name AND simpleDef.type != 'PASSWORD' " }, }; + " AND simple.name = simpleDef.name AND simpleDef.type != 'PASSWORD' " }, + + { "resource.name = joseph; " + // + "memberof = Group Name", + + "SELECT res.id FROM Resource res " + // + "JOIN res.implicitGroups implicitGroup " + // + "WHERE res.name = :arg1 " + // + " AND implicitGroup.name IN ('Group Name') " }, }; }
@Test(groups = "integration.session") @@ -220,12 +228,14 @@ public class ExpressionEvaluatorTest extends AbstractEJB3Test { String[] input = { "resource.child.name", // "resource.pluginConfiguration[partition]", // "resource.pluginConfiguration[partition].contains", // - "resource.pluginConfiguration[partition.name].contains" }; + "resource.pluginConfiguration[partition.name].contains", // + "memberof = GroupName" };
String[][] expectedOutput = { { "resource", "child", "name" }, // { "resource", "pluginConfiguration[partition]" }, // { "resource", "pluginConfiguration[partition]", "contains" }, // - { "resource", "pluginConfiguration[partition.name]", "contains" } }; + { "resource", "pluginConfiguration[partition.name]", "contains" }, // + { "memberof" } };
ExpressionEvaluator evaluator = new ExpressionEvaluator(); evaluator.setTestMode(true); // to prevent actual query from happening @@ -274,686 +284,519 @@ public class ExpressionEvaluatorTest extends AbstractEJB3Test { } }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceTraitExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.trait[agentHomeDirectory] = /var/rhq-agent", - "resource.trait[reasonForLastRestart] = OOMError" - }; + return new String[] { "resource.trait[agentHomeDirectory] = /var/rhq-agent", + "resource.trait[reasonForLastRestart] = OOMError" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceTraitExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.child.trait[agentHomeDirectory] = /var/rhq-agent", - "resource.child.trait[reasonForLastRestart] = OOMError" - }; + return new String[] { "resource.child.trait[agentHomeDirectory] = /var/rhq-agent", + "resource.child.trait[reasonForLastRestart] = OOMError" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceTraitExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.parent.trait[agentHomeDirectory] = /var/rhq-agent", - "resource.parent.trait[reasonForLastRestart] = OOMError" - }; + return new String[] { "resource.parent.trait[agentHomeDirectory] = /var/rhq-agent", + "resource.parent.trait[reasonForLastRestart] = OOMError" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceTraitExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.grandParent.trait[agentHomeDirectory] = /var/rhq-agent", - "resource.grandParent.trait[reasonForLastRestart] = OOMError" - }; + return new String[] { "resource.grandParent.trait[agentHomeDirectory] = /var/rhq-agent", + "resource.grandParent.trait[reasonForLastRestart] = OOMError" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceTraitExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGrandParent.trait[agentHomeDirectory] = /var/rhq-agent", - "resource.greatGrandParent.trait[reasonForLastRestart] = OOMError" - }; + return new String[] { "resource.greatGrandParent.trait[agentHomeDirectory] = /var/rhq-agent", + "resource.greatGrandParent.trait[reasonForLastRestart] = OOMError" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceTraitExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGreatGrandParent.trait[agentHomeDirectory] = /var/rhq-agent", - "resource.greatGreatGrandParent.trait[reasonForLastRestart] = OOMError" - }; + return new String[] { "resource.greatGreatGrandParent.trait[agentHomeDirectory] = /var/rhq-agent", + "resource.greatGreatGrandParent.trait[reasonForLastRestart] = OOMError" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceIdExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.id = 5", - "resource.id = 6" - }; + return new String[] { "resource.id = 5", "resource.id = 6" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceIdExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.child.id = 5", - "resource.child.id = 6" - }; + return new String[] { "resource.child.id = 5", "resource.child.id = 6" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceIdExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.parent.id = 5", - "resource.parent.id = 6" - }; + return new String[] { "resource.parent.id = 5", "resource.parent.id = 6" }; } }); }
- @Test(expectedExceptions = InvalidExpressionException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = InvalidExpressionException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceIdExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.grandParent.id = 5", - "resource.grandParent.id = 6" - }; + return new String[] { "resource.grandParent.id = 5", "resource.grandParent.id = 6" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceIdExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGrandParent.id = 5", - "resource.greatGrandParent.id = 6" - }; + return new String[] { "resource.greatGrandParent.id = 5", "resource.greatGrandParent.id = 6" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceIdExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGreatGrandParent.id = 5", - "resource.greatGreatGrandParent.id = 6" - }; + return new String[] { "resource.greatGreatGrandParent.id = 5", "resource.greatGreatGrandParent.id = 6" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceNameExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.name = foo", - "resource.name = bar" - }; + return new String[] { "resource.name = foo", "resource.name = bar" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceNameExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.child.name = foo", - "resource.child.name = bar" - }; + return new String[] { "resource.child.name = foo", "resource.child.name = bar" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceNameExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.parent.name = foo", - "resource.parent.name = bar" - }; + return new String[] { "resource.parent.name = foo", "resource.parent.name = bar" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceNameExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.grandParent.name = foo", - "resource.grandParent.name = bar" - }; + return new String[] { "resource.grandParent.name = foo", "resource.grandParent.name = bar" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceNameExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGrandParent.name = foo", - "resource.greatGrandParent.name = bar" - }; + return new String[] { "resource.greatGrandParent.name = foo", "resource.greatGrandParent.name = bar" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceNameExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGreatGrandParent.name = foo", - "resource.greatGreatGrandParent.name = bar" - }; + return new String[] { "resource.greatGreatGrandParent.name = foo", + "resource.greatGreatGrandParent.name = bar" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceTypeExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.type.plugin = rhq-agent", - "resource.type.name = RHQ Agent", - "resource.type.plugin = rhq-server", - "resource.type.name = RHQ Server" - }; + return new String[] { "resource.type.plugin = rhq-agent", "resource.type.name = RHQ Agent", + "resource.type.plugin = rhq-server", "resource.type.name = RHQ Server" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceTypeExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.child.type.plugin = rhq-agent", - "resource.child.type.name = RHQ Agent", - "resource.child.type.plugin = rhq-server", - "resource.child.type.name = RHQ Server" - }; + return new String[] { "resource.child.type.plugin = rhq-agent", "resource.child.type.name = RHQ Agent", + "resource.child.type.plugin = rhq-server", "resource.child.type.name = RHQ Server" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceTypeExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.parent.type.plugin = rhq-agent", - "resource.parent.type.name = RHQ Agent", - "resource.parent.type.plugin = rhq-server", - "resource.parent.type.name = RHQ Server" - }; + return new String[] { "resource.parent.type.plugin = rhq-agent", + "resource.parent.type.name = RHQ Agent", "resource.parent.type.plugin = rhq-server", + "resource.parent.type.name = RHQ Server" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceTypeExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.grandParent.type.plugin = rhq-agent", - "resource.grandParent.type.name = RHQ Agent", - "resource.grandParent.type.plugin = rhq-server", - "resource.grandParent.type.name = RHQ Server" - }; + return new String[] { "resource.grandParent.type.plugin = rhq-agent", + "resource.grandParent.type.name = RHQ Agent", "resource.grandParent.type.plugin = rhq-server", + "resource.grandParent.type.name = RHQ Server" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceTypeExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGrandParent.type.plugin = rhq-agent", + return new String[] { "resource.greatGrandParent.type.plugin = rhq-agent", "resource.greatGrandParent.type.name = RHQ Agent", "resource.greatGrandParent.type.plugin = rhq-server", - "resource.greatGrandParent.type.name = RHQ Server" - }; + "resource.greatGrandParent.type.name = RHQ Server" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceTypeExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGreatGrandParent.type.plugin = rhq-agent", + return new String[] { "resource.greatGreatGrandParent.type.plugin = rhq-agent", "resource.greatGreatGrandParent.type.name = RHQ Agent", "resource.greatGreatGrandParent.type.plugin = rhq-server", - "resource.greatGreatGrandParent.type.name = RHQ Server" - }; + "resource.greatGreatGrandParent.type.name = RHQ Server" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceCategoryExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.type.category = PLATFORM", - "resource.type.category = SERVER" - }; + return new String[] { "resource.type.category = PLATFORM", "resource.type.category = SERVER" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceCategoryExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.child.type.category = PLATFORM", - "resource.child.type.category = SERVER" - }; + return new String[] { "resource.child.type.category = PLATFORM", + "resource.child.type.category = SERVER" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceCategoryExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.parent.type.category = PLATFORM", - "resource.parent.type.category = SERVER" - }; + return new String[] { "resource.parent.type.category = PLATFORM", + "resource.parent.type.category = SERVER" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceCategoryExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.grandParent.type.category = PLATFORM", - "resource.grandParent.type.category = SERVER" - }; + return new String[] { "resource.grandParent.type.category = PLATFORM", + "resource.grandParent.type.category = SERVER" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceCategoryExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGrandParent.type.category = PLATFORM", - "resource.greatGrandParent.type.category = SERVER" - }; + return new String[] { "resource.greatGrandParent.type.category = PLATFORM", + "resource.greatGrandParent.type.category = SERVER" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceCategoryExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGreatGrandParent.type.category = PLATFORM", - "resource.greatGreatGrandParent.type.category = SERVER" - }; + return new String[] { "resource.greatGreatGrandParent.type.category = PLATFORM", + "resource.greatGreatGrandParent.type.category = SERVER" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceAvailabilityExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.availability = UP", - "resource.availability = UNKNOWN" - }; + return new String[] { "resource.availability = UP", "resource.availability = UNKNOWN" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceAvailabilityExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.child.availability = UP", - "resource.child.availability = UNKNOWN" - }; + return new String[] { "resource.child.availability = UP", "resource.child.availability = UNKNOWN" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceAvailabilityExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.parent.availability = UP", - "resource.parent.availability = UNKNOWN" - }; + return new String[] { "resource.parent.availability = UP", "resource.parent.availability = UNKNOWN" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceAvailabilityExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.grandParent.availability = UP", - "resource.grandParent.availability = UNKNOWN" - }; + return new String[] { "resource.grandParent.availability = UP", + "resource.grandParent.availability = UNKNOWN" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceAvailabilityExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGrandParent.availability = UP", - "resource.greatGrandParent.availability = UNKNOWN" - }; + return new String[] { "resource.greatGrandParent.availability = UP", + "resource.greatGrandParent.availability = UNKNOWN" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceAvailabilityExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[] { - "resource.greatGreatGrandParent.availability = UP", - "resource.greatGreatGrandParent.availability = UNKNOWN" - }; + return new String[] { "resource.greatGreatGrandParent.availability = UP", + "resource.greatGreatGrandParent.availability = UNKNOWN" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourcePluginConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.pluginConfiguration[x] = 1", - "resource.pluginConfiguration[y] = 2" - }; + return new String[] { "resource.pluginConfiguration[x] = 1", "resource.pluginConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourcePluginConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.child.pluginConfiguration[x] = 1", - "resource.child.pluginConfiguration[y] = 2" - }; + return new String[] { "resource.child.pluginConfiguration[x] = 1", + "resource.child.pluginConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourcePluginConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.parent.pluginConfiguration[x] = 1", - "resource.parent.pluginConfiguration[y] = 2" - }; + return new String[] { "resource.parent.pluginConfiguration[x] = 1", + "resource.parent.pluginConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourcePluginConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.grandParent.pluginConfiguration[x] = 1", - "resource.grandParent.pluginConfiguration[y] = 2" - }; + return new String[] { "resource.grandParent.pluginConfiguration[x] = 1", + "resource.grandParent.pluginConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourcePluginConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGrandParent.pluginConfiguration[x] = 1", - "resource.greatGrandParent.pluginConfiguration[y] = 2" - }; + return new String[] { "resource.greatGrandParent.pluginConfiguration[x] = 1", + "resource.greatGrandParent.pluginConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourcePluginConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGreatGrandParent.pluginConfiguration[x] = 1", - "resource.greatGreatGrandParent.pluginConfiguration[y] = 2" - }; + return new String[] { "resource.greatGreatGrandParent.pluginConfiguration[x] = 1", + "resource.greatGreatGrandParent.pluginConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleResourceConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.resourceConfiguration[x] = 1", - "resource.resourceConfiguration[y] = 2" - }; + return new String[] { "resource.resourceConfiguration[x] = 1", "resource.resourceConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleChildResourceConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.child.resourceConfiguration[x] = 1", - "resource.child.resourceConfiguration[y] = 2" - }; + return new String[] { "resource.child.resourceConfiguration[x] = 1", + "resource.child.resourceConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleParentResourceConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.parent.resourceConfiguration[x] = 1", - "resource.parent.resourceConfiguration[y] = 2" - }; + return new String[] { "resource.parent.resourceConfiguration[x] = 1", + "resource.parent.resourceConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGrandParentResourceConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.grandParent.resourceConfiguration[x] = 1", - "resource.grandParent.resourceConfiguration[y] = 2" - }; + return new String[] { "resource.grandParent.resourceConfiguration[x] = 1", + "resource.grandParent.resourceConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGrandParentResourceConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGrandParent.resourceConfiguration[x] = 1", - "resource.greatGrandParent.resourceConfiguration[y] = 2" - }; + return new String[] { "resource.greatGrandParent.resourceConfiguration[x] = 1", + "resource.greatGrandParent.resourceConfiguration[y] = 2" }; } }); }
- @Test(expectedExceptions = DuplicateExpressionTypeException.class, - expectedExceptionsMessageRegExp = "You cannot specify multiple.*") + @Test(expectedExceptions = DuplicateExpressionTypeException.class, expectedExceptionsMessageRegExp = "You cannot specify multiple.*") public void doNotAllowMultipleGreatGreatGrandParentResourceConfigExpressions() throws Exception { evaluateExpressions(new ExpressionGenerator() { @Override public String[] getExpressions() { - return new String[]{ - "resource.greatGreatGrandParent.resourceConfiguration[x] = 1", - "resource.greatGreatGrandParent.resourceConfiguration[y] = 2" - }; + return new String[] { "resource.greatGreatGrandParent.resourceConfiguration[x] = 1", + "resource.greatGreatGrandParent.resourceConfiguration[y] = 2" }; } }); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java index 7f42f55..363a663 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java @@ -50,7 +50,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> private final Log log = LogFactory.getLog(ExpressionEvaluator.class);
private static final String INVALID_EXPRESSION_FORM_MSG = "Expression must be in one of the follow forms: " + // - "'groupBy condition', 'condition = value', 'empty condition', 'not empty condition"; + "'groupby condition', 'memberof = groupname', 'condition = value', 'empty condition', 'not empty condition";
private static final String PROP_SIMPLE_ALIAS = "simple"; private static final String PROP_SIMPLE_DEF_ALIAS = "simpleDef"; @@ -81,9 +81,11 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> private Map<String, Class<?>> whereReplacementTypes; private Set<String> whereStatics; private List<String> groupByElements; + private List<String> memberOfElements;
private List<String> simpleSubExpressions; private List<String> groupedSubExpressions; + private List<String> memberSubExpressions;
private int expressionCount; private boolean isInvalid; @@ -112,9 +114,11 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> whereReplacementTypes = new HashMap<String, Class<?>>(); whereStatics = new LinkedHashSet<String>(); groupByElements = new ArrayList<String>(); + memberOfElements = new ArrayList<String>();
simpleSubExpressions = new ArrayList<String>(); groupedSubExpressions = new ArrayList<String>(); + memberSubExpressions = new ArrayList<String>();
expressionCount = 0; isInvalid = false; @@ -143,8 +147,8 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> resourceExpressions.put("res.parentResource.name", "resource name"); resourceExpressions.put("res.parentResource.parentResource.name", "resource name"); resourceExpressions.put("res.parentResource.parentResource.parentResource.name", "resource name"); - resourceExpressions.put("res.parentResource.parentResource.parentResource.parentResource.name", - "resource name"); + resourceExpressions + .put("res.parentResource.parentResource.parentResource.parentResource.name", "resource name");
resourceExpressions.put("res.version", "resource version"); resourceExpressions.put("child.version", "resource version"); @@ -162,8 +166,8 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> resourceExpressions.put("res.parentResource.resourceType.name", "resource type"); resourceExpressions.put("res.parentResource.parentResource.resourceType.plugin", "resource type"); resourceExpressions.put("res.parentResource.parentResource.resourceType.name", "resource type"); - resourceExpressions.put("res.parentResource.parentResource.parentResource.resourceType.plugin", - "resource type"); + resourceExpressions + .put("res.parentResource.parentResource.parentResource.resourceType.plugin", "resource type"); resourceExpressions.put("res.parentResource.parentResource.parentResource.resourceType.name", "resource type"); resourceExpressions.put("res.parentResource.parentResource.parentResource.parentResource.resourceType.plugin", "resource type"); @@ -176,7 +180,8 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> resourceExpressions.put("res.parentResource.parentResource.resourceType.category", "resource category"); resourceExpressions.put("res.parentResource.parentResource.parentResource.resourceType.category", "resource category"); - resourceExpressions.put("res.parentResource.parentResource.parentResource.parentResource.resourceType.category", + resourceExpressions.put( + "res.parentResource.parentResource.parentResource.parentResource.resourceType.category", "resource category");
resourceExpressions.put("avail.availabilityType", "availability"); @@ -185,8 +190,8 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> resourceExpressions.put("res.parentResource.parentResource.avail.availabilityType", "availability"); resourceExpressions.put("res.parentResource.parentResource.parentResource.avail.availabilityType", "availability"); - resourceExpressions.put("res.parentResource.parentResource.parentResource.parentResource.avail.availabilityType", - "availability"); + resourceExpressions.put( + "res.parentResource.parentResource.parentResource.parentResource.avail.availabilityType", "availability");
resourceExpressions.put("trait.value", "trait"); resourceExpressions.put("child.trait.value", "trait"); @@ -299,8 +304,9 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> Availability(true), // Trait(true), // Configuration(true), // includes 'pluginConfiguration' and 'resourceConfiguration' - StringMatch(true), // - END(true); + StringMatch(true), // + END(true), // + Membership(true);
private boolean canTerminateExpression;
@@ -337,6 +343,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> private ParseSubContext subcontext = null; private int parseIndex = 0; private boolean isGroupBy = false; + private boolean isMemberOf = false; private ComparisonType comparisonType = null; private Class<?> expressionType;
@@ -418,6 +425,8 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> // do not add modifiers to the normalized expression if (subExpressionToken.equals("groupby")) { continue; + } else if (subExpressionToken.equals("memberof")) { + continue; } else if (subExpressionToken.equals("not")) { continue; } else if (subExpressionToken.equals("empty")) { @@ -440,6 +449,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> subcontext = null; parseIndex = 0; isGroupBy = false; // this needs to be reset each time a new expression is added + isMemberOf = false; // this needs to be reset each time a new expression is added comparisonType = ComparisonType.EQUALS; // assume equals, unless "(not) empty" found during the parse
deepestResourceContext = null; @@ -452,17 +462,34 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> if (nextToken.equals("resource")) { context = ParseContext.Resource; deepestResourceContext = context; + + } else if (nextToken.equals("memberof")) { + context = ParseContext.Membership; // ensure proper expression termination + String groupName = value; + + if (null == groupName || groupName.isEmpty() || "=".equals(groupName)) { + throw new InvalidExpressionException(INVALID_EXPRESSION_FORM_MSG); + } + + validateSubExpressionAgainstPreviouslySeen(groupName, false, true); + isMemberOf = true; + populatePredicateCollections(null, groupName); + } else if (nextToken.equals("groupby")) { context = ParseContext.Modifier; subcontext = ParseSubContext.Pivot; + } else if (nextToken.equals("not")) { + context = ParseContext.Modifier; subcontext = ParseSubContext.Negated; // 'not' must be followed by 'empty' today, but we won't know until next parse iteration // furthermore, we may support other forms of negated expressions in the future + } else if (nextToken.equals("empty")) { context = ParseContext.Modifier; subcontext = ParseSubContext.Empty; + } else { throw new InvalidExpressionException( "Expression must either start with 'resource', 'groupby', 'empty', or 'not empty' tokens"); @@ -488,7 +515,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> // then perform individual processing based on current subcontext if (subcontext == ParseSubContext.Pivot) { // validates the uniqueness of the subexpression after checking for INVALID_EXPRESSION_FORM_MSG - validateSubExpressionAgainstPreviouslySeen(normalizedSubExpression, true); + validateSubExpressionAgainstPreviouslySeen(normalizedSubExpression, true, false); isGroupBy = true; comparisonType = ComparisonType.NONE; } else if (subcontext == ParseSubContext.NotEmpty) { @@ -514,7 +541,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> // EQUALS filter expressions must HAVE "= <value>" part throw new InvalidExpressionException(INVALID_EXPRESSION_FORM_MSG); } - validateSubExpressionAgainstPreviouslySeen(normalizedSubExpression, false); + validateSubExpressionAgainstPreviouslySeen(normalizedSubExpression, false, false); }
if (nextToken.equals("parent")) { @@ -578,7 +605,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> // (SELECT max(mdt.id.timestamp) FROM MeasurementDataTrait mdt WHERE sched.id = mdt.schedule.id) String traitName = parseTraitName(originalTokens); addJoinCondition(JoinCondition.SCHEDULES); - populatePredicateCollections(METRIC_DEF_ALIAS + ".name", "%" + traitName + "%", false); + populatePredicateCollections(METRIC_DEF_ALIAS + ".name", "%" + traitName + "%", false, false); populatePredicateCollections(TRAIT_ALIAS + ".value", value); whereStatics.add(TRAIT_ALIAS + ".schedule = " + JoinCondition.SCHEDULES.alias); whereStatics.add(TRAIT_ALIAS @@ -616,7 +643,7 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> addJoinCondition(joinCondition); addJoinCondition(definitionJoinCondition);
- populatePredicateCollections(PROP_SIMPLE_ALIAS + ".name", "%" + propertyName + "%", false); + populatePredicateCollections(PROP_SIMPLE_ALIAS + ".name", "%" + propertyName + "%", false, false); populatePredicateCollections(PROP_SIMPLE_ALIAS + ".stringValue", value);
whereStatics.add(PROP_SIMPLE_ALIAS + ".configuration = " + joinCondition.alias); @@ -757,13 +784,15 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> * isGroupBy field or the explicitly overriding groupBy 3rd argument */ private void populatePredicateCollections(String predicateName, Object value) throws InvalidExpressionException { - populatePredicateCollections(predicateName, value, isGroupBy); + populatePredicateCollections(predicateName, value, isGroupBy, isMemberOf); }
- private void populatePredicateCollections(String predicateName, Object value, boolean groupBy) + private void populatePredicateCollections(String predicateName, Object value, boolean groupBy, boolean memberOf) throws InvalidExpressionException { if (groupBy) { groupByElements.add(predicateName); + } else if (memberOf) { + memberOfElements.add((String) value); // this is the group name in this situation } else { String argumentName = getNextArgumentName();
@@ -1089,6 +1118,11 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> } }
+ // finally, if we are narrowing by group membership, add the join on implicit groups + if (!memberOfElements.isEmpty()) { + result += " JOIN res.implicitGroups implicitGroup"; + } + return result; }
@@ -1152,6 +1186,17 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> } }
+ // finally, if we are narrowing by group membership, add the implicit groups condition + if (!memberOfElements.isEmpty()) { + result += " AND implicitGroup.name IN ("; + String separator = ""; + for (String groupName : memberOfElements) { + result += (separator + "'" + groupName + "'"); + separator = ", "; + } + result += ")"; + } + return result; }
@@ -1206,8 +1251,8 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> return suffix.substring(1, suffix.length() - 1); }
- private void validateSubExpressionAgainstPreviouslySeen(String normalizedSubExpression, boolean grouped) - throws InvalidExpressionException { + private void validateSubExpressionAgainstPreviouslySeen(String normalizedSubExpression, boolean grouped, + boolean membership) throws InvalidExpressionException { normalizedSubExpression = stripFunctionSuffix(normalizedSubExpression); if (grouped) { if (groupedSubExpressions.contains(normalizedSubExpression)) { @@ -1220,6 +1265,12 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> + "]"); } groupedSubExpressions.add(normalizedSubExpression); + + } else if (membership) { + if (memberSubExpressions.contains(normalizedSubExpression)) { + throw new InvalidExpressionException("Redundant 'memberof' expression[" + normalizedSubExpression + + "] - these expressions must be unique"); + } } else { if (groupedSubExpressions.contains(normalizedSubExpression)) { throw new InvalidExpressionException(
commit 9b525e0d1655d0e28ba086604391e5ac07bfc7b7 Author: Jay Shaughnessy jshaughn@redhat.com Date: Thu Mar 21 15:40:29 2013 -0400
Bug 824010 Have agent store configuration on filesystem instead of Java preferences
Rename the file name property to be more succinct:
Was: org.rhq.core.util.preferences.FilePreferencesFactory.file Now: rhq.preferences.file
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/preferences/FilePreferencesFactory.java b/modules/core/util/src/main/java/org/rhq/core/util/preferences/FilePreferencesFactory.java index 69f36da..f28aa46 100644 --- a/modules/core/util/src/main/java/org/rhq/core/util/preferences/FilePreferencesFactory.java +++ b/modules/core/util/src/main/java/org/rhq/core/util/preferences/FilePreferencesFactory.java @@ -17,7 +17,7 @@ import org.apache.commons.logging.LogFactory; * property <tt>-Djava.util.prefs.PreferencesFactory=org.rhq.core.util.preferences.FilePreferencesFactory</tt>. * <p/> * The file defaults to ${user.home}/.fileprefs, but may be overridden with the system property - * <tt>org.rhq.core.util.preferences.FilePreferencesFactory.file</tt> + * <tt>rhq.preferences.file</tt> * <p/> * Both the system root and user root default to the user.home system property by default. * <p/> @@ -30,7 +30,7 @@ import org.apache.commons.logging.LogFactory; public class FilePreferencesFactory implements PreferencesFactory { private static final Log log = LogFactory.getLog(FilePreferencesFactory.class);
- public static final String SYSTEM_PROPERTY_FILE = "org.rhq.core.util.preferences.FilePreferencesFactory.file"; + public static final String SYSTEM_PROPERTY_FILE = "rhq.preferences.file";
private static File preferencesFile;