1 /************************************************************************
2 * Copyright (c) 2000-2006 The Apache Software Foundation. *
3 * All rights reserved. *
4 * ------------------------------------------------------------------- *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you *
6 * may not use this file except in compliance with the License. You *
7 * may obtain a copy of the License at: *
8 * *
9 * http://www.apache.org/licenses/LICENSE-2.0 *
10 * *
11 * Unless required by applicable law or agreed to in writing, software *
12 * distributed under the License is distributed on an "AS IS" BASIS, *
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or *
14 * implied. See the License for the specific language governing *
15 * permissions and limitations under the License. *
16 ***********************************************************************/
17
18 package org.apache.james.transport.mailets;
19
20 import javax.net.SocketFactory;
21
22 import java.io.IOException;
23 import java.net.InetAddress;
24 import java.net.InetSocketAddress;
25 import java.net.Socket;
26 import java.net.UnknownHostException;
27
28 /***
29 * It is used by RemoteDelivery in order to make possible to bind the client
30 * socket to a specific ip address.
31 *
32 * This is not a nice solution because the ip address must be shared by all
33 * RemoteDelivery instances. It would be better to modify JavaMail
34 * (current version 1.3) to support a corresonding property, e.g.
35 * mail.smtp.bindAdress.
36 *
37 * This used to not extend javax.net.SocketFactory descendant, because
38 * 1. it was not necessary because JavaMail 1.2 uses reflection when accessing
39 * this class;
40 * 2. it was not desirable because it would require java 1.4.
41 *
42 * But since James 2.3.0a1:
43 * 1. we require Java 1.4 so the dependency on SocketFactory is
44 * not really an issue;
45 * 2. Javamail 1.4 cast the object returned by getDefault to SocketFactory and
46 * fails to create the socket if we don't extend SocketFactory.
47 *
48 * Note: Javamail 1.4 should correctly support mail.smtp.localaddr so we could
49 * probably get rid of this class and simply add that property to the Session.
50 */
51 public class RemoteDeliverySocketFactory extends SocketFactory {
52
53 /***
54 * @param addr the ip address or host name the delivery socket will bind to
55 */
56 static void setBindAdress(String addr) throws UnknownHostException {
57 if (addr == null) bindAddress = null;
58 else bindAddress = InetAddress.getByName(addr);
59 }
60
61 /***
62 * the same as the similarly named javax.net.SocketFactory operation.
63 */
64 public static SocketFactory getDefault() {
65 return new RemoteDeliverySocketFactory();
66 }
67
68 /***
69 * the same as the similarly named javax.net.SocketFactory operation.
70 * Just to be safe, it is not used by JavaMail 1.3.
71 * This is the only method used by JavaMail 1.4.
72 */
73 public Socket createSocket() throws IOException {
74 Socket s = new Socket();
75 s.bind(new InetSocketAddress(bindAddress, 0));
76 return s;
77 }
78
79 /***
80 * the same as the similarly named javax.net.SocketFactory operation.
81 * This is the one which is used by JavaMail 1.3.
82 * This is not used by JavaMail 1.4.
83 */
84 public Socket createSocket(String host, int port)
85 throws IOException, UnknownHostException {
86 return new Socket(host, port, bindAddress, 0);
87 }
88
89 /***
90 * the same as the similarly named javax.net.SocketFactory operation.
91 * Just to be safe, it is not used by JavaMail 1.3.
92 * This is not used by JavaMail 1.4.
93 */
94 public Socket createSocket(String host,
95 int port,
96 InetAddress clientHost,
97 int clientPort)
98 throws IOException,
99 UnknownHostException {
100 return new Socket(host, port,
101 clientHost == null ? bindAddress : clientHost, clientPort);
102 }
103
104 /***
105 * the same as the similarly named javax.net.SocketFactory operation.
106 * Just to be safe, it is not used by JavaMail 1.3.
107 * This is not used by JavaMail 1.4.
108 */
109 public Socket createSocket(InetAddress host, int port) throws IOException {
110 return new Socket(host, port, bindAddress, 0);
111 }
112
113 /***
114 * the same as the similarly named javax.net.SocketFactory operation.
115 * Just to be safe, it is not used by JavaMail 1.3.
116 * This is not used by JavaMail 1.4.
117 */
118 public Socket createSocket(InetAddress address,
119 int port,
120 InetAddress clientAddress,
121 int clientPort)
122 throws IOException {
123 return new Socket(address, port,
124 clientAddress == null ? bindAddress : clientAddress,
125 clientPort);
126 }
127
128 /***
129 * it should be set by setBindAdress(). Null means the socket is bind to
130 * the default address.
131 */
132 private static InetAddress bindAddress;
133 }