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