package jenkins.security;

import hudson.ExtensionList;
import hudson.ExtensionPoint;
import hudson.remoting.Channel;
import hudson.remoting.ChannelBuilder;
import hudson.slaves.SlaveComputer;
import jenkins.model.Jenkins;

import javax.annotation.Nullable;

/**
 * Intercepts the new creation of {@link Channel} and tweak its configuration.
 *
 * @author Kohsuke Kawaguchi
 * @since 1.THU
 */
public abstract class ChannelConfigurator implements ExtensionPoint {
    /**
     * Called whenever a new channel is being built.
     *
     * @param builder
     *      Configures the newly built channel. The callee
     *      can call its methods to modify its settings.
     * @param context
     *      The parameter that helps the callee determines what this channel is for.
     *      Legacy callers do not always provide this information, in which case this value might be null.
     *
     *      Possible known values include:
     *
     *      <dl>
     *          <dt>{@link SlaveComputer}
     *          <dd>When a channel is being established to talk to a agent.
     *      </dl>
     */
    public void onChannelBuilding(ChannelBuilder builder, @Nullable Object context) {}

    /**
     * All the registered {@link ChannelConfigurator}s.
     */
    public static ExtensionList<ChannelConfigurator> all() {
        return Jenkins.getInstance().getExtensionList(ChannelConfigurator.class);
    }
}
