/* * 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.operation.schedule.group; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.quartz.JobDetail; import org.quartz.SchedulerException; import org.quartz.SimpleTrigger; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.common.composite.IntegerOptionItem; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.gui.util.FacesContextUtility; import org.rhq.enterprise.gui.operation.definition.group.ResourceGroupOperationDefinitionUIBean; import org.rhq.enterprise.gui.operation.schedule.OperationScheduleUIBean; import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; import org.rhq.enterprise.server.scheduler.SchedulerLocal; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.util.QuartzUtil; public class ResourceGroupOperationScheduleUIBean extends OperationScheduleUIBean { private ResourceGroup group; public ResourceGroupOperationScheduleUIBean() { } @Override public String getManagedBeanName() { return "ResourceGroupOperationScheduleUIBean"; } @Override public List<GroupOperationSchedule> getOperationScheduleList() { Subject subject = EnterpriseFacesContextUtility.getSubject(); ResourceGroup requestGroup = EnterpriseFacesContextUtility.getResourceGroup(); if (requestGroup == null) { requestGroup = group; // request not associated with a resource - use the resource we used before } else { group = requestGroup; // request switched the resource this UI bean is using } List<GroupOperationSchedule> results = null; try { results = manager.findScheduledGroupOperations(subject, requestGroup.getId()); } catch (Exception e) { // throw up all known information to the caller for now throw new IllegalStateException(e.getMessage(), e); } return results; } @Override public void unscheduleOperation(Subject subject, String doomedJobId) throws Exception { if (group == null) { group = EnterpriseFacesContextUtility.getResourceGroup(); if (group == null) { throw new IllegalStateException( "Could not find resource group from which to delete operation schedules"); } } manager.unscheduleGroupOperation(subject, doomedJobId, group.getId()); } public String executeNow() throws Exception { Subject subject = EnterpriseFacesContextUtility.getSubject(); HttpServletRequest request = FacesContextUtility.getRequest(); String[] selectedItems = request.getParameterValues("selectedItems"); if (selectedItems == null || selectedItems.length == 0) { selectedItems = request.getParameterValues("jobId"); } if (selectedItems == null || selectedItems.length == 0) { throw new IllegalStateException("No job selected to execute"); } SchedulerLocal scheduler = LookupUtil.getSchedulerBean(); for (String jobIdString : selectedItems) { GroupOperationSchedule groupSchedule; try { groupSchedule = manager.getGroupOperationSchedule(subject, jobIdString); } catch (SchedulerException se) { throw new IllegalStateException(se.getMessage(), se); } List<Resource> resources = groupSchedule.getExecutionOrder(); int[] resourceIds; if (resources == null) { resourceIds = new int[0]; } else { resourceIds = new int[resources.size()]; int i = 0; for (Resource next : resources) { resourceIds[i++] = next.getId(); } } JobDetail jobDetail = scheduler.getJobDetail(groupSchedule.getJobName(), groupSchedule.getJobGroup()); scheduleOperation(subject, groupSchedule.getOperationName(), resourceIds, groupSchedule.isHaltOnFailure(), groupSchedule.getParameters(), (SimpleTrigger) QuartzUtil.getFireOnceImmediateTrigger(jobDetail), groupSchedule.getDescription()); } return "viewOperationHistory"; } @Override public void scheduleOperation(Subject subject, String operationName, Configuration parameters, SimpleTrigger simpleTrigger, String description) throws Exception { ResourceGroupOperationDefinitionUIBean bean = FacesContextUtility .getBean(ResourceGroupOperationDefinitionUIBean.class); scheduleOperation(subject, operationName, getResourceIds(), bean.isHaltOnFailure(), parameters, simpleTrigger, description); } private void scheduleOperation(Subject subject, String operationName, int[] passedResourceIds, boolean haltOnFailure, Configuration parameters, SimpleTrigger simpleTrigger, String description) throws Exception { if (group == null) { group = EnterpriseFacesContextUtility.getResourceGroup(); if (group == null) { throw new IllegalStateException("Could not find resource group against which to schedule operations"); } } manager.scheduleGroupOperation(subject, group.getId(), passedResourceIds, haltOnFailure, operationName, parameters, simpleTrigger, description); } public int[] getResourceIds() { ResourceGroupOperationDefinitionUIBean operationDefinitionUIBean = FacesContextUtility .getBean(ResourceGroupOperationDefinitionUIBean.class); if (operationDefinitionUIBean.isConcurrent()) { return null; } List<IntegerOptionItem> orderedNameItems = operationDefinitionUIBean.getResourceNameItems(); int i = 0; int[] resourceIds = new int[orderedNameItems.size()]; for (IntegerOptionItem nameItem : orderedNameItems) { resourceIds[i++] = nameItem.getId(); } return resourceIds; } }