/* * RHQ Management Platform * Copyright 2010, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * 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.inventory.groups.detail.operation.schedule; import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.criteria.Criteria; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; import org.rhq.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource; /** * A DataSource for {@link org.rhq.core.domain.operation.bean.GroupOperationSchedule}s for a given * {@link org.rhq.core.domain.resource.group.ResourceGroup}. * * @author Ian Springer */ public class GroupOperationScheduleDataSource extends AbstractOperationScheduleDataSource<GroupOperationSchedule> { public static abstract class Field extends AbstractOperationScheduleDataSource.Field { public static final String HALT_ON_FAILURE = "haltOnFailure"; public static final String EXECUTION_ORDER = "executionOrder"; } public static abstract class RequestProperty extends AbstractOperationScheduleDataSource.RequestProperty { public static final String EXECUTION_ORDER = "executionOrder"; } private ResourceGroupComposite groupComposite; public GroupOperationScheduleDataSource(ResourceGroupComposite groupComposite) { super(groupComposite.getResourceGroup().getResourceType()); this.groupComposite = groupComposite; } @Override protected GroupOperationSchedule createOperationSchedule() { GroupOperationSchedule groupOperationSchedule = new GroupOperationSchedule(); ResourceGroup fakeGroup = new ResourceGroup("dummy"); fakeGroup.setId(groupComposite.getResourceGroup().getId()); groupOperationSchedule.setGroup(this.groupComposite.getResourceGroup()); // resourceOperationSchedule.setResource(this.resourceComposite.getResource()); // this was causing the serialization issues in GWT 2.5.0 (bz1058318), however there is no need to send the // fully initialized resource group instance over the wire, because the SLFB needs only the id // groupOperationSchedule.setGroup(this.groupComposite.getResourceGroup()); return groupOperationSchedule; } @Override protected void executeFetch(final DSRequest request, final DSResponse response, final Criteria unused) { final Integer scheduleId = request.getCriteria().getAttributeAsInt(Field.ID); if (scheduleId != null) { operationService.getGroupOperationSchedule(scheduleId, new AsyncCallback<GroupOperationSchedule>() { public void onSuccess(GroupOperationSchedule result) { sendSuccessResponse(request, response, result); } public void onFailure(Throwable caught) { sendFailureResponse(request, response, "Failed to fetch GroupOperationSchedule with id " + scheduleId + ".", caught); } }); } else { operationService.findScheduledGroupOperations(this.groupComposite.getResourceGroup().getId(), new AsyncCallback<List<GroupOperationSchedule>>() { public void onSuccess(List<GroupOperationSchedule> result) { Record[] records = buildRecords(result); response.setData(records); processResponse(request.getRequestId(), response); } public void onFailure(Throwable caught) { throw new RuntimeException("Failed to find scheduled operations for " + groupComposite.getResourceGroup() + ".", caught); } }); } } @Override protected void executeAdd(Record recordToAdd, final DSRequest request, final DSResponse response) { addRequestPropertiesToRecord(request, recordToAdd); final GroupOperationSchedule scheduleToAdd = copyValues(recordToAdd); operationService.scheduleGroupOperation(scheduleToAdd, new AsyncCallback<Integer>() { public void onSuccess(Integer scheduleId) { scheduleToAdd.setId(scheduleId); sendSuccessResponse(request, response, scheduleToAdd); } public void onFailure(Throwable caught) { throw new RuntimeException("Failed to add " + scheduleToAdd, caught); } }); } @Override protected void addRequestPropertiesToRecord(DSRequest request, Record record) { super.addRequestPropertiesToRecord(request, record); List<Resource> executionOrder = (List<Resource>) request.getAttributeAsObject(RequestProperty.EXECUTION_ORDER); record.setAttribute(Field.EXECUTION_ORDER, executionOrder); } @Override protected void executeRemove(Record recordToRemove, final DSRequest request, final DSResponse response) { final GroupOperationSchedule scheduleToRemove = copyValues(recordToRemove); operationService.unscheduleGroupOperation(scheduleToRemove, new AsyncCallback<Void>() { public void onSuccess(Void result) { sendSuccessResponse(request, response, scheduleToRemove); } public void onFailure(Throwable caught) { throw new RuntimeException("Failed to remove " + scheduleToRemove, caught); } }); } @Override public ListGridRecord copyValues(GroupOperationSchedule from) { ListGridRecord record = super.copyValues(from); record.setAttribute(Field.EXECUTION_ORDER, from.getExecutionOrder()); record.setAttribute(Field.HALT_ON_FAILURE, from.getHaltOnFailure()); return record; } @Override public GroupOperationSchedule copyValues(Record from) { GroupOperationSchedule groupOperationSchedule = super.copyValues(from); List<Resource> executionOrder = (List<Resource>) from.getAttributeAsObject(Field.EXECUTION_ORDER); groupOperationSchedule.setExecutionOrder(executionOrder); groupOperationSchedule.setHaltOnFailure(from.getAttributeAsBoolean(Field.HALT_ON_FAILURE)); return groupOperationSchedule; } }