/* * RHQ Management Platform * Copyright (C) 2005-2008 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.inventory.resource; import java.util.ArrayList; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.model.SelectItem; import javax.servlet.http.HttpServletRequest; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.resource.CreateResourceHistory; import org.rhq.core.domain.resource.CreateResourceStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; 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.resource.ResourceFactoryManagerLocal; import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal; import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException; import org.rhq.enterprise.server.util.LookupUtil; /** * @author Jason Dobies * @author Ian Springer */ public class DetermineChildResourceCreationTypeUIBean { private static final String OUTCOME_NO_TYPE = "noTypeSelected"; private static final String OUTCOME_ARTIFACT = "artifact"; private static final String OUTCOME_CONFIGURATION_MULTIPLE_TEMPLATES = "configuration-multipleTemplates"; private static final String OUTCOME_CONFIGURATION_SINGLE_TEMPLATE = "configuration-singleTemplate"; private CreateResourceHistory retryCreateItem; /** * Determines which branch of the create workflow to take, based on the resource type selected (i.e. show the user * the resource configuration or the create artifact form). * * @return action forward */ public String determineCreationType() { Subject subject = EnterpriseFacesContextUtility.getSubject(); ResourceType resourceType; // When the drop down was removed, a link containing the ID as a request parameter was added. Handle // that ID now to load the failed request if there was one. HttpServletRequest request = FacesContextUtility.getRequest(); String sRetryCreateItemId = request.getParameter("retryCreateItemId"); if (sRetryCreateItemId != null) { ResourceFactoryManagerLocal resourceFactoryManager = LookupUtil.getResourceFactoryManager(); int retryCreateItemId = Integer.parseInt(sRetryCreateItemId); retryCreateItem = resourceFactoryManager.getCreateHistoryItem(retryCreateItemId); } if (this.retryCreateItem != null) { // This is a retry of an earlier failed create request. // Any data that should be prepopulated into the resulting workflow will be loaded. For instance, if the create // call failed because of an invalid configuration, the new page in the workflow should show the previous // configuration, with any plugin-side validation errors that occurred. resourceType = this.retryCreateItem.getResourceType(); FacesContextUtility.getFacesContext().getExternalContext().getRequestMap().put( ParamConstants.RESOURCE_TYPE_ID_PARAM, resourceType.getId()); switch (resourceType.getCreationDataType()) { case CONTENT: { CreateNewPackageChildResourceUIBean createPackageBean = FacesContextUtility .getManagedBean(CreateNewPackageChildResourceUIBean.class); createPackageBean.setResourceType(this.retryCreateItem.getResourceType()); createPackageBean.setConfiguration(this.retryCreateItem.getConfiguration()); break; } case CONFIGURATION: { CreateNewConfigurationChildResourceUIBean createConfigBean = FacesContextUtility .getManagedBean(CreateNewConfigurationChildResourceUIBean.class); createConfigBean.setResourceName(this.retryCreateItem.getCreatedResourceName()); createConfigBean.setResourceType(this.retryCreateItem.getResourceType()); createConfigBean.setConfiguration(this.retryCreateItem.getConfiguration()); break; } } } else { ResourceTypeManagerLocal resourceTypeManager = LookupUtil.getResourceTypeManager(); int resourceTypeId = EnterpriseFacesContextUtility.getResourceType().getId(); try { resourceType = resourceTypeManager.getResourceTypeById(subject, resourceTypeId); } catch (ResourceTypeNotFoundException e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Could not retrieve resource type for resource type id: " + resourceTypeId); return OUTCOME_NO_TYPE; } } String outcome = OUTCOME_NO_TYPE; switch (resourceType.getCreationDataType()) { case CONTENT: { outcome = OUTCOME_ARTIFACT; break; } case CONFIGURATION: { ConfigurationDefinition configurationDefinition = lookupConfigurationDefinition(resourceType.getId()); outcome = (configurationDefinition.getTemplates().size() > 1) ? OUTCOME_CONFIGURATION_MULTIPLE_TEMPLATES : OUTCOME_CONFIGURATION_SINGLE_TEMPLATE; break; } } return outcome; } /** * Temporary hack to get around the bug in the RichFaces data table that breaks links in each row (see * http://jira.jboss.com/jira/browse/RF-250). Ultimately, each failed row will have a button to retry the create. * Until that bug is fixed, use a separate dropdown with each failed create to select the one to retry. Note, Exadel * claims RF-250 is fixed in the 3.1.0 nightlies, but we're still seeing the issue. * * @return list of failed create history requests */ public SelectItem[] getFailedCreateHistory() { Subject user = EnterpriseFacesContextUtility.getSubject(); Resource parentResource = EnterpriseFacesContextUtility.getResource(); ResourceFactoryManagerLocal resourceFactoryManager = LookupUtil.getResourceFactoryManager(); PageControl pageControl = new PageControl(0, 1000); PageList<CreateResourceHistory> pageList = resourceFactoryManager.findCreateChildResourceHistory(user, parentResource.getId(), null, null, pageControl); List<SelectItem> selectItemsList = new ArrayList<SelectItem>(); for (CreateResourceHistory history : pageList) { if ((history.getStatus() == CreateResourceStatus.FAILURE) || (history.getStatus() == CreateResourceStatus.TIMED_OUT)) { selectItemsList.add(new SelectItem(history, history.getCreatedResourceName())); } } SelectItem[] items = selectItemsList.toArray(new SelectItem[selectItemsList.size()]); return items; } private ConfigurationDefinition lookupConfigurationDefinition(int resourceTypeId) { Subject user = EnterpriseFacesContextUtility.getSubject(); ConfigurationManagerLocal configurationManager = LookupUtil.getConfigurationManager(); ConfigurationDefinition configurationDefinition = configurationManager .getResourceConfigurationDefinitionWithTemplatesForResourceType(user, resourceTypeId); return configurationDefinition; } public CreateResourceHistory getRetryCreateItem() { return retryCreateItem; } public void setRetryCreateItem(CreateResourceHistory retryCreateItem) { this.retryCreateItem = retryCreateItem; } }