/*
 * 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.core.domain.operation.bean;

import java.util.List;

import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.ResourceGroup;

/**
 * A simple non-entity POJO that describes a particular scheduled Resource group operation.
 */
public class GroupOperationSchedule extends OperationSchedule {
    private static final long serialVersionUID = 1L;

    private ResourceGroup group;
    private List<Resource> executionOrder;
    private boolean haltOnFailure = false; // default to not stop on error

    public GroupOperationSchedule() {
    }

    public ResourceGroup getGroup() {
        return group;
    }

    public void setGroup(ResourceGroup group) {
        this.group = group;
    }

    /**
     * The order to execute the operations - the first resource in the list is the first one to get its operation
     * invoked. If this is <code>null</code>, all operations can be invoked in any order and may even be done
     * concurrently.
     *
     * @return list of resources in the order in which their operations are invoked, or <code>null</code>
     */
    public List<Resource> getExecutionOrder() {
        return executionOrder;
    }

    public void setExecutionOrder(List<Resource> executionOrder) {
        this.executionOrder = executionOrder;
    }

    /**
     * If <code>true</code>, the group operation will halt whenever one individual resource fails to execute. When
     * executing in order, this means once a failure occurs, the resources next in line to execute will abort and not
     * attempt to execute. If not executing in any particular order, you are not guaranteed which will stop and which
     * will continue since all are executed as fast as possible, but the group operation will attempt to stop as best it
     * can.
     *
     * @return halt flag
     */
    public boolean isHaltOnFailure() {
        return haltOnFailure;
    }

    /**
     * need a getXXX method instead of isXXX method for proper referencing from facelets pages
     */
    public boolean getHaltOnFailure() {
        return haltOnFailure;
    }

    public void setHaltOnFailure(boolean haltOnFailure) {
        this.haltOnFailure = haltOnFailure;
    }

    @Override
    public String toString() {
        StringBuilder str = new StringBuilder("GroupOperationSchedule: ");

        str.append("group=[" + this.group);
        str.append("], execution-order=[" + this.executionOrder);
        str.append("], halt-on-failure=[" + this.haltOnFailure);
        str.append("],");
        str.append(super.toString());

        return str.toString();
    }
}