/*
 * Copyright 2016-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.artemis.impl.bgpspeakers;

import org.onosproject.routing.bgp.BgpInfoService;
import org.onosproject.routing.bgp.BgpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

/**
 * Abstract class for all the types of BGP Speakers.
 */
public abstract class BgpSpeakers {

    final Logger log = LoggerFactory.getLogger(getClass());
    Collection<BgpSession> bgpSessions;

    BgpSpeakers(BgpInfoService bgpInfoService) {
        this.bgpSessions = bgpInfoService.getBgpSessions();
    }

    /**
     * Abstract function which announces the two new subprefixes on the BGP Speaker.
     * @param prefixes list of two prefixes
     */
    public abstract void announceSubPrefixes(String[] prefixes);
}
