/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.apache.synapse.securevault.secret;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Represents group of any number of Callbacks - group means, they provide secret for a one use
 */

public class MultiSecretCallback implements SecretCallback {

    /* All the children SecretCallbacks */
    private final List<SecretCallback> secretCallbacks =
            new ArrayList<SecretCallback>();

    /**
     * Add a SecretCallback
     *
     * @param secretCallback SecretCallback instance
     */
    public void addSecretCallback(SecretCallback secretCallback) {
        secretCallbacks.add(secretCallback);
    }

    /**
     * Returns all SecretCallbacks
     *
     * @return SecretCallbacks as Iterator
     */
    public Iterator<SecretCallback> getSecretCallbacks() {
        return secretCallbacks.iterator();
    }
}
