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 NNTPStoreGBean 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 Boolean auth;
047 private String saslRealm;
048 private Boolean quitWait;
049 private String socketFactoryClass;
050 private Boolean socketFactoryFallback;
051 private Integer socketFactoryPort;
052
053
054 /**
055 * Construct an instance of NNTPStoreGBean
056 * <p/>
057 * Values that are set in the individual member variables will override any of
058 * the corresponding values that have been set in the properties set.
059 *
060 * @param objectName the object name of the protocol
061 * @param properties the set of default properties for the protocol
062 * @param host the host the protocol connects to
063 * @param user the default name for the protocol
064 * @param port the NNTP server port
065 * @param connectionTimeout the socket connection timeout value in milliseconds
066 * @param timeout the socket I/O timeout value in milliseconds
067 * @param auth whether an attempt will be made to authenticate the user
068 * @param saslRealm the realm to use with DIGEST-MD5 authentication
069 * @param quitWait whether the transport will wait for the response to the QUIT command
070 * @param socketFactoryClass the class that will be used to create NNTP sockets
071 * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
072 * socket factory class cannot be created
073 * @param socketFactoryPort whether java.net.Socket class will be created if the specified
074 * socket factory class cannot be created
075 */
076 public NNTPStoreGBean(String objectName, Properties properties, String host, String user,
077 Integer port,
078 Integer connectionTimeout,
079 Integer timeout,
080 Boolean auth,
081 String saslRealm,
082 Boolean quitWait,
083 String socketFactoryClass,
084 Boolean socketFactoryFallback,
085 Integer socketFactoryPort) {
086 super(objectName, "nntp", properties, host, user);
087
088 setPort(port);
089 setConnectionTimeout(connectionTimeout);
090 setTimeout(timeout);
091 setAuth(auth);
092 setSaslRealm(saslRealm);
093 setQuitWait(quitWait);
094 setSocketFactoryClass(socketFactoryClass);
095 setSocketFactoryFallback(socketFactoryFallback);
096 setSocketFactoryPort(socketFactoryPort);
097 }
098
099 /**
100 * Returns the NNTP server port to connect to, if the connect() method
101 * doesn't explicitly specify one.
102 */
103 public Integer getPort() {
104 return port;
105 }
106
107 /**
108 * Sets the NNTP server port to connect to, if the connect() method
109 * doesn't explicitly specify one.
110 * <p/>
111 * Defaults to 25.
112 * <p/>
113 * Values that are set here will override any of the corresponding value
114 * that has been set in the properties.
115 *
116 * @param port the NNTP server port to connect to
117 */
118 public void setPort(Integer port) {
119 this.port = port;
120 }
121
122 /**
123 * Returns the socket connection timeout value in milliseconds.
124 */
125 public Integer getConnectionTimeout() {
126 return connectionTimeout;
127 }
128
129 /**
130 * Sets the socket connection timeout value in milliseconds.
131 * <p/>
132 * Default is infinite timeout.
133 * <p/>
134 * Values that are set here will override any of the corresponding value
135 * that has been set in the properties.
136 *
137 * @param connectionTimeout the socket connection timeout value in milliseconds.
138 */
139 public void setConnectionTimeout(Integer connectionTimeout) {
140 this.connectionTimeout = connectionTimeout;
141 }
142
143 /**
144 * Returns the socket I/O timeout value in milliseconds.
145 */
146 public Integer getTimeout() {
147 return timeout;
148 }
149
150 /**
151 * Sets the socket I/O timeout value in milliseconds.
152 * <p/>
153 * Default is infinite timeout.
154 * <p/>
155 * Values that are set here will override any of the corresponding value
156 * that has been set in the properties.
157 *
158 * @param timeout the socket I/O timeout value in milliseconds
159 */
160 public void setTimeout(Integer timeout) {
161 this.timeout = timeout;
162 }
163
164
165 /**
166 * Returns whether an attempt will be made to authenticate the user.
167 * <p/>
168 * Defaults to false.
169 */
170 public Boolean getAuth() {
171 return auth;
172 }
173
174 /**
175 * Sets whether an attempt will be made to authenticate the user.
176 * <p/>
177 * Defaults to false.
178 * <p/>
179 * Values that are set here will override any of the corresponding value
180 * that has been set in the properties.
181 *
182 * @param auth whether an attempt will be made to authenticate the user.
183 */
184 public void setAuth(Boolean auth) {
185 this.auth = auth;
186 }
187
188 /**
189 * Returns the realm to use with DIGEST-MD5 authentication.
190 */
191 public String getSaslRealm() {
192 return saslRealm;
193 }
194
195 /**
196 * Sets the realm to use with DIGEST-MD5 authentication.
197 * <p/>
198 * Values that are set here will override any of the corresponding value
199 * that has been set in the properties.
200 *
201 * @param saslRealm the realm to use with DIGEST-MD5 authentication
202 */
203 public void setSaslRealm(String saslRealm) {
204 this.saslRealm = saslRealm;
205 }
206
207 /**
208 * Returns whether the transport will wait for the response to the QUIT command.
209 * <p/>
210 * If set to true, causes the transport to wait for the response to the QUIT
211 * command. If set to false (the default), the QUIT command is sent and the
212 * connection is immediately closed.
213 */
214 public Boolean getQuitWait() {
215 return quitWait;
216 }
217
218 /**
219 * Sets whether the transport will wait for the response to the QUIT command
220 * <p/>
221 * If set to true, causes the transport to wait for the response to the QUIT
222 * command. If set to false (the default), the QUIT command is sent and the
223 * connection is immediately closed.
224 * <p/>
225 * Values that are set here will override any of the corresponding value
226 * that has been set in the properties.
227 *
228 * @param quitWait whether the transport will wait for the response to the QUIT command
229 */
230 public void setQuitWait(Boolean quitWait) {
231 this.quitWait = quitWait;
232 }
233
234 /**
235 * Returns the class that will be used to create NNTP sockets.
236 * <p/>
237 * If set, specifies the name of a class that implements the
238 * javax.net.SocketFactory interface. This class will be used to create NNTP
239 * sockets.
240 */
241 public String getSocketFactoryClass() {
242 return socketFactoryClass;
243 }
244
245 /**
246 * Sets the class that will be used to create NNTP sockets.
247 * <p/>
248 * If set, specifies the name of a class that implements the
249 * javax.net.SocketFactory interface. This class will be used to create NNTP
250 * sockets.
251 * <p/>
252 * Values that are set here will override any of the corresponding value
253 * that has been set in the properties.
254 *
255 * @param socketFactoryClass the class that will be used to create NNTP sockets
256 */
257 public void setSocketFactoryClass(String socketFactoryClass) {
258 this.socketFactoryClass = socketFactoryClass;
259 }
260
261 /**
262 * Returns whether java.net.Socket class will be created if the specified
263 * socket factory class cannot be created.
264 * <p/>
265 * If set to true, failure to create a socket using the specified socket
266 * factory class will cause the socket to be created using the
267 * java.net.Socket class. Defaults to true.
268 */
269 public Boolean getSocketFactoryFallback() {
270 return socketFactoryFallback;
271 }
272
273 /**
274 * Sets whether java.net.Socket class will be created if the specified
275 * socket factory class cannot be created.
276 * <p/>
277 * If set to true, failure to create a socket using the specified socket
278 * factory class will cause the socket to be created using the
279 * java.net.Socket class. Defaults to true.
280 * <p/>
281 * Values that are set here will override any of the corresponding value
282 * that has been set in the properties.
283 *
284 * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
285 * socket factory class cannot be created
286 */
287 public void setSocketFactoryFallback(Boolean socketFactoryFallback) {
288 this.socketFactoryFallback = socketFactoryFallback;
289 }
290
291 /**
292 * Returns the port to connect to when using the specified socket factory.
293 * <p/>
294 * Specifies the port to connect to when using the specified socket
295 * factory. If not set, the default port will be used.
296 */
297 public Integer getSocketFactoryPort() {
298 return socketFactoryPort;
299 }
300
301 /**
302 * Sets the port to connect to when using the specified socket factory.
303 * <p/>
304 * Specifies the port to connect to when using the specified socket
305 * factory. If not set, the default port will be used.
306 * <p/>
307 * Values that are set here will override any of the corresponding value
308 * that has been set in the properties.
309 *
310 * @param socketFactoryPort the port to connect to when using the specified socket factory
311 */
312 public void setSocketFactoryPort(Integer socketFactoryPort) {
313 this.socketFactoryPort = socketFactoryPort;
314 }
315
316 /**
317 * Add the overrides from the member variables to the properties file.
318 */
319 public void addOverrides(Properties props) {
320 super.addOverrides(props);
321
322 if (port != null) props.setProperty(NNTPS_PORT, port.toString());
323 if (connectionTimeout != null) props.setProperty(NNTPS_CONNECTION_TIMEOUT, connectionTimeout.toString());
324 if (timeout != null) props.setProperty(NNTPS_TIMEOUT, timeout.toString());
325 if (auth != null) props.setProperty(NNTPS_AUTH, auth.toString());
326 if (saslRealm != null) props.setProperty(NNTPS_REALM, saslRealm);
327 if (quitWait != null) props.setProperty(NNTPS_QUITWAIT, quitWait.toString());
328 if (socketFactoryClass != null) props.setProperty(NNTPS_FACTORY_CLASS, socketFactoryClass);
329 if (socketFactoryFallback != null) props.setProperty(NNTPS_FACTORY_FALLBACK, socketFactoryFallback.toString());
330 if (socketFactoryPort != null) props.setProperty(NNTPS_FACTORY_PORT, socketFactoryPort.toString());
331 }
332
333 public void doStart() throws Exception {
334 log.debug("Started " + getObjectName());
335 }
336
337 public void doStop() throws Exception {
338 log.debug("Stopped " + getObjectName());
339 }
340
341 public void doFail() {
342 log.warn("Failed " + getObjectName());
343 }
344
345 public static final GBeanInfo GBEAN_INFO;
346
347 static {
348 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(NNTPStoreGBean.class);
349
350 infoFactory.addAttribute(GBEAN_PORT, Integer.class, true);
351 infoFactory.addAttribute(GBEAN_CONNECTION_TIMEOUT, Integer.class, true);
352 infoFactory.addAttribute(GBEAN_TIMEOUT, Integer.class, true);
353 infoFactory.addAttribute(GBEAN_AUTH, Boolean.class, true);
354 infoFactory.addAttribute(GBEAN_REALM, String.class, true);
355 infoFactory.addAttribute(GBEAN_QUITWAIT, Boolean.class, true);
356 infoFactory.addAttribute(GBEAN_FACTORY_CLASS, String.class, true);
357 infoFactory.addAttribute(GBEAN_FACTORY_FALLBACK, Boolean.class, true);
358 infoFactory.addAttribute(GBEAN_FACTORY_PORT, Integer.class, true);
359
360 infoFactory.addAttribute(GBEAN_OBJECTNAME, String.class, false);
361 infoFactory.addAttribute(GBEAN_PROTOCOL, String.class, true);
362 infoFactory.addAttribute(GBEAN_PROPERTIES, Properties.class, true);
363 infoFactory.addAttribute(GBEAN_HOST, String.class, true);
364 infoFactory.addAttribute(GBEAN_USER, String.class, true);
365 infoFactory.addOperation(GBEAN_ADD_OVERRIDES, new Class[]{Properties.class});
366
367 infoFactory.setConstructor(new String[]{GBEAN_OBJECTNAME, GBEAN_PROPERTIES, GBEAN_HOST, GBEAN_USER,
368 GBEAN_PORT,
369 GBEAN_CONNECTION_TIMEOUT,
370 GBEAN_TIMEOUT,
371 GBEAN_AUTH,
372 GBEAN_REALM,
373 GBEAN_QUITWAIT,
374 GBEAN_FACTORY_CLASS,
375 GBEAN_FACTORY_FALLBACK,
376 GBEAN_FACTORY_PORT});
377
378 GBEAN_INFO = infoFactory.getBeanInfo();
379 }
380
381 public static GBeanInfo getGBeanInfo() {
382 return GBEAN_INFO;
383 }
384 }
385
386