1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/*
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/auth/AuthSchemeRegistry.java $
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Revision: 652950 $
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Date: 2008-05-02 16:49:48 -0700 (Fri, 02 May 2008) $
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ====================================================================
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  this work for additional information regarding copyright ownership.
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  the License.  You may obtain a copy of the License at
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  See the License for the specific language governing permissions and
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *  limitations under the License.
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ====================================================================
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This software consists of voluntary contributions made by many
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * individuals on behalf of the Apache Software Foundation.  For more
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * information on the Apache Software Foundation, please see
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <http://www.apache.org/>.
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.http.auth;
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.ArrayList;
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.LinkedHashMap;
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.List;
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.Locale;
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.Map;
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.params.HttpParams;
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/**
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Authentication scheme registry that can be used to obtain the corresponding
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * authentication scheme implementation for a given type of authorization challenge.
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Revision: 652950 $
49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 4.0
50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic final class AuthSchemeRegistry {
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private final Map<String,AuthSchemeFactory> registeredSchemes;
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public AuthSchemeRegistry() {
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.registeredSchemes = new LinkedHashMap<String,AuthSchemeFactory>();
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Registers a {@link AuthSchemeFactory} with  the given identifier. If a factory with the
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * given name already exists it will be overridden. This name is the same one used to
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * retrieve the {@link AuthScheme authentication scheme} from {@link #getAuthScheme}.
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Please note that custom authentication preferences, if used, need to be updated accordingly
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * for the new {@link AuthScheme authentication scheme} to take effect.
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * </p>
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the identifier for this scheme
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param factory the {@link AuthSchemeFactory} class to register
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see #getAuthScheme
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public synchronized void register(
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            final String name,
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            final AuthSchemeFactory factory) {
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project         if (name == null) {
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project             throw new IllegalArgumentException("Name may not be null");
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project         }
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (factory == null) {
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalArgumentException("Authentication scheme factory may not be null");
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        registeredSchemes.put(name.toLowerCase(Locale.ENGLISH), factory);
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Unregisters the class implementing an {@link AuthScheme authentication scheme} with
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * the given name.
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the identifier of the class to unregister
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public synchronized void unregister(final String name) {
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project         if (name == null) {
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project             throw new IllegalArgumentException("Name may not be null");
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project         }
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        registeredSchemes.remove(name.toLowerCase(Locale.ENGLISH));
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Gets the {@link AuthScheme authentication scheme} with the given name.
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the {@link AuthScheme authentication scheme} identifier
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param params the {@link HttpParams HTTP parameters} for the authentication
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *  scheme.
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return {@link AuthScheme authentication scheme}
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws IllegalStateException if a scheme with the given name cannot be found
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public synchronized AuthScheme getAuthScheme(final String name, final HttpParams params)
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        throws IllegalStateException {
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (name == null) {
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalArgumentException("Name may not be null");
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        AuthSchemeFactory factory = registeredSchemes.get(name.toLowerCase(Locale.ENGLISH));
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (factory != null) {
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return factory.newInstance(params);
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalStateException("Unsupported authentication scheme: " + name);
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Obtains a list containing names of all registered {@link AuthScheme authentication
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * schemes} in their default order.
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return list of registered scheme names
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public synchronized List<String> getSchemeNames() {
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return new ArrayList<String>(registeredSchemes.keySet());
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Populates the internal collection of registered {@link AuthScheme authentication schemes}
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * with the content of the map passed as a parameter.
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param map authentication schemes
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public synchronized void setItems(final Map<String, AuthSchemeFactory> map) {
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (map == null) {
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return;
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        registeredSchemes.clear();
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        registeredSchemes.putAll(map);
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
150