/* * RHQ Management Platform * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.admin; import java.util.ArrayList; import java.util.EnumSet; import java.util.LinkedHashMap; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.widgets.Img; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.CanvasItem; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.FormItemIcon; import com.smartgwt.client.widgets.form.fields.SelectItem; import com.smartgwt.client.widgets.form.fields.StaticTextItem; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; import com.smartgwt.client.widgets.form.fields.events.ClickEvent; import com.smartgwt.client.widgets.form.fields.events.ClickHandler; import com.smartgwt.client.widgets.form.fields.events.FormItemClickHandler; import com.smartgwt.client.widgets.form.fields.events.FormItemIconClickEvent; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.plugin.PluginKey; import org.rhq.core.domain.plugin.ServerPlugin; import org.rhq.core.domain.plugin.ServerPluginControlDefinition; import org.rhq.core.domain.plugin.ServerPluginControlResults; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.ErrorMessageWindow; import org.rhq.coregui.client.ImageManager; import org.rhq.coregui.client.components.configuration.ConfigurationEditor; import org.rhq.coregui.client.components.form.SortedSelectItem; import org.rhq.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.gwt.PluginGWTServiceAsync; import org.rhq.coregui.client.util.enhanced.EnhancedVLayout; import org.rhq.coregui.client.util.enhanced.EnhancedVStack; import org.rhq.coregui.client.util.message.Message; import org.rhq.coregui.client.util.message.Message.Severity; /** * A component used to invoke controls on a server plugin. * * @author John Mazzitelli */ public class ServerPluginControlView extends EnhancedVStack { private final ServerPlugin plugin; private final ArrayList<ServerPluginControlDefinition> controlDefinitions; private EnhancedVLayout paramsLayout; private EnhancedVLayout resultsLayout; private String selectedControlName; private ConfigurationDefinition selectedParamsDef; private ConfigurationEditor selectedParamsEditor; private ConfigurationDefinition selectedResultsDef; public ServerPluginControlView(ServerPlugin plugin, ArrayList<ServerPluginControlDefinition> controlDefs) { super(); this.plugin = plugin; this.controlDefinitions = controlDefs; setAutoHeight(); setMargin(5); } @Override protected void onDraw() { super.onDraw(); DynamicForm form = new DynamicForm(); addMember(form); paramsLayout = new EnhancedVLayout(); paramsLayout.setVisible(false); addMember(paramsLayout); resultsLayout = new EnhancedVLayout(); resultsLayout.setVisible(false); addMember(resultsLayout); final FormItemIcon executeButton = new FormItemIcon(); executeButton.setName("execute"); executeButton.setSrc(ImageManager.getOperationIcon()); executeButton.setPrompt(MSG.common_button_execute()); final SelectItem controlNamesItem = new SortedSelectItem("controlMenu", MSG.view_admin_plugins_serverControls_name()); LinkedHashMap<String, String> controlNames = new LinkedHashMap<String, String>(); for (ServerPluginControlDefinition def : controlDefinitions) { controlNames.put(def.getName(), def.getDisplayName()); } controlNamesItem.setValueMap(controlNames); controlNamesItem.setWidth(300); controlNamesItem.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { // determine the control that was selected and remember information about it selectedControlName = (String) event.getValue(); ServerPluginControlDefinition def = getControlDefinition(selectedControlName); selectedParamsDef = def.getParameters(); selectedResultsDef = def.getResults(); // we changed the control selected, hide any previously shown results resultsLayout.destroyMembers(); resultsLayout.setVisible(false); // show the parameters, if there are any showParameters(); // make sure we show our execute button now that a control has been selected if (controlNamesItem.getIcon(executeButton.getName()) == null) { controlNamesItem.setIcons(executeButton); } } }); form.setItems(controlNamesItem); // when this is clicked, the user wants to invoke the control executeButton.addFormItemClickHandler(new FormItemClickHandler() { public void onFormItemClick(FormItemIconClickEvent event) { Configuration params; try { params = getParameters(); } catch (IllegalStateException paramsInvalid) { Message msg = new Message(MSG.view_admin_plugins_serverControls_badParams(), Severity.Warning, EnumSet.of(Message.Option.Transient)); CoreGUI.getMessageCenter().notify(msg); return; } PluginGWTServiceAsync pm = GWTServiceLookup.getPluginService(); PluginKey pluginKey = PluginKey.createServerPluginKey(plugin.getType(), plugin.getName()); pm.invokeServerPluginControl(pluginKey, selectedControlName, params, new AsyncCallback<ServerPluginControlResults>() { public void onSuccess(ServerPluginControlResults results) { showResults(results); } public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_admin_plugins_serverControls_invokeFailure(), caught); } }); } }); } private void showParameters() { paramsLayout.destroyMembers(); if (selectedParamsDef != null) { paramsLayout.setVisible(true); Configuration config = new Configuration(); selectedParamsEditor = new ConfigurationEditor(selectedParamsDef, config); selectedParamsEditor.setAutoHeight(); DynamicForm paramsForm = new DynamicForm(); paramsForm.setWidth100(); paramsForm.setIsGroup(true); paramsForm.setGroupTitle(MSG.view_admin_plugins_serverControls_parameters()); CanvasItem paramsCanvas = new CanvasItem("paramsCanvas"); paramsCanvas.setShowTitle(false); paramsCanvas.setColSpan(2); paramsCanvas.setCanvas(selectedParamsEditor); paramsForm.setItems(paramsCanvas); paramsLayout.addMember(paramsForm); } else { paramsLayout.setVisible(false); } return; } private Configuration getParameters() throws IllegalStateException { if (selectedParamsDef != null) { if (!selectedParamsEditor.validate()) { throw new IllegalStateException(); } return selectedParamsEditor.getConfiguration(); } return null; } private void showResults(final ServerPluginControlResults results) { resultsLayout.destroyMembers(); DynamicForm resultsForm = new DynamicForm(); resultsForm.setWidth100(); resultsForm.setIsGroup(true); resultsForm.setGroupTitle(MSG.view_admin_plugins_serverControls_results()); ArrayList<FormItem> formItems = new ArrayList<FormItem>(3); StaticTextItem statusItem = new StaticTextItem("status", MSG.common_title_status()); statusItem.setValue(Img.imgHTML(ImageManager.getAvailabilityIcon(results.isSuccess()))); formItems.add(statusItem); if (results.getError() != null) { statusItem.setPrompt(MSG.view_admin_plugins_serverControls_clickForError()); statusItem.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { ErrorMessageWindow win = new ErrorMessageWindow(MSG.common_label_error(), results.getError()); win.show(); } }); } if (selectedResultsDef != null && results.getComplexResults() != null) { ConfigurationEditor editor = new ConfigurationEditor(selectedResultsDef, results.getComplexResults()); editor.setReadOnly(true); editor.setAutoHeight(); CanvasItem paramsCanvas = new CanvasItem("resultsCanvas"); paramsCanvas.setShowTitle(false); paramsCanvas.setColSpan(2); paramsCanvas.setCanvas(editor); formItems.add(paramsCanvas); } resultsForm.setItems(formItems.toArray(new FormItem[0])); resultsLayout.addMember(resultsForm); resultsLayout.setVisible(true); return; } private ServerPluginControlDefinition getControlDefinition(String controlName) { for (ServerPluginControlDefinition def : controlDefinitions) { if (def.getName().equals(controlName)) { return def; } } return null; } }