/*
 * Copyright 2018-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.workflow.api;

/**
 * An interface representing branch worklet. Branch worklet is used for branching workflow execution.
 */
public interface BranchWorklet extends Worklet {

    @Override
    default void process(WorkflowContext context) throws WorkflowException {
        throw new WorkflowException("This workletType.process should not be called");
    }

    @Override
    default boolean isNext(WorkflowContext context) throws WorkflowException {
        throw new WorkflowException("This workletType.isNext should not be called");
    }

    /**
     * Returns next worklet class for branching.
     * @param context workflow context
     * @return next worklet class
     * @throws WorkflowException workflow exception
     */
    Class<? extends Worklet> next(WorkflowContext context) throws WorkflowException;
}

