/*
 * 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.incubator.net.config;

import com.google.common.annotations.Beta;

import java.util.Set;

/**
 * Service for tracking network configuration factories. It is the basis for
 * extensibility to allow various core subsystems or apps to register their
 * own configuration factories that permit use to inject additional meta
 * information about how various parts of the network should be viewed and
 * treated.
 */
@Beta
public interface NetworkConfigRegistry extends NetworkConfigService {

    /**
     * Registers the specified configuration factory.
     *
     * @param configFactory configuration factory
     */
    void registerConfigFactory(ConfigFactory configFactory);

    /**
     * Unregisters the specified configuration factory.
     *
     * @param configFactory configuration factory
     */
    void unregisterConfigFactory(ConfigFactory configFactory);

    /**
     * Returns set of all registered configuration factories.
     *
     * @return set of config factories
     */
    Set<ConfigFactory> getConfigFactories();

    /**
     * Returns set of all configuration factories registered for the specified
     * class of subject.
     *
     * @param subjectClass subject class
     * @param <S>          type of subject
     * @param <C>          type of configuration
     * @return set of config factories
     */
    <S, C extends Config<S>> Set<ConfigFactory<S, C>> getConfigFactories(Class<S> subjectClass);

    /**
     * Returns the configuration factory that produces the specified class of
     * configurations.
     *
     * @param configClass configuration class
     * @param <S>         type of subject
     * @param <C>         type of configuration
     * @return config factory
     */
    <S, C extends Config<S>> ConfigFactory<S, C> getConfigFactory(Class<C> configClass);

}
