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

import java.util.Set;

/**
 * Service for tracking network configuration factories.
 */
public interface NetworkConfigRegistry {

    /**
     * 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 configuration factories available for the specified
     * class of subject.
     *
     * @param subjectClass subject class
     */
    <T> Set<ConfigFactory<T>> getConfigFactories(Class<T> subjectClass);

    /**
     * Returns the configuration type registered for the specified
     * subject type and key.
     *
     * @param subjectClass subject class
     */
    <T> ConfigFactory<T> getConfigFactory(Class<T> subjectClass, String configKey);

    /**
     * Returns the configuration type registered for the specified
     * configuration class.
     *
     * @param configClass configuration class
     */
    <T> ConfigFactory<T> getConfigFactory(Class<Config<T>> configClass);

}
