/*
* RHQ Management Platform
* Copyright (C) 2005-2009 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.enterprise.gui.admin.plugin;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.plugin.AbstractPlugin;
import org.rhq.core.domain.plugin.PluginKey;
import org.rhq.core.domain.plugin.ServerPlugin;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.plugin.ServerPluginManagerLocal;
import org.rhq.enterprise.server.plugin.pc.ControlResults;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.enterprise.server.xmlschema.ControlDefinition;
//@Scope(ScopeType.CONVERSATION)
//@Name("ServerPluginControlUIBean")
public class ServerPluginControlUIBean implements Serializable {
private static final long serialVersionUID = 1L;
private final ServerPluginManagerLocal serverPluginsBean = LookupUtil.getServerPluginManager();
//@In("plugin")
private AbstractPlugin abstractPlugin;
//@RequestParameter
private String control;
private ServerPlugin serverPlugin;
private String serverPluginType;
private String serverPluginName;
private PluginKey serverPluginKey;
private List<ControlDefinition> serverPluginControlDefinitions;
private Configuration params;
private ControlResults results;
//@Create
public void init() throws Exception {
this.serverPlugin = (ServerPlugin) this.abstractPlugin;
this.serverPluginType = this.serverPlugin.getType();
this.serverPluginName = this.serverPlugin.getName();
this.serverPluginKey = PluginKey.createServerPluginKey(this.serverPluginType, this.serverPluginName);
ArrayList<ControlDefinition> defs = new ArrayList<ControlDefinition>();
if (getPermission()) {
defs.addAll(this.serverPluginsBean.getServerPluginControlDefinitions(this.serverPluginKey));
}
this.serverPluginControlDefinitions = defs;
setSelectedControl(this.control);
}
public PluginKey getServerPluginKey() {
return this.serverPluginKey;
}
public ServerPlugin getServerPlugin() {
return this.serverPlugin;
}
public void setSelectedControl(String controlName) {
if (controlName != null) {
this.control = controlName;
if (getParamsDefinition() != null) {
this.params = getParamsDefinition().getDefaultTemplate().createConfiguration();
} else {
this.params = null;
}
} else {
this.control = null;
this.params = null;
}
this.results = null;
}
public List<String[]> getControls() throws Exception {
if (this.serverPluginControlDefinitions == null) {
return null;
}
List<String[]> items = new ArrayList<String[]>();
for (ControlDefinition def : this.serverPluginControlDefinitions) {
items.add(new String[] { def.getName(), def.getDisplayName(), def.getDescription() });
}
return items;
}
public Configuration getParamsConfiguration() {
return this.params;
}
public ConfigurationDefinition getParamsDefinition() {
if (this.serverPluginControlDefinitions != null) {
for (ControlDefinition def : this.serverPluginControlDefinitions) {
if (def.getName().equals(this.control)) {
ConfigurationDefinition paramsDef = def.getParameters();
return paramsDef;
}
}
}
return null; // return null to indicate that there are no params defined
}
public boolean getResultsAvailable() {
return this.results != null;
}
public ConfigurationDefinition getResultsDefinition() {
if (this.serverPluginControlDefinitions != null) {
for (ControlDefinition def : this.serverPluginControlDefinitions) {
if (def.getName().equals(this.control)) {
ConfigurationDefinition resultsDef = def.getResults();
return resultsDef;
}
}
}
return null;
}
public Configuration getResultsConfiguration() {
return this.results != null ? this.results.getComplexResults() : null;
}
public String getResultsError() {
return this.results != null ? this.results.getError() : null;
}
public String invokeControl() {
try {
Subject subject = EnterpriseFacesContextUtility.getSubject();
this.results = this.serverPluginsBean.invokeServerPluginControl(subject, this.serverPluginKey,
this.control, getParamsConfiguration());
if (this.results.isSuccess()) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO,
"Plugin invoked the control operation successfully");
} else {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR,
"Plugin reported an error: " + this.results.getError());
}
} catch (Exception e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to invoke the plugin control", e);
}
return "success";
}
public boolean getPermission() throws Exception {
Subject subject = EnterpriseFacesContextUtility.getSubject();
if (!LookupUtil.getAuthorizationManager().hasGlobalPermission(subject, Permission.MANAGE_SETTINGS)) {
return false;
}
return true;
}
}