package org.jboss.windup.config.operation;

import java.util.List;

import org.ocpsoft.rewrite.config.CompositeOperation;
import org.ocpsoft.rewrite.config.Operation;

/**
 * Contains useful functions for operating on Rewrite {@link Operation}s.
 *
 * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
 */
public class OperationUtil
{
    /**
     * Indicates whether or not the provided {@link Operation} is or contains any {@link Operation}s of the specified type. This will recursively
     * check all of the suboperations on {@link CompositeOperation}s as well.
     */
    public static boolean hasOperationType(Operation operation, Class<? extends Operation> operationType)
    {
        if (operation == null)
            return false;

        if (operationType.isAssignableFrom(operation.getClass()))
            return true;

        if (operation instanceof CompositeOperation)
        {
            List<Operation> operations = ((CompositeOperation) operation).getOperations();
            for (Operation childOperation : operations)
            {
                if (hasOperationType(childOperation, operationType))
                    return true;
            }
        }

        return false;
    }

    /**
     * Indicates whether the operation contains any {@link Commit} operations.
     */
    public static boolean hasCommitOperation(Operation operation)
    {
        return hasOperationType(operation, Commit.class);
    }

    /**
     * Indicates whether the operation contains any {@link IterationProgress} operations.
     */
    public static boolean hasIterationProgress(Operation operation)
    {
        return hasOperationType(operation, IterationProgress.class);
    }

}
