001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.mail;
018
019 import java.util.Properties;
020
021 import org.apache.commons.logging.Log;
022 import org.apache.commons.logging.LogFactory;
023
024 import org.apache.geronimo.gbean.GBeanInfo;
025 import org.apache.geronimo.gbean.GBeanInfoBuilder;
026
027 /**
028 * A GBean that provides for the configuration of a JavaMail NNTP transport
029 * protocol.
030 * <p/>
031 * NNTP transport properties that are common to all NNTP transports are
032 * provided via member variables of this class. Values that are set in the
033 * individual member variables will override any of the corresponding values
034 * that have been set in the properties set.
035 *
036 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
037 * @see MailGBean
038 */
039 public class NNTPTransportGBean extends ProtocolGBean implements NNTPGBeanConstants {
040
041 private final Log log = LogFactory.getLog(NNTPTransportGBean.class);
042
043 private Integer port;
044 private Integer connectionTimeout;
045 private Integer timeout;
046 private String from;
047 private Boolean auth;
048 private String saslRealm;
049 private Boolean quitWait;
050 private String socketFactoryClass;
051 private Boolean socketFactoryFallback;
052 private Integer socketFactoryPort;
053
054
055 /**
056 * Construct an instance of NNTPTransportGBean
057 * <p/>
058 * Values that are set in the individual member variables will override any of
059 * the corresponding values that have been set in the properties set.
060 *
061 * @param objectName the object name of the protocol
062 * @param properties the set of default properties for the protocol
063 * @param host the host the protocol connects to
064 * @param user the default name for the protocol
065 * @param port the NNTP server port
066 * @param connectionTimeout the socket connection timeout value in milliseconds
067 * @param timeout the socket I/O timeout value in milliseconds
068 * @param from the email address to use for NNTP POST command
069 * @param auth whether an attempt will be made to authenticate the user
070 * @param saslRealm the realm to use with DIGEST-MD5 authentication
071 * @param quitWait whether the transport will wait for the response to the QUIT command
072 * @param socketFactoryClass the class that will be used to create NNTP sockets
073 * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
074 * socket factory class cannot be created
075 * @param socketFactoryPort whether java.net.Socket class will be created if the specified
076 * socket factory class cannot be created
077 */
078 public NNTPTransportGBean(String objectName, Properties properties, String host, String user,
079 Integer port,
080 Integer connectionTimeout,
081 Integer timeout,
082 String from,
083 Boolean auth,
084 String saslRealm,
085 Boolean quitWait,
086 String socketFactoryClass,
087 Boolean socketFactoryFallback,
088 Integer socketFactoryPort) {
089 super(objectName, "nntp-post", properties, host, user);
090
091 setPort(port);
092 setConnectionTimeout(connectionTimeout);
093 setTimeout(timeout);
094 setFrom(from);
095 setAuth(auth);
096 setSaslRealm(saslRealm);
097 setQuitWait(quitWait);
098 setSocketFactoryClass(socketFactoryClass);
099 setSocketFactoryFallback(socketFactoryFallback);
100 setSocketFactoryPort(socketFactoryPort);
101 }
102
103 /**
104 * Returns the NNTP server port to connect to, if the connect() method
105 * doesn't explicitly specify one.
106 */
107 public Integer getPort() {
108 return port;
109 }
110
111 /**
112 * Sets the NNTP server port to connect to, if the connect() method
113 * doesn't explicitly specify one.
114 * <p/>
115 * Defaults to 25.
116 * <p/>
117 * Values that are set here will override any of the corresponding value
118 * that has been set in the properties.
119 *
120 * @param port the NNTP server port to connect to
121 */
122 public void setPort(Integer port) {
123 this.port = port;
124 }
125
126 /**
127 * Returns the socket connection timeout value in milliseconds.
128 */
129 public Integer getConnectionTimeout() {
130 return connectionTimeout;
131 }
132
133 /**
134 * Sets the socket connection timeout value in milliseconds.
135 * <p/>
136 * Default is infinite timeout.
137 * <p/>
138 * Values that are set here will override any of the corresponding value
139 * that has been set in the properties.
140 *
141 * @param connectionTimeout the socket connection timeout value in milliseconds.
142 */
143 public void setConnectionTimeout(Integer connectionTimeout) {
144 this.connectionTimeout = connectionTimeout;
145 }
146
147 /**
148 * Returns the socket I/O timeout value in milliseconds.
149 */
150 public Integer getTimeout() {
151 return timeout;
152 }
153
154 /**
155 * Sets the socket I/O timeout value in milliseconds.
156 * <p/>
157 * Default is infinite timeout.
158 * <p/>
159 * Values that are set here will override any of the corresponding value
160 * that has been set in the properties.
161 *
162 * @param timeout the socket I/O timeout value in milliseconds
163 */
164 public void setTimeout(Integer timeout) {
165 this.timeout = timeout;
166 }
167
168 /**
169 * Returns the email address to use for NNTP POST command.
170 */
171 public String getFrom() {
172 return from;
173 }
174
175 /**
176 * Sets the email address to use for NNTP POST command
177 * <p/>
178 * Email address to use for NNTP POST command. This sets the envelope
179 * return address. Defaults to msg.getFrom() or InternetAddress.getLocalAddress().
180 * <p/>
181 * Values that are set here will override any of the corresponding value
182 * that has been set in the properties.
183 *
184 * @param from the email address to use for NNTP POST command
185 */
186 public void setFrom(String from) {
187 this.from = from;
188 }
189
190 /**
191 * Returns whether an attempt will be made to authenticate the user
192 * <p/>
193 * Defaults to false.
194 */
195 public Boolean getAuth() {
196 return auth;
197 }
198
199 /**
200 * Sets whether an attempt will be made to authenticate the user.
201 * <p/>
202 * Defaults to false.
203 * <p/>
204 * Values that are set here will override any of the corresponding value
205 * that has been set in the properties.
206 *
207 * @param auth whether an attempt will be made to authenticate the user.
208 */
209 public void setAuth(Boolean auth) {
210 this.auth = auth;
211 }
212
213 /**
214 * Returns the realm to use with DIGEST-MD5 authentication.
215 */
216 public String getSaslRealm() {
217 return saslRealm;
218 }
219
220 /**
221 * Sets the realm to use with DIGEST-MD5 authentication.
222 * <p/>
223 * Values that are set here will override any of the corresponding value
224 * that has been set in the properties.
225 *
226 * @param saslRealm the realm to use with DIGEST-MD5 authentication
227 */
228 public void setSaslRealm(String saslRealm) {
229 this.saslRealm = saslRealm;
230 }
231
232 /**
233 * Returns whether the transport will wait for the response to the QUIT command.
234 * <p/>
235 * If set to true, causes the transport to wait for the response to the QUIT
236 * command. If set to false (the default), the QUIT command is sent and the
237 * connection is immediately closed.
238 */
239 public Boolean getQuitWait() {
240 return quitWait;
241 }
242
243 /**
244 * Sets whether the transport will wait for the response to the QUIT command
245 * <p/>
246 * If set to true, causes the transport to wait for the response to the QUIT
247 * command. If set to false (the default), the QUIT command is sent and the
248 * connection is immediately closed.
249 * <p/>
250 * Values that are set here will override any of the corresponding value
251 * that has been set in the properties.
252 *
253 * @param quitWait whether the transport will wait for the response to the QUIT command
254 */
255 public void setQuitWait(Boolean quitWait) {
256 this.quitWait = quitWait;
257 }
258
259 /**
260 * Returns the class that will be used to create NNTP sockets.
261 * <p/>
262 * If set, specifies the name of a class that implements the
263 * javax.net.SocketFactory interface. This class will be used to create NNTP
264 * sockets.
265 */
266 public String getSocketFactoryClass() {
267 return socketFactoryClass;
268 }
269
270 /**
271 * Sets the class that will be used to create NNTP sockets.
272 * <p/>
273 * If set, specifies the name of a class that implements the
274 * javax.net.SocketFactory interface. This class will be used to create NNTP
275 * sockets.
276 * <p/>
277 * Values that are set here will override any of the corresponding value
278 * that has been set in the properties.
279 *
280 * @param socketFactoryClass the class that will be used to create NNTP sockets
281 */
282 public void setSocketFactoryClass(String socketFactoryClass) {
283 this.socketFactoryClass = socketFactoryClass;
284 }
285
286 /**
287 * Returns whether java.net.Socket class will be created if the specified
288 * socket factory class cannot be created.
289 * <p/>
290 * If set to true, failure to create a socket using the specified socket
291 * factory class will cause the socket to be created using the
292 * java.net.Socket class. Defaults to true.
293 */
294 public Boolean getSocketFactoryFallback() {
295 return socketFactoryFallback;
296 }
297
298 /**
299 * Sets whether java.net.Socket class will be created if the specified
300 * socket factory class cannot be created.
301 * <p/>
302 * If set to true, failure to create a socket using the specified socket
303 * factory class will cause the socket to be created using the
304 * java.net.Socket class. Defaults to true.
305 * <p/>
306 * Values that are set here will override any of the corresponding value
307 * that has been set in the properties.
308 *
309 * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
310 * socket factory class cannot be created
311 */
312 public void setSocketFactoryFallback(Boolean socketFactoryFallback) {
313 this.socketFactoryFallback = socketFactoryFallback;
314 }
315
316 /**
317 * Returns the port to connect to when using the specified socket factory.
318 * <p/>
319 * Specifies the port to connect to when using the specified socket
320 * factory. If not set, the default port will be used.
321 */
322 public Integer getSocketFactoryPort() {
323 return socketFactoryPort;
324 }
325
326 /**
327 * Sets the port to connect to when using the specified socket factory.
328 * <p/>
329 * Specifies the port to connect to when using the specified socket
330 * factory. If not set, the default port will be used.
331 * <p/>
332 * Values that are set here will override any of the corresponding value
333 * that has been set in the properties.
334 *
335 * @param socketFactoryPort the port to connect to when using the specified socket factory
336 */
337 public void setSocketFactoryPort(Integer socketFactoryPort) {
338 this.socketFactoryPort = socketFactoryPort;
339 }
340
341 /**
342 * Add the overrides from the member variables to the properties file.
343 */
344 public void addOverrides(Properties props) {
345 super.addOverrides(props);
346
347 if (port != null) props.setProperty(NNTP_PORT, port.toString());
348 if (connectionTimeout != null) props.setProperty(NNTP_CONNECTION_TIMEOUT, connectionTimeout.toString());
349 if (timeout != null) props.setProperty(NNTP_TIMEOUT, timeout.toString());
350 if (from != null) props.setProperty(NNTP_FROM, from);
351 if (auth != null) props.setProperty(NNTP_AUTH, auth.toString());
352 if (saslRealm != null) props.setProperty(NNTP_REALM, saslRealm);
353 if (quitWait != null) props.setProperty(NNTP_QUITWAIT, quitWait.toString());
354 if (socketFactoryClass != null) props.setProperty(NNTP_FACTORY_CLASS, socketFactoryClass);
355 if (socketFactoryFallback != null) props.setProperty(NNTP_FACTORY_FALLBACK, socketFactoryFallback.toString());
356 if (socketFactoryPort != null) props.setProperty(NNTP_FACTORY_PORT, socketFactoryPort.toString());
357 }
358
359 public void doStart() throws Exception {
360 log.debug("Started " + getObjectName());
361 }
362
363 public void doStop() throws Exception {
364 log.debug("Stopped " + getObjectName());
365 }
366
367 public void doFail() {
368 log.warn("Failed " + getObjectName());
369 }
370
371 public static final GBeanInfo GBEAN_INFO;
372
373 static {
374 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(NNTPTransportGBean.class);
375
376 infoFactory.addAttribute(GBEAN_PORT, Integer.class, true);
377 infoFactory.addAttribute(GBEAN_CONNECTION_TIMEOUT, Integer.class, true);
378 infoFactory.addAttribute(GBEAN_TIMEOUT, Integer.class, true);
379 infoFactory.addAttribute(GBEAN_AUTH, Boolean.class, true);
380 infoFactory.addAttribute(GBEAN_FROM, String.class, true);
381 infoFactory.addAttribute(GBEAN_REALM, String.class, true);
382 infoFactory.addAttribute(GBEAN_QUITWAIT, Boolean.class, true);
383 infoFactory.addAttribute(GBEAN_FACTORY_CLASS, String.class, true);
384 infoFactory.addAttribute(GBEAN_FACTORY_FALLBACK, Boolean.class, true);
385 infoFactory.addAttribute(GBEAN_FACTORY_PORT, Integer.class, true);
386
387 infoFactory.addAttribute(GBEAN_OBJECTNAME, String.class, false);
388 infoFactory.addAttribute(GBEAN_PROTOCOL, String.class, true);
389 infoFactory.addAttribute(GBEAN_PROPERTIES, Properties.class, true);
390 infoFactory.addAttribute(GBEAN_HOST, String.class, true);
391 infoFactory.addAttribute(GBEAN_USER, String.class, true);
392 infoFactory.addOperation(GBEAN_ADD_OVERRIDES, new Class[]{Properties.class});
393
394 infoFactory.setConstructor(new String[]{GBEAN_OBJECTNAME, GBEAN_PROPERTIES, GBEAN_HOST, GBEAN_USER,
395 GBEAN_PORT,
396 GBEAN_CONNECTION_TIMEOUT,
397 GBEAN_TIMEOUT,
398 GBEAN_FROM,
399 GBEAN_AUTH,
400 GBEAN_REALM,
401 GBEAN_QUITWAIT,
402 GBEAN_FACTORY_CLASS,
403 GBEAN_FACTORY_FALLBACK,
404 GBEAN_FACTORY_PORT});
405
406 GBEAN_INFO = infoFactory.getBeanInfo();
407 }
408
409 public static GBeanInfo getGBeanInfo() {
410 return GBEAN_INFO;
411 }
412 }
413