/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.net.intent.impl.phase;


import java.util.Optional;
import java.util.concurrent.Callable;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Worker to process a submitted intent. {@link #call()} method generates
 */
public final class IntentWorker implements Callable<FinalIntentProcessPhase> {

    private final IntentProcessPhase initial;

    /**
     * Create an instance with the specified arguments.
     *
     * @param initial initial intent process phase
     */
    public IntentWorker(IntentProcessPhase initial) {
        this.initial = checkNotNull(initial);
    }

    @Override
    public FinalIntentProcessPhase call() throws Exception {
        IntentProcessPhase update = initial;
        Optional<IntentProcessPhase> currentPhase = Optional.of(update);
        IntentProcessPhase previousPhase = update;

        while (currentPhase.isPresent()) {
            previousPhase = currentPhase.get();
            currentPhase = previousPhase.execute();
        }
        return (FinalIntentProcessPhase) previousPhase;
    }
}
