1 30 31 package org.apache.commons.httpclient.protocol; 32 33 import java.io.IOException ; 34 import java.lang.reflect.Constructor ; 35 import java.lang.reflect.InvocationTargetException ; 36 import java.lang.reflect.Method ; 37 import java.net.InetAddress ; 38 import java.net.Socket ; 39 import java.net.UnknownHostException ; 40 41 import org.apache.commons.httpclient.ConnectTimeoutException; 42 43 51 public final class ReflectionSocketFactory { 52 53 private static boolean REFLECTION_FAILED = false; 54 55 private static Constructor INETSOCKETADDRESS_CONSTRUCTOR = null; 56 private static Method SOCKETCONNECT_METHOD = null; 57 private static Method SOCKETBIND_METHOD = null; 58 private static Class SOCKETTIMEOUTEXCEPTION_CLASS = null; 59 60 private ReflectionSocketFactory() { 61 super(); 62 } 63 64 86 public static Socket createSocket( 87 final String socketfactoryName, 88 final String host, 89 final int port, 90 final InetAddress localAddress, 91 final int localPort, 92 int timeout) 93 throws IOException , UnknownHostException , ConnectTimeoutException 94 { 95 if (REFLECTION_FAILED) { 96 return null; 98 } 99 try { 109 Class socketfactoryClass = Class.forName(socketfactoryName); 110 Method method = socketfactoryClass.getMethod("getDefault", 111 new Class [] {}); 112 Object socketfactory = method.invoke(null, 113 new Object [] {}); 114 method = socketfactoryClass.getMethod("createSocket", 115 new Class [] {}); 116 Socket socket = (Socket ) method.invoke(socketfactory, new Object [] {}); 117 118 if (INETSOCKETADDRESS_CONSTRUCTOR == null) { 119 Class addressClass = Class.forName("java.net.InetSocketAddress"); 120 INETSOCKETADDRESS_CONSTRUCTOR = addressClass.getConstructor( 121 new Class [] { InetAddress .class, Integer.TYPE }); 122 } 123 124 Object remoteaddr = INETSOCKETADDRESS_CONSTRUCTOR.newInstance( 125 new Object [] { InetAddress.getByName(host), new Integer (port)}); 126 127 Object localaddr = INETSOCKETADDRESS_CONSTRUCTOR.newInstance( 128 new Object [] { localAddress, new Integer (localPort)}); 129 130 if (SOCKETCONNECT_METHOD == null) { 131 SOCKETCONNECT_METHOD = Socket .class.getMethod("connect", 132 new Class [] {Class.forName("java.net.SocketAddress"), Integer.TYPE}); 133 } 134 135 if (SOCKETBIND_METHOD == null) { 136 SOCKETBIND_METHOD = Socket .class.getMethod("bind", 137 new Class [] {Class.forName("java.net.SocketAddress")}); 138 } 139 SOCKETBIND_METHOD.invoke(socket, new Object [] { localaddr}); 140 SOCKETCONNECT_METHOD.invoke(socket, new Object [] { remoteaddr, new Integer (timeout)}); 141 return socket; 142 } 143 catch (InvocationTargetException e) { 144 Throwable cause = e.getTargetException(); 145 if (SOCKETTIMEOUTEXCEPTION_CLASS == null) { 146 try { 147 SOCKETTIMEOUTEXCEPTION_CLASS = Class.forName("java.net.SocketTimeoutException"); 148 } catch (ClassNotFoundException ex) { 149 REFLECTION_FAILED = true; 151 return null; 152 } 153 } 154 if (SOCKETTIMEOUTEXCEPTION_CLASS.isInstance(cause)) { 155 throw new ConnectTimeoutException( 156 "The host did not accept the connection within timeout of " 157 + timeout + " ms", cause); 158 } 159 if (cause instanceof IOException ) { 160 throw (IOException )cause; 161 } 162 return null; 163 } 164 catch (Exception e) { 165 REFLECTION_FAILED = true; 166 return null; 167 } 168 } 169 } 170 | Popular Tags |