modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java | 34 ++-------- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 9 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java | 26 +++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java | 11 ++- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java | 15 ++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 5 + 7 files changed, 69 insertions(+), 33 deletions(-)
New commits: commit be699782d80642062a34b850c9431c53fc2a5634 Author: Ian Springer ian.springer@redhat.com Date: Fri Jan 28 13:16:38 2011 -0500
various improvements to operation scheduling GUI
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java index efcf37e..b5182e9 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java @@ -48,6 +48,7 @@ import com.smartgwt.client.widgets.tab.Tab; import com.smartgwt.client.widgets.tab.TabSet; import org.rhq.core.domain.common.JobTrigger; import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.util.FormUtility; import org.rhq.enterprise.gui.coregui.client.util.message.Message; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; @@ -544,15 +545,8 @@ public class JobTriggerEditor extends LocatableVLayout { TextItem repeatIntervalItem = new TextItem(FIELD_REPEAT_INTERVAL, "Run now and every"); repeatIntervalItem.setRequired(true);
- // Configure context-sensitive help. - FormItemIcon helpIcon = new FormItemIcon(); - helpIcon.setSrc("[SKIN]/actions/help.png"); - repeatIntervalItem.setIcons(helpIcon); - repeatIntervalItem.addIconClickHandler(new IconClickHandler() { - public void onIconClick(IconClickEvent event) { - SC.say("N UNITS (where N is a positive integer and UNITS is "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", or "years", e.g. "30 seconds" or "6 weeks")"); - } - }); + FormUtility.addContextualHelp(repeatIntervalItem, + "N UNITS (where N is a positive integer and UNITS is "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", or "years", e.g. "30 seconds" or "6 weeks")");
// Configure validation. RegExpValidator repeatIntervalValidator = new RegExpValidator("[1-9][0-9]*[ ]*(seconds|s|minutes|m|hours|h|days|d|weeks|w|months|M|quarters|q|years|y)"); @@ -572,15 +566,8 @@ public class JobTriggerEditor extends LocatableVLayout { repeatDurationItem.setShowTitle(false); repeatDurationItem.setVisible(false);
- // Configure context-sensitive help. - helpIcon = new FormItemIcon(); - helpIcon.setSrc("[SKIN]/actions/help.png"); - repeatDurationItem.setIcons(helpIcon); - repeatDurationItem.addIconClickHandler(new IconClickHandler() { - public void onIconClick(IconClickEvent event) { - SC.say("N UNITS (where N is a positive integer and UNITS is "times", "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", or "years", e.g. "30 seconds" or "5 repetitions")"); - } - }); + FormUtility.addContextualHelp(repeatDurationItem, + "N UNITS (where N is a positive integer and UNITS is "times", "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", or "years", e.g. "30 seconds" or "5 repetitions")");
// Configure validation. RegExpValidator repeatDurationValidator = new RegExpValidator("[1-9][0-9]*[ ]*(times|repetitions|seconds|s|minutes|m|hours|h|days|d|weeks|w|months|M|quarters|q|years|y)"); @@ -646,15 +633,8 @@ public class JobTriggerEditor extends LocatableVLayout { startDelayItem.setShowTitle(false); startDelayItem.setVisible(false);
- // Configure context-sensitive help. - FormItemIcon icon = new FormItemIcon(); - icon.setSrc("[SKIN]/actions/help.png"); - startDelayItem.setIcons(icon); - startDelayItem.addIconClickHandler(new IconClickHandler() { - public void onIconClick(IconClickEvent event) { - SC.say("N UNITS (where N is a positive integer and UNITS is "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", or "years", e.g. "30 seconds" or "6 weeks")"); - } - }); + FormUtility.addContextualHelp(startDelayItem, + "N UNITS (where N is a positive integer and UNITS is "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", or "years", e.g. "30 seconds" or "6 weeks")");
// Configure validation. RegExpValidator startDelayValidator = new RegExpValidator("[1-9][0-9]*([ ]+(seconds|minutes|hours|days|weeks|months|quarters|years)|(s|m|h|d|w|M|q|y))"); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java index bc27926..2195d35 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java @@ -51,6 +51,7 @@ import org.rhq.enterprise.gui.coregui.client.components.form.AbstractRecordEdito import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm; import org.rhq.enterprise.gui.coregui.client.components.trigger.JobTriggerEditor; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource; +import org.rhq.enterprise.gui.coregui.client.util.FormUtility; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -145,11 +146,13 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor }
TextItem timeoutItem = new TextItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)"); + FormUtility.addContextualHelp(timeoutItem, "a time duration in seconds; if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was initiated"); notesFields.add(timeoutItem);
TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes"); notesItem.setWidth(450); - notesItem.setHeight(150); + notesItem.setHeight(120); + FormUtility.addContextualHelp(notesItem, "an optional description of this scheduled operation (e.g. "nightly maintenance app server restart")"); notesFields.add(notesItem);
this.notesForm.setFields(notesFields.toArray(new FormItem[notesFields.size()])); @@ -236,7 +239,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor String operationName = getSelectedOperationName(); String value; if (operationName == null) { - value = "<i>Select an operation.</i>"; + value = "<i>Select an operation to see its description.</i>"; } else { value = this.operationNameToDescriptionMap.get(operationName); } @@ -247,7 +250,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor String operationName = getSelectedOperationName(); String value; if (operationName == null) { - value = "<i>Select an operation.</i>"; + value = "<i>Select an operation to see its parameters.</i>"; } else { ConfigurationDefinition parametersDefinition = this.operationNameToParametersDefinitionMap.get(operationName); if (parametersDefinition == null || parametersDefinition.getPropertyDefinitions().isEmpty()) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java index cca83f5..3105aab 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java @@ -203,7 +203,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource .view_tabs_common_schedule()), null); this.operationsHistory = new SubTab(operationsTab.extendLocatorId("History"), new ViewName("History", MSG .view_tabs_common_history()), null); - operationsTab.registerSubTabs(this.operationsHistory, this.operationsSchedule); + operationsTab.registerSubTabs(this.operationsSchedule, this.operationsHistory); tabs.add(operationsTab);
configurationTab = new TwoLevelTab(getTabSet().extendLocatorId("Configuration"), new ViewName("Configuration", diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java index 7603a45..188a892 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java @@ -23,6 +23,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.Record; +import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; @@ -38,6 +39,11 @@ import java.util.List; */ public class GroupOperationScheduleDataSource extends AbstractOperationScheduleDataSource<GroupOperationSchedule> {
+ public static abstract class Field extends AbstractOperationScheduleDataSource.Field { + public static final String HALT_ON_FAILURE = "haltOnFailure"; + public static final String EXECUTION_ORDER = "executionOrder"; + } + private ResourceGroupComposite groupComposite;
public GroupOperationScheduleDataSource(ResourceGroupComposite groupComposite) { @@ -102,4 +108,24 @@ public class GroupOperationScheduleDataSource extends AbstractOperationScheduleD }); }
+ @Override + public ListGridRecord copyValues(GroupOperationSchedule from) { + ListGridRecord record = super.copyValues(from); + + record.setAttribute(Field.HALT_ON_FAILURE, from.getHaltOnFailure()); + // TODO: set executionOrder field + + return record; + } + + @Override + public GroupOperationSchedule copyValues(Record from) { + GroupOperationSchedule groupOperationSchedule = super.copyValues(from); + + groupOperationSchedule.setHaltOnFailure(from.getAttributeAsBoolean(Field.HALT_ON_FAILURE)); + // TODO: set executionOrder field + + return groupOperationSchedule; + } + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java index 59cb90c..8bb7f38 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java @@ -29,6 +29,7 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
private ResourceGroupComposite groupComposite; private ListGridRecord[] memberResourceRecords; + private DynamicForm executionModeForm;
public GroupOperationScheduleDetailsView(String locatorId, ResourceGroupComposite groupComposite, int scheduleId) { super(locatorId, new GroupOperationScheduleDataSource(groupComposite), @@ -67,7 +68,7 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule HTMLFlow hr = new HTMLFlow("<p/><hr/><p/>"); contentPane.addMember(hr);
- DynamicForm executionModeForm = new DynamicForm(); + this.executionModeForm = new DynamicForm(); executionModeForm.setColWidths("250", "*");
RadioGroupItem executionModeItem = new RadioGroupItem("executionMode", "Member Resource Execution Order"); @@ -104,4 +105,12 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
return contentPane; } + + @Override + protected void save(DSRequest requestProperties) { + Boolean haltOnFailure = (Boolean) this.executionModeForm.getValue(GroupOperationScheduleDataSource.Field.HALT_ON_FAILURE); + getForm().setValue(GroupOperationScheduleDataSource.Field.HALT_ON_FAILURE, haltOnFailure); + + super.save(requestProperties); + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java index 26e67a8..50455b4 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java @@ -18,8 +18,12 @@ */ package org.rhq.enterprise.gui.coregui.client.util;
+import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.FormItemIcon; +import com.smartgwt.client.widgets.form.fields.events.IconClickEvent; +import com.smartgwt.client.widgets.form.fields.events.IconClickHandler;
/** * A collection of utility methods for working with SmartGWT {@link DynamicForm}s. @@ -44,4 +48,15 @@ public class FormUtility { } }
+ public static void addContextualHelp(FormItem item, final String helpText) { + FormItemIcon helpIcon = new FormItemIcon(); + helpIcon.setSrc("[SKIN]/actions/help.png"); + item.setIcons(helpIcon); + item.addIconClickHandler(new IconClickHandler() { + public void onIconClick(IconClickEvent event) { + SC.say(helpText); + } + }); + } + } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java index efe8cc4..1623dd1 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java @@ -582,6 +582,8 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan } }
+ boolean haltOnFailure = jobDataMap.getBooleanValueFromString(GroupOperationJob.DATAMAP_BOOL_HALT_ON_FAILURE); + Integer entityId = getOperationScheduleEntityId(jobDetail);
GroupOperationSchedule sched = new GroupOperationSchedule(); @@ -595,10 +597,11 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan sched.setParameters(parameters); sched.setExecutionOrder(executionOrder); sched.setDescription(description); - sched.setHaltOnFailure(jobDataMap.getBooleanValueFromString(GroupOperationJob.DATAMAP_BOOL_HALT_ON_FAILURE)); + sched.setHaltOnFailure(haltOnFailure); Trigger trigger = getTriggerOfJob(jobDetail); JobTrigger jobTrigger = convertToJobTrigger(trigger); sched.setJobTrigger(jobTrigger); + sched.setNextFireTime(trigger.getNextFireTime());
return sched; }