1 /*
2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/conn/scheme/Scheme.java $
3  * $Revision: 652950 $
4  * $Date: 2008-05-02 16:49:48 -0700 (Fri, 02 May 2008) $
5  *
6  * ====================================================================
7  * Licensed to the Apache Software Foundation (ASF) under one
8  * or more contributor license agreements.  See the NOTICE file
9  * distributed with this work for additional information
10  * regarding copyright ownership.  The ASF licenses this file
11  * to you under the Apache License, Version 2.0 (the
12  * "License"); you may not use this file except in compliance
13  * with the License.  You may obtain a copy of the License at
14  *
15  *   http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing,
18  * software distributed under the License is distributed on an
19  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20  * KIND, either express or implied.  See the License for the
21  * specific language governing permissions and limitations
22  * under the License.
23  * ====================================================================
24  *
25  * This software consists of voluntary contributions made by many
26  * individuals on behalf of the Apache Software Foundation.  For more
27  * information on the Apache Software Foundation, please see
28  * <http://www.apache.org/>.
29  *
30  */
31 package org.apache.http.conn.scheme;
32 
33 import java.util.Locale;
34 
35 import org.apache.http.util.LangUtils;
36 
37 /**
38  * Encapsulates specifics of a protocol scheme such as "http" or "https".
39  * Schemes are identified by lowercase names.
40  * Supported schemes are typically collected in a
41  * {@link SchemeRegistry SchemeRegistry}.
42  *
43  * <p>
44  * For example, to configure support for "https://" URLs,
45  * you could write code like the following:
46  * </p>
47  * <pre>
48  * Scheme https = new Scheme("https", new MySecureSocketFactory(), 443);
49  * SchemeRegistry.DEFAULT.register(https);
50  * </pre>
51  *
52  * @author <a href="mailto:rolandw at apache.org">Roland Weber</a>
53  * @author Michael Becke
54  * @author Jeff Dever
55  * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
56  *
57  * @deprecated Please use {@link java.net.URL#openConnection} instead.
58  *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
59  *     for further details.
60  */
61 @Deprecated
62 public final class Scheme {
63 
64     /** The name of this scheme, in lowercase. (e.g. http, https) */
65     private final String name;
66 
67     /** The socket factory for this scheme */
68     private final SocketFactory socketFactory;
69 
70     /** The default port for this scheme */
71     private final int defaultPort;
72 
73     /** Indicates whether this scheme allows for layered connections */
74     private final boolean layered;
75 
76 
77     /** A string representation, for {@link #toString toString}. */
78     private String stringRep;
79 
80 
81     /**
82      * Creates a new scheme.
83      * Whether the created scheme allows for layered connections
84      * depends on the class of <code>factory</code>.
85      *
86      * @param name      the scheme name, for example "http".
87      *                  The name will be converted to lowercase.
88      * @param factory   the factory for creating sockets for communication
89      *                  with this scheme
90      * @param port      the default port for this scheme
91      */
Scheme(final String name, final SocketFactory factory, final int port)92     public Scheme(final String name,
93                   final SocketFactory factory,
94                   final int port) {
95 
96         if (name == null) {
97             throw new IllegalArgumentException
98                 ("Scheme name may not be null");
99         }
100         if (factory == null) {
101             throw new IllegalArgumentException
102                 ("Socket factory may not be null");
103         }
104         if ((port <= 0) || (port > 0xffff)) {
105             throw new IllegalArgumentException
106                 ("Port is invalid: " + port);
107         }
108 
109         this.name = name.toLowerCase(Locale.ENGLISH);
110         this.socketFactory = factory;
111         this.defaultPort = port;
112         this.layered = (factory instanceof LayeredSocketFactory);
113     }
114 
115 
116     /**
117      * Obtains the default port.
118      *
119      * @return  the default port for this scheme
120      */
getDefaultPort()121     public final int getDefaultPort() {
122         return defaultPort;
123     }
124 
125 
126     /**
127      * Obtains the socket factory.
128      * If this scheme is {@link #isLayered layered}, the factory implements
129      * {@link LayeredSocketFactory LayeredSocketFactory}.
130      *
131      * @return  the socket factory for this scheme
132      */
getSocketFactory()133     public final SocketFactory getSocketFactory() {
134         return socketFactory;
135     }
136 
137 
138     /**
139      * Obtains the scheme name.
140      *
141      * @return  the name of this scheme, in lowercase
142      */
getName()143     public final String getName() {
144         return name;
145     }
146 
147 
148     /**
149      * Indicates whether this scheme allows for layered connections.
150      *
151      * @return <code>true</code> if layered connections are possible,
152      *         <code>false</code> otherwise
153      */
isLayered()154     public final boolean isLayered() {
155         return layered;
156     }
157 
158 
159     /**
160      * Resolves the correct port for this scheme.
161      * Returns the given port if it is valid, the default port otherwise.
162      *
163      * @param port      the port to be resolved,
164      *                  a negative number to obtain the default port
165      *
166      * @return the given port or the defaultPort
167      */
resolvePort(int port)168     public final int resolvePort(int port) {
169         return ((port <= 0) || (port > 0xffff)) ? defaultPort : port;
170     }
171 
172 
173     /**
174      * Return a string representation of this object.
175      *
176      * @return  a human-readable string description of this scheme
177      */
178     @Override
toString()179     public final String toString() {
180         if (stringRep == null) {
181             StringBuilder buffer = new StringBuilder();
182             buffer.append(this.name);
183             buffer.append(':');
184             buffer.append(Integer.toString(this.defaultPort));
185             stringRep = buffer.toString();
186         }
187         return stringRep;
188     }
189 
190 
191     /**
192      * Compares this scheme to an object.
193      *
194      * @param obj       the object to compare with
195      *
196      * @return  <code>true</code> iff the argument is equal to this scheme
197      */
198     @Override
equals(Object obj)199     public final boolean equals(Object obj) {
200         if (obj == null) return false;
201         if (this == obj) return true;
202         if (!(obj instanceof Scheme)) return false;
203 
204         Scheme s = (Scheme) obj;
205         return (name.equals(s.name) &&
206                 defaultPort == s.defaultPort &&
207                 layered == s.layered &&
208                 socketFactory.equals(s.socketFactory)
209                 );
210     } // equals
211 
212 
213     /**
214      * Obtains a hash code for this scheme.
215      *
216      * @return  the hash code
217      */
218     @Override
hashCode()219     public int hashCode() {
220         int hash = LangUtils.HASH_SEED;
221         hash = LangUtils.hashCode(hash, this.defaultPort);
222         hash = LangUtils.hashCode(hash, this.name);
223         hash = LangUtils.hashCode(hash, this.layered);
224         hash = LangUtils.hashCode(hash, this.socketFactory);
225         return hash;
226     }
227 
228 } // class Scheme
229