/*
* RHQ Management Platform
* Copyright (C) 2005-2014 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.enterprise.gui.inventory.resource;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.model.SelectItem;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.discovery.InvalidPluginConfigurationClientException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.resource.ImportResourceRequest;
import org.rhq.core.domain.resource.ImportResourceResponse;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.legacy.ParamConstants;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.discovery.DiscoveryBossLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Ian Springer
*/
public class ManuallyAddChildResourceUIBean {
public static final String MANAGED_BEAN_NAME = "ManuallyAddChildResourceUIBean";
private static final String OUTCOME_BAD_TYPE = "badType";
private static final String OUTCOME_SUCCESS = "success";
private static final String OUTCOME_FAILURE = "failure";
private static final String OUTCOME_MULTIPLE_TEMPLATES = "multipleTemplates";
private static final String OUTCOME_SINGLE_TEMPLATE = "singleTemplate";
private ResourceType type;
private String name;
private String description;
private ConfigurationDefinition configurationDefinition;
private Configuration configuration;
private String selectedTemplateName;
private ConfigurationManagerLocal configurationManager = LookupUtil.getConfigurationManager();
private ResourceTypeManagerLocal resourceTypeManager = LookupUtil.getResourceTypeManager();
private DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
public ManuallyAddChildResourceUIBean() {
this.type = lookupResourceType();
if (!this.type.isSupportsManualAdd()) {
throw new IllegalStateException(this.type.getName() + " resources cannot be manually added to inventory.");
}
lookupConfigurationAndDef();
}
private void lookupConfigurationAndDef() {
this.configurationDefinition = lookupConfigurationDefinition();
if (this.configurationDefinition != null) {
this.configuration = lookupConfiguration();
ConfigurationTemplate defaultTemplate = this.configurationDefinition.getDefaultTemplate();
this.selectedTemplateName = (defaultTemplate != null) ? defaultTemplate.getName() : null;
}
}
@Nullable
public ConfigurationDefinition getConfigurationDefinition() {
return this.configurationDefinition;
}
public void setConfigurationDefinition(@NotNull
ConfigurationDefinition configurationDefinition) {
this.configurationDefinition = configurationDefinition;
}
@Nullable
public Configuration getConfiguration() {
return this.configuration;
}
public void setConfiguration(@NotNull
Configuration configuration) {
this.configuration = configuration;
}
public List<SelectItem> getTemplateNames() {
List<SelectItem> selectItems = new ArrayList<SelectItem>();
for (ConfigurationTemplate template : this.configurationDefinition.getTemplates().values()) {
StringBuilder label = new StringBuilder(template.getName());
if ((template.getDescription() != null) && !template.getDescription().equals("")
&& !template.getDescription().equals(template.getName())) {
label.append(" - ").append(template.getDescription());
}
SelectItem selectItem = new SelectItem(template.getName(), label.toString());
selectItems.add(selectItem);
}
return selectItems;
}
public String startWorkflow() {
try {
this.type = lookupResourceType();
} catch (Exception e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Could not retrieve resource type.", e
.getLocalizedMessage());
return OUTCOME_BAD_TYPE;
}
if (this.configurationDefinition == null) {
lookupConfigurationAndDef();
}
if (this.configurationDefinition == null) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR,
"There are no connection properties defined for " + this.type);
return OUTCOME_BAD_TYPE;
}
return (this.configurationDefinition.getTemplates().size() > 1) ? OUTCOME_MULTIPLE_TEMPLATES
: OUTCOME_SINGLE_TEMPLATE;
}
public String selectTemplate() {
lookupConfiguration();
return OUTCOME_SUCCESS;
}
public String addResource() {
ImportResourceResponse response = null;
ImportResourceRequest request = new ImportResourceRequest(getType().getId(), EnterpriseFacesContextUtility
.getResource().getId(), getConfiguration());
try {
response = discoveryBoss.manuallyAddResource(EnterpriseFacesContextUtility.getSubject(), request);
} catch (InvalidPluginConfigurationClientException e) {
FacesContextUtility
.addMessage(
FacesMessage.SEVERITY_ERROR,
"The Agent was unable to connect to the "
+ getType()
+ " managed resource using the supplied connection properties. Please check that the connection properties are correct and that the managed resource on the agent machine is online. ",
e);
} catch (PluginContainerException e) {
FacesContextUtility
.addMessage(FacesMessage.SEVERITY_FATAL, "An unexpected error occurred in the Agent.", e);
} catch (RuntimeException e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_FATAL, "Unable to connect to the Agent.", e);
}
String outcome;
if (response == null) {
outcome = OUTCOME_FAILURE;
} else {
Resource resource = LookupUtil.getResourceManager().getResourceById(
EnterpriseFacesContextUtility.getSubject(), response.getResource().getId());
if (response.isResourceAlreadyExisted()) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN, "A " + getType().getName()
+ " with the specified connection properties was already in inventory.");
} else {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "A " + getType().getName()
+ " has been added to inventory with the name '" + resource.getName() + "'.");
}
// Change the ResourceUIBean in the request context to the added resource.
FacesContextUtility.setBean(new ResourceUIBean(resource));
outcome = OUTCOME_SUCCESS;
}
cleanup();
return outcome;
}
public String cancel() {
cleanup();
return OUTCOME_SUCCESS;
}
@Nullable
protected ConfigurationDefinition lookupConfigurationDefinition() {
Integer resourceTypeId = FacesContextUtility.getRequiredRequestParameter(ParamConstants.RESOURCE_TYPE_ID_PARAM,
Integer.class);
ConfigurationDefinition pluginConfigDefinition = this.configurationManager
.getPluginConfigurationDefinitionForResourceType(EnterpriseFacesContextUtility.getSubject(), resourceTypeId);
return pluginConfigDefinition;
}
@NotNull
protected Configuration lookupConfiguration() {
ConfigurationTemplate pluginConfigTemplate;
if (this.selectedTemplateName != null) {
pluginConfigTemplate = getConfigurationDefinition().getTemplate(this.selectedTemplateName);
if (pluginConfigTemplate == null) {
throw new IllegalStateException("A template named '" + this.selectedTemplateName
+ "' does not exist for " + getType() + " resource connection properties.");
}
} else {
pluginConfigTemplate = getConfigurationDefinition().getDefaultTemplate();
}
configuration = (pluginConfigTemplate != null) ? pluginConfigTemplate.createConfiguration()
: new Configuration();
return configuration;
}
public ResourceType getType() {
return this.type;
}
private ResourceType lookupResourceType() {
Integer resourceTypeId = FacesContextUtility.getRequiredRequestParameter(ParamConstants.RESOURCE_TYPE_ID_PARAM,
Integer.class);
try {
return this.resourceTypeManager.getResourceTypeById(EnterpriseFacesContextUtility.getSubject(),
resourceTypeId);
} catch (ResourceTypeNotFoundException e) {
throw new IllegalStateException(e);
}
}
private void cleanup() {
// clean out fields for next usage
this.configuration = null;
this.configurationDefinition = null;
this.type = null;
this.selectedTemplateName = null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getNullConfigurationDefinitionMessage() {
return "Could not find this resource's plugin configuration definition.";
}
public String getNullConfigurationMessage() {
return "This resource's default plugin configuration is null - this should never happen.";
}
public String getSelectedTemplateName() {
return selectedTemplateName;
}
public void setSelectedTemplateName(String selectedTemplateName) {
this.selectedTemplateName = selectedTemplateName;
}
}