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 /**
029 * A GBean that provides for the configuration of a JavaMail POP3 message store
030 * protocol.
031 * <p/>
032 * POP3 store properties that are common to all POP3 stores are
033 * provided via member variables of this class. Values that are set in the
034 * individual member variables will override any of the corresponding values
035 * that have been set in the properties set.
036 *
037 * @version $Rev: 486195 $ $Date: 2006-12-12 10:42:02 -0500 (Tue, 12 Dec 2006) $
038 * @see MailGBean
039 */
040 public class POP3StoreGBean extends ProtocolGBean {
041
042 // the POP3 configuration property names
043 static public final String POP3_PORT = "mail.pop3.port";
044 static public final String POP3_CONNECTION_TIMEOUT = "mail.pop3.connectiontimeout";
045 static public final String POP3_TIMEOUT = "mail.pop3.timeout";
046 static public final String POP3_FACTORY_CLASS = "mail.pop3.socketFactory.class";
047 static public final String POP3_FACTORY_FALLBACK = "mail.pop3.socketFactory.fallback";
048 static public final String POP3_FACTORY_PORT = "mail.pop3.socketFactory.port";
049 static public final String POP3_LOCALHOST = "mail.pop3.localhost";
050 static public final String POP3_LOCALADDRESS = "mail.pop3.localaddress";
051 static public final String POP3_LOCALPORT = "mail.pop3.localport";
052 static public final String POP3_RESET = "mail.pop3.resetbeforequit";
053 static public final String POP3_MESSAGE_CLASS = "mail.pop3.message.class";
054 static public final String POP3_APOP = "mail.pop3.apop.enable";
055
056 static public final String GBEAN_RESET = "rsetBeforeQuit";
057 static public final String GBEAN_APOP = "apopEnable";
058 static public final String GBEAN_MESSAGE_CLASS = "messageClass";
059
060 private final Log log = LogFactory.getLog(POP3StoreGBean.class);
061
062 private Integer port;
063 private Integer connectionTimeout;
064 private Integer timeout;
065 private Boolean rsetBeforeQuit;
066 private String messageClass;
067 private String localaddress;
068 private Integer localport;
069 private Boolean apopEnable;
070 private String socketFactoryClass;
071 private Boolean socketFactoryFallback;
072 private Integer socketFactoryPort;
073
074
075 /**
076 * Construct an instance of POP3StoreGBean
077 * <p/>
078 * Values that are set in the individual member variables will override any of
079 * the corresponding values that have been set in the properties set.
080 *
081 * @param objectName the object name of the protocol
082 * @param properties the set of default properties for the protocol
083 * @param host the host the protocol connects to
084 * @param user the default name for the protocol
085 * @param port the POP3 server port
086 * @param connectionTimeout the socket connection timeout value in milliseconds
087 * @param timeout the socket I/O timeout value in milliseconds
088 * @param rsetBeforeQuit whether an attempt will be made send a POP3 RSET command when closing
089 * the folder, before sending the QUIT command
090 * @param messageClass the class name of a subclass of com.sun.mail.pop3.POP3Message
091 * @param localaddress the local address (host name) to bind to when creating the POP3 socket
092 * @param localport the local port number to bind to when creating the POP3 socket
093 * @param apopEnable whether to use APOP instead of USER/PASS to login to the POP3 server,
094 * if the POP3 server supports APOP
095 * @param socketFactoryClass the class that will be used to create POP3 sockets
096 * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
097 * socket factory class cannot be created
098 * @param socketFactoryPort whether java.net.Socket class will be created if the specified
099 * socket factory class cannot be created
100 */
101 public POP3StoreGBean(String objectName, Properties properties, String host, String user,
102 Integer port,
103 Integer connectionTimeout,
104 Integer timeout,
105 Boolean rsetBeforeQuit,
106 String messageClass,
107 String localaddress,
108 Integer localport,
109 Boolean apopEnable,
110 String socketFactoryClass,
111 Boolean socketFactoryFallback,
112 Integer socketFactoryPort) {
113 super(objectName, "pop3", properties, host, user);
114
115 setPort(port);
116 setConnectionTimeout(connectionTimeout);
117 setTimeout(timeout);
118 setRsetBeforeQuit(rsetBeforeQuit);
119 setMessageClass(messageClass);
120 setLocaladdress(localaddress);
121 setLocalport(localport);
122 setApopEnable(apopEnable);
123 setSocketFactoryClass(socketFactoryClass);
124 setSocketFactoryFallback(socketFactoryFallback);
125 setSocketFactoryPort(socketFactoryPort);
126 }
127
128 /**
129 * Returns the POP3 server port to connect to, if the connect() method
130 * doesn't explicitly specify one.
131 * <p/>
132 * Defaults to 110.
133 */
134 public Integer getPort() {
135 return port;
136 }
137
138 /**
139 * Sets the POP3 server port to connect to, if the connect() method
140 * doesn't explicitly specify one.
141 * <p/>
142 * Defaults to 110.
143 * <p/>
144 * Values that are set here will override any of the corresponding value
145 * that has been set in the properties.
146 *
147 * @param port the POP3 server port to connect to, if the connect() method
148 * doesn't explicitly specify one
149 */
150 public void setPort(Integer port) {
151 this.port = port;
152 }
153
154 /**
155 * Returns the socket connection timeout value in milliseconds.
156 */
157 public Integer getConnectionTimeout() {
158 return connectionTimeout;
159 }
160
161 /**
162 * Sets the socket connection timeout value in milliseconds.
163 * <p/>
164 * Default is infinite timeout.
165 * <p/>
166 * Values that are set here will override any of the corresponding value
167 * that has been set in the properties.
168 *
169 * @param connectionTimeout the socket connection timeout value in milliseconds.
170 */
171 public void setConnectionTimeout(Integer connectionTimeout) {
172 this.connectionTimeout = connectionTimeout;
173 }
174
175 /**
176 * Returns the socket I/O timeout value in milliseconds.
177 */
178 public Integer getTimeout() {
179 return timeout;
180 }
181
182 /**
183 * Sets the socket I/O timeout value in milliseconds.
184 * <p/>
185 * Default is infinite timeout.
186 * <p/>
187 * Values that are set here will override any of the corresponding value
188 * that has been set in the properties.
189 *
190 * @param timeout the socket I/O timeout value in milliseconds
191 */
192 public void setTimeout(Integer timeout) {
193 this.timeout = timeout;
194 }
195
196 /**
197 * Returns whether an attempt will be made send a POP3 RSET command when
198 * closing the folder, before sending the QUIT command.
199 * <p/>
200 * Send a POP3 RSET command when closing the folder, before sending the
201 * QUIT command. Useful with POP3 servers that implicitly mark all
202 * messages that are read as "deleted"; this will prevent such messages
203 * from being deleted and expunged unless the client requests so. Default
204 * is false.
205 */
206 public Boolean getRsetBeforeQuit() {
207 return rsetBeforeQuit;
208 }
209
210 /**
211 * Sets whether an attempt will be made send a POP3 RSET command when
212 * closing the folder, before sending the QUIT command.
213 * <p/>
214 * Send a POP3 RSET command when closing the folder, before sending the
215 * QUIT command. Useful with POP3 servers that implicitly mark all messages
216 * that are read as "deleted"; this will prevent such messages from being
217 * deleted and expunged unless the client requests so. Default is false.
218 * <p/>
219 * Values that are set here will override any of the corresponding value
220 * that has been set in the properties.
221 *
222 * @param rsetBeforeQuit whether an attempt will be made send a POP3 RSET command when
223 * closing the folder, before sending the QUIT command
224 */
225 public void setRsetBeforeQuit(Boolean rsetBeforeQuit) {
226 this.rsetBeforeQuit = rsetBeforeQuit;
227 }
228
229 /**
230 * Returns the class name of a subclass of com.sun.mail.pop3.POP3Message.
231 * <p/>
232 * Class name of a subclass of com.sun.mail.pop3.POP3Message. The subclass
233 * can be used to handle (for example) non-standard Content-Type headers.
234 * The subclass must have a public constructor of the form
235 * MyPOP3Message(Folder f, int msgno) throws MessagingException.
236 */
237 public String getMessageClass() {
238 return messageClass;
239 }
240
241 /**
242 * Sets the class name of a subclass of com.sun.mail.pop3.POP3Message.
243 * <p/>
244 * Class name of a subclass of com.sun.mail.pop3.POP3Message. The subclass
245 * can be used to handle (for example) non-standard Content-Type headers.
246 * The subclass must have a public constructor of the form
247 * MyPOP3Message(Folder f, int msgno) throws MessagingException.
248 * <p/>
249 * Values that are set here will override any of the corresponding value
250 * that has been set in the properties.
251 *
252 * @param messageClass the class name of a subclass of com.sun.mail.pop3.POP3Message.
253 */
254 public void setMessageClass(String messageClass) {
255 this.messageClass = messageClass;
256 }
257
258 /**
259 * Returns the local address (host name) to bind to when creating the POP3 socket.
260 */
261 public String getLocaladdress() {
262 return localaddress;
263 }
264
265 /**
266 * Sets the local address (host name) to bind to when creating the POP3 socket.
267 * <p/>
268 * Local address (host name) to bind to when creating the POP3 socket.
269 * Defaults to the address picked by the Socket class. Should not normally
270 * need to be set, but useful with multi-homed hosts where it's important
271 * to pick a particular local address to bind to.
272 * <p/>
273 * Values that are set here will override any of the corresponding value
274 * that has been set in the properties.
275 *
276 * @param localaddress the local address (host name) to bind to when creating the POP3 socket
277 */
278 public void setLocaladdress(String localaddress) {
279 this.localaddress = localaddress;
280 }
281
282 /**
283 * Returns the local port number to bind to when creating the POP3 socket.
284 */
285 public Integer getLocalport() {
286 return localport;
287 }
288
289 /**
290 * Sets the local port number to bind to when creating the POP3 socket.
291 * <p/>
292 * Local port number to bind to when creating the POP3 socket. Defaults to
293 * the port number picked by the Socket class.
294 * <p/>
295 * Values that are set here will override any of the corresponding value
296 * that has been set in the properties.
297 *
298 * @param localport the local port number to bind to when creating the POP3 socket
299 */
300 public void setLocalport(Integer localport) {
301 this.localport = localport;
302 }
303
304 /**
305 * Returns whether to use APOP instead of USER/PASS to login to the POP3
306 * server, if the POP3 server supports APOP.
307 * <p/>
308 * If set to true, use APOP instead of USER/PASS to login to the POP3
309 * server, if the POP3 server supports APOP. APOP sends a digest of the
310 * password rather than the clear text password. Defaults to false.
311 */
312 public Boolean isApopEnable() {
313 return apopEnable;
314 }
315
316 /**
317 * Sets whether to use APOP instead of USER/PASS to login to the POP3
318 * server, if the POP3 server supports APOP.
319 * <p/>
320 * If set to true, use APOP instead of USER/PASS to login to the POP3
321 * server, if the POP3 server supports APOP. APOP sends a digest of the
322 * password rather than the clear text password. Defaults to false.
323 *
324 * @param apopEnable whether to use APOP instead of USER/PASS to login to the POP3
325 * server, if the POP3 server supports APOP
326 */
327 public void setApopEnable(Boolean apopEnable) {
328 this.apopEnable = apopEnable;
329 }
330
331 /**
332 * Returns the class that will be used to create POP3 sockets.
333 * <p/>
334 * If set, specifies the name of a class that implements the
335 * javax.net.SocketFactory interface. This class will be used to create POP3
336 * sockets.
337 */
338 public String getSocketFactoryClass() {
339 return socketFactoryClass;
340 }
341
342 /**
343 * Sets the class that will be used to create POP3 sockets.
344 * <p/>
345 * If set, specifies the name of a class that implements the
346 * javax.net.SocketFactory interface. This class will be used to create POP3
347 * sockets.
348 * <p/>
349 * Values that are set here will override any of the corresponding value
350 * that has been set in the properties.
351 *
352 * @param socketFactoryClass the class that will be used to create POP3 sockets
353 */
354 public void setSocketFactoryClass(String socketFactoryClass) {
355 this.socketFactoryClass = socketFactoryClass;
356 }
357
358 /**
359 * Returns whether java.net.Socket class will be created if the specified
360 * socket factory class cannot be created.
361 * <p/>
362 * If set to true, failure to create a socket using the specified socket
363 * factory class will cause the socket to be created using the
364 * java.net.Socket class. Defaults to true.
365 */
366 public Boolean isSocketFactoryFallback() {
367 return socketFactoryFallback;
368 }
369
370 /**
371 * Sets whether java.net.Socket class will be created if the specified
372 * socket factory class cannot be created.
373 * <p/>
374 * If set to true, failure to create a socket using the specified socket
375 * factory class will cause the socket to be created using the
376 * java.net.Socket class. Defaults to true.
377 * <p/>
378 * Values that are set here will override any of the corresponding value
379 * that has been set in the properties.
380 *
381 * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
382 * socket factory class cannot be created
383 */
384 public void setSocketFactoryFallback(Boolean socketFactoryFallback) {
385 this.socketFactoryFallback = socketFactoryFallback;
386 }
387
388 /**
389 * Returns the port to connect to when using the specified socket factory.
390 * <p/>
391 * Specifies the port to connect to when using the specified socket
392 * factory. If not set, the default port will be used.
393 */
394 public Integer getSocketFactoryPort() {
395 return socketFactoryPort;
396 }
397
398 /**
399 * Sets the port to connect to when using the specified socket factory.
400 * <p/>
401 * Specifies the port to connect to when using the specified socket
402 * factory. If not set, the default port will be used.
403 * <p/>
404 * Values that are set here will override any of the corresponding value
405 * that has been set in the properties.
406 *
407 * @param socketFactoryPort the port to connect to when using the specified socket factory
408 */
409 public void setSocketFactoryPort(Integer socketFactoryPort) {
410 this.socketFactoryPort = socketFactoryPort;
411 }
412
413 /**
414 * Add the overrides from the member variables to the properties file.
415 */
416 public void addOverrides(Properties props) {
417 super.addOverrides(props);
418
419 if (port != null) props.setProperty(POP3_PORT, port.toString());
420 if (connectionTimeout != null) props.setProperty(POP3_CONNECTION_TIMEOUT, connectionTimeout.toString());
421 if (timeout != null) props.setProperty(POP3_TIMEOUT, timeout.toString());
422 if (rsetBeforeQuit != null) props.setProperty(POP3_RESET, rsetBeforeQuit.toString());
423 if (messageClass != null) props.setProperty(POP3_MESSAGE_CLASS, messageClass);
424 if (localaddress != null) props.setProperty(POP3_LOCALADDRESS, localaddress);
425 if (localport != null) props.setProperty(POP3_LOCALPORT, localport.toString());
426 if (apopEnable != null) props.setProperty(POP3_APOP, apopEnable.toString());
427 if (socketFactoryClass != null) props.setProperty(POP3_FACTORY_CLASS, socketFactoryClass);
428 if (socketFactoryFallback != null) props.setProperty(POP3_FACTORY_FALLBACK, socketFactoryFallback.toString());
429 if (socketFactoryPort != null) props.setProperty(POP3_FACTORY_PORT, socketFactoryPort.toString());
430 }
431
432 public void doStart() throws Exception {
433 log.debug("Started " + getObjectName());
434 }
435
436 public void doStop() throws Exception {
437 log.debug("Stopped " + getObjectName());
438 }
439
440 public void doFail() {
441 log.warn("Failed " + getObjectName());
442 }
443
444 public static final GBeanInfo GBEAN_INFO;
445
446 static {
447 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(POP3StoreGBean.class, ProtocolGBean.GBEAN_INFO);
448
449 infoFactory.addAttribute(GBEAN_PORT, Integer.class, true);
450 infoFactory.addAttribute(GBEAN_CONNECTION_TIMEOUT, Integer.class, true);
451 infoFactory.addAttribute(GBEAN_TIMEOUT, Integer.class, true);
452 infoFactory.addAttribute(GBEAN_RESET, Boolean.class, true);
453 infoFactory.addAttribute(GBEAN_MESSAGE_CLASS, String.class, true);
454 infoFactory.addAttribute(GBEAN_LOCALADDRESS, String.class, true);
455 infoFactory.addAttribute(GBEAN_LOCALPORT, Integer.class, true);
456 infoFactory.addAttribute(GBEAN_APOP, Boolean.class, true);
457 infoFactory.addAttribute(GBEAN_FACTORY_CLASS, String.class, true);
458 infoFactory.addAttribute(GBEAN_FACTORY_FALLBACK, Boolean.class, true);
459 infoFactory.addAttribute(GBEAN_FACTORY_PORT, Integer.class, true);
460
461 infoFactory.addAttribute(GBEAN_OBJECTNAME, String.class, false);
462 infoFactory.addAttribute(GBEAN_PROTOCOL, String.class, true);
463 infoFactory.addAttribute(GBEAN_PROPERTIES, Properties.class, true);
464 infoFactory.addAttribute(GBEAN_HOST, String.class, true);
465 infoFactory.addAttribute(GBEAN_USER, String.class, true);
466 infoFactory.addOperation(GBEAN_ADD_OVERRIDES, new Class[]{Properties.class});
467
468 infoFactory.setConstructor(new String[]{GBEAN_OBJECTNAME, GBEAN_PROPERTIES, GBEAN_HOST, GBEAN_USER,
469 GBEAN_PORT,
470 GBEAN_CONNECTION_TIMEOUT,
471 GBEAN_TIMEOUT,
472 GBEAN_RESET,
473 GBEAN_MESSAGE_CLASS,
474 GBEAN_LOCALADDRESS,
475 GBEAN_LOCALPORT,
476 GBEAN_APOP,
477 GBEAN_FACTORY_CLASS,
478 GBEAN_FACTORY_FALLBACK,
479 GBEAN_FACTORY_PORT});
480
481 GBEAN_INFO = infoFactory.getBeanInfo();
482 }
483
484 public static GBeanInfo getGBeanInfo() {
485 return GBEAN_INFO;
486 }
487 }