View Javadoc

1   /**
2    *
3    *  Licensed to the Apache Software Foundation (ASF) under one or more
4    *  contributor license agreements.  See the NOTICE file distributed with
5    *  this work for additional information regarding copyright ownership.
6    *  The ASF licenses this file to You under the Apache License, Version 2.0
7    *  (the "License"); you may not use this file except in compliance with
8    *  the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *  Unless required by applicable law or agreed to in writing, software
13   *  distributed under the License is distributed on an "AS IS" BASIS,
14   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   *  See the License for the specific language governing permissions and
16   *  limitations under the License.
17   */
18  package org.apache.geronimo.mail;
19  
20  import java.util.Properties;
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  
25  import org.apache.geronimo.gbean.GBeanInfo;
26  import org.apache.geronimo.gbean.GBeanInfoBuilder;
27  
28  
29  /**
30   * A GBean that provides for the configuration of a JavaMail POP3 message store
31   * protocol.
32   * <p/>
33   * POP3 store properties that are common to all POP3 stores are
34   * provided via member variables of this class.  Values that are set in the
35   * individual member variables will override any of the corresponding values
36   * that have been set in the properties set.
37   *
38   * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
39   * @see MailGBean
40   */
41  public class POP3StoreGBean extends ProtocolGBean {
42  
43      // the POP3 configuration property names
44      static public final String POP3_PORT = "mail.pop3.port";
45      static public final String POP3_CONNECTION_TIMEOUT = "mail.pop3.connectiontimeout";
46      static public final String POP3_TIMEOUT = "mail.pop3.timeout";
47      static public final String POP3_FACTORY_CLASS = "mail.pop3.socketFactory.class";
48      static public final String POP3_FACTORY_FALLBACK = "mail.pop3.socketFactory.fallback";
49      static public final String POP3_FACTORY_PORT = "mail.pop3.socketFactory.port";
50      static public final String POP3_LOCALHOST = "mail.pop3.localhost";
51      static public final String POP3_LOCALADDRESS = "mail.pop3.localaddress";
52      static public final String POP3_LOCALPORT = "mail.pop3.localport";
53      static public final String POP3_RESET = "mail.pop3.resetbeforequit";
54      static public final String POP3_MESSAGE_CLASS = "mail.pop3.message.class";
55      static public final String POP3_APOP = "mail.pop3.apop.enable";
56  
57      static public final String GBEAN_RESET = "rsetBeforeQuit";
58      static public final String GBEAN_APOP = "apopEnable";
59      static public final String GBEAN_MESSAGE_CLASS = "messageClass";
60  
61      private final Log log = LogFactory.getLog(POP3StoreGBean.class);
62  
63      private Integer port;
64      private Integer connectionTimeout;
65      private Integer timeout;
66      private Boolean rsetBeforeQuit;
67      private String messageClass;
68      private String localaddress;
69      private Integer localport;
70      private Boolean apopEnable;
71      private String socketFactoryClass;
72      private Boolean socketFactoryFallback;
73      private Integer socketFactoryPort;
74  
75  
76      /**
77       * Construct an instance of POP3StoreGBean
78       * <p/>
79       * Values that are set in the individual member variables will override any of
80       * the corresponding values that have been set in the properties set.
81       *
82       * @param objectName            the object name of the protocol
83       * @param properties            the set of default properties for the protocol
84       * @param host                  the host the protocol connects to
85       * @param user                  the default name for the protocol
86       * @param port                  the POP3 server port
87       * @param connectionTimeout     the socket connection timeout value in milliseconds
88       * @param timeout               the socket I/O timeout value in milliseconds
89       * @param rsetBeforeQuit        whether an attempt will be made send a POP3 RSET command when closing
90       *                              the folder, before sending the QUIT command
91       * @param messageClass          the class name of a subclass of com.sun.mail.pop3.POP3Message
92       * @param localaddress          the local address (host name) to bind to when creating the POP3 socket
93       * @param localport             the local port number to bind to when creating the POP3 socket
94       * @param apopEnable            whether to use APOP instead of USER/PASS to login to the POP3 server,
95       *                              if the POP3 server supports APOP
96       * @param socketFactoryClass    the class that will be used to create POP3 sockets
97       * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
98       *                              socket factory class cannot be created
99       * @param socketFactoryPort     whether java.net.Socket class will be created if the specified
100      *                              socket factory class cannot be created
101      */
102     public POP3StoreGBean(String objectName, Properties properties, String host, String user,
103                           Integer port,
104                           Integer connectionTimeout,
105                           Integer timeout,
106                           Boolean rsetBeforeQuit,
107                           String messageClass,
108                           String localaddress,
109                           Integer localport,
110                           Boolean apopEnable,
111                           String socketFactoryClass,
112                           Boolean socketFactoryFallback,
113                           Integer socketFactoryPort) {
114         super(objectName, "pop3", properties, host, user);
115 
116         setPort(port);
117         setConnectionTimeout(connectionTimeout);
118         setTimeout(timeout);
119         setRsetBeforeQuit(rsetBeforeQuit);
120         setMessageClass(messageClass);
121         setLocaladdress(localaddress);
122         setLocalport(localport);
123         setApopEnable(apopEnable);
124         setSocketFactoryClass(socketFactoryClass);
125         setSocketFactoryFallback(socketFactoryFallback);
126         setSocketFactoryPort(socketFactoryPort);
127     }
128 
129     /**
130      * Returns the POP3 server port to connect to, if the connect() method
131      * doesn't explicitly specify one.
132      * <p/>
133      * Defaults to 110.
134      */
135     public Integer getPort() {
136         return port;
137     }
138 
139     /**
140      * Sets the POP3 server port to connect to, if the connect() method
141      * doesn't explicitly specify one.
142      * <p/>
143      * Defaults to 110.
144      * <p/>
145      * Values that are set here will override any of the corresponding value
146      * that has been set in the properties.
147      *
148      * @param port the POP3 server port to connect to, if the connect() method
149      *             doesn't explicitly specify one
150      */
151     public void setPort(Integer port) {
152         this.port = port;
153     }
154 
155     /**
156      * Returns the socket connection timeout value in milliseconds.
157      */
158     public Integer getConnectionTimeout() {
159         return connectionTimeout;
160     }
161 
162     /**
163      * Sets the socket connection timeout value in milliseconds.
164      * <p/>
165      * Default is infinite timeout.
166      * <p/>
167      * Values that are set here will override any of the corresponding value
168      * that has been set in the properties.
169      *
170      * @param connectionTimeout the socket connection timeout value in milliseconds.
171      */
172     public void setConnectionTimeout(Integer connectionTimeout) {
173         this.connectionTimeout = connectionTimeout;
174     }
175 
176     /**
177      * Returns the socket I/O timeout value in milliseconds.
178      */
179     public Integer getTimeout() {
180         return timeout;
181     }
182 
183     /**
184      * Sets the socket I/O timeout value in milliseconds.
185      * <p/>
186      * Default is infinite timeout.
187      * <p/>
188      * Values that are set here will override any of the corresponding value
189      * that has been set in the properties.
190      *
191      * @param timeout the socket I/O timeout value in milliseconds
192      */
193     public void setTimeout(Integer timeout) {
194         this.timeout = timeout;
195     }
196 
197     /**
198      * Returns whether an attempt will be made send a POP3 RSET command when
199      * closing the folder, before sending the QUIT command.
200      * <p/>
201      * Send a POP3 RSET command when closing the folder, before sending the
202      * QUIT command. Useful with POP3 servers that implicitly mark all
203      * messages that are read as "deleted"; this will prevent such messages
204      * from being deleted and expunged unless the client requests so. Default
205      * is false.
206      */
207     public Boolean getRsetBeforeQuit() {
208         return rsetBeforeQuit;
209     }
210 
211     /**
212      * Sets whether an attempt will be made send a POP3 RSET command when
213      * closing the folder, before sending the QUIT command.
214      * <p/>
215      * Send a POP3 RSET command when closing the folder, before sending the
216      * QUIT command. Useful with POP3 servers that implicitly mark all messages
217      * that are read as "deleted"; this will prevent such messages from being
218      * deleted and expunged unless the client requests so. Default is false.
219      * <p/>
220      * Values that are set here will override any of the corresponding value
221      * that has been set in the properties.
222      *
223      * @param rsetBeforeQuit whether an attempt will be made send a POP3 RSET command when
224      *                       closing the folder, before sending the QUIT command
225      */
226     public void setRsetBeforeQuit(Boolean rsetBeforeQuit) {
227         this.rsetBeforeQuit = rsetBeforeQuit;
228     }
229 
230     /**
231      * Returns the class name of a subclass of com.sun.mail.pop3.POP3Message.
232      * <p/>
233      * Class name of a subclass of com.sun.mail.pop3.POP3Message. The subclass
234      * can be used to handle (for example) non-standard Content-Type headers.
235      * The subclass must have a public constructor of the form
236      * MyPOP3Message(Folder f, int msgno) throws MessagingException.
237      */
238     public String getMessageClass() {
239         return messageClass;
240     }
241 
242     /**
243      * Sets the class name of a subclass of com.sun.mail.pop3.POP3Message.
244      * <p/>
245      * Class name of a subclass of com.sun.mail.pop3.POP3Message. The subclass
246      * can be used to handle (for example) non-standard Content-Type headers.
247      * The subclass must have a public constructor of the form
248      * MyPOP3Message(Folder f, int msgno) throws MessagingException.
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 messageClass the class name of a subclass of com.sun.mail.pop3.POP3Message.
254      */
255     public void setMessageClass(String messageClass) {
256         this.messageClass = messageClass;
257     }
258 
259     /**
260      * Returns the local address (host name) to bind to when creating the POP3 socket.
261      */
262     public String getLocaladdress() {
263         return localaddress;
264     }
265 
266     /**
267      * Sets the local address (host name) to bind to when creating the POP3 socket.
268      * <p/>
269      * Local address (host name) to bind to when creating the POP3 socket.
270      * Defaults to the address picked by the Socket class. Should not normally
271      * need to be set, but useful with multi-homed hosts where it's important
272      * to pick a particular local address to bind to.
273      * <p/>
274      * Values that are set here will override any of the corresponding value
275      * that has been set in the properties.
276      *
277      * @param localaddress the local address (host name) to bind to when creating the POP3 socket
278      */
279     public void setLocaladdress(String localaddress) {
280         this.localaddress = localaddress;
281     }
282 
283     /**
284      * Returns the local port number to bind to when creating the POP3 socket.
285      */
286     public Integer getLocalport() {
287         return localport;
288     }
289 
290     /**
291      * Sets the local port number to bind to when creating the POP3 socket.
292      * <p/>
293      * Local port number to bind to when creating the POP3 socket. Defaults to
294      * the port number picked by the Socket class.
295      * <p/>
296      * Values that are set here will override any of the corresponding value
297      * that has been set in the properties.
298      *
299      * @param localport the local port number to bind to when creating the POP3 socket
300      */
301     public void setLocalport(Integer localport) {
302         this.localport = localport;
303     }
304 
305     /**
306      * Returns whether to use APOP instead of USER/PASS to login to the POP3
307      * server, if the POP3 server supports APOP.
308      * <p/>
309      * If set to true, use APOP instead of USER/PASS to login to the POP3
310      * server, if the POP3 server supports APOP. APOP sends a digest of the
311      * password rather than the clear text password. Defaults to false.
312      */
313     public Boolean isApopEnable() {
314         return apopEnable;
315     }
316 
317     /**
318      * Sets whether to use APOP instead of USER/PASS to login to the POP3
319      * server, if the POP3 server supports APOP.
320      * <p/>
321      * If set to true, use APOP instead of USER/PASS to login to the POP3
322      * server, if the POP3 server supports APOP. APOP sends a digest of the
323      * password rather than the clear text password. Defaults to false.
324      *
325      * @param apopEnable whether to use APOP instead of USER/PASS to login to the POP3
326      *                   server, if the POP3 server supports APOP
327      */
328     public void setApopEnable(Boolean apopEnable) {
329         this.apopEnable = apopEnable;
330     }
331 
332     /**
333      * Returns the class that will be used to create POP3 sockets.
334      * <p/>
335      * If set, specifies the name of a class that implements the
336      * javax.net.SocketFactory interface. This class will be used to create POP3
337      * sockets.
338      */
339     public String getSocketFactoryClass() {
340         return socketFactoryClass;
341     }
342 
343     /**
344      * Sets the class that will be used to create POP3 sockets.
345      * <p/>
346      * If set, specifies the name of a class that implements the
347      * javax.net.SocketFactory interface. This class will be used to create POP3
348      * sockets.
349      * <p/>
350      * Values that are set here will override any of the corresponding value
351      * that has been set in the properties.
352      *
353      * @param socketFactoryClass the class that will be used to create POP3 sockets
354      */
355     public void setSocketFactoryClass(String socketFactoryClass) {
356         this.socketFactoryClass = socketFactoryClass;
357     }
358 
359     /**
360      * Returns whether java.net.Socket class will be created if the specified
361      * socket factory class cannot be created.
362      * <p/>
363      * If set to true, failure to create a socket using the specified socket
364      * factory class will cause the socket to be created using the
365      * java.net.Socket class. Defaults to true.
366      */
367     public Boolean isSocketFactoryFallback() {
368         return socketFactoryFallback;
369     }
370 
371     /**
372      * Sets whether java.net.Socket class will be created if the specified
373      * socket factory class cannot be created.
374      * <p/>
375      * If set to true, failure to create a socket using the specified socket
376      * factory class will cause the socket to be created using the
377      * java.net.Socket class. Defaults to true.
378      * <p/>
379      * Values that are set here will override any of the corresponding value
380      * that has been set in the properties.
381      *
382      * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
383      *                              socket factory class cannot be created
384      */
385     public void setSocketFactoryFallback(Boolean socketFactoryFallback) {
386         this.socketFactoryFallback = socketFactoryFallback;
387     }
388 
389     /**
390      * Returns the port to connect to when using the specified socket factory.
391      * <p/>
392      * Specifies the port to connect to when using the specified socket
393      * factory. If not set, the default port will be used.
394      */
395     public Integer getSocketFactoryPort() {
396         return socketFactoryPort;
397     }
398 
399     /**
400      * Sets the port to connect to when using the specified socket factory.
401      * <p/>
402      * Specifies the port to connect to when using the specified socket
403      * factory. If not set, the default port will be used.
404      * <p/>
405      * Values that are set here will override any of the corresponding value
406      * that has been set in the properties.
407      *
408      * @param socketFactoryPort the port to connect to when using the specified socket factory
409      */
410     public void setSocketFactoryPort(Integer socketFactoryPort) {
411         this.socketFactoryPort = socketFactoryPort;
412     }
413 
414     /**
415      * Add the overrides from the member variables to the properties file.
416      */
417     public void addOverrides(Properties props) {
418         super.addOverrides(props);
419 
420         if (port != null) props.setProperty(POP3_PORT, port.toString());
421         if (connectionTimeout != null) props.setProperty(POP3_CONNECTION_TIMEOUT, connectionTimeout.toString());
422         if (timeout != null) props.setProperty(POP3_TIMEOUT, timeout.toString());
423         if (rsetBeforeQuit != null) props.setProperty(POP3_RESET, rsetBeforeQuit.toString());
424         if (messageClass != null) props.setProperty(POP3_MESSAGE_CLASS, messageClass);
425         if (localaddress != null) props.setProperty(POP3_LOCALADDRESS, localaddress);
426         if (localport != null) props.setProperty(POP3_LOCALPORT, localport.toString());
427         if (apopEnable != null) props.setProperty(POP3_APOP, apopEnable.toString());
428         if (socketFactoryClass != null) props.setProperty(POP3_FACTORY_CLASS, socketFactoryClass);
429         if (socketFactoryFallback != null) props.setProperty(POP3_FACTORY_FALLBACK, socketFactoryFallback.toString());
430         if (socketFactoryPort != null) props.setProperty(POP3_FACTORY_PORT, socketFactoryPort.toString());
431     }
432 
433     public void doStart() throws Exception {
434         log.debug("Started " + getObjectName());
435     }
436 
437     public void doStop() throws Exception {
438         log.debug("Stopped " + getObjectName());
439     }
440 
441     public void doFail() {
442         log.warn("Failed " + getObjectName());
443     }
444 
445     public static final GBeanInfo GBEAN_INFO;
446 
447     static {
448         GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(POP3StoreGBean.class, ProtocolGBean.GBEAN_INFO);
449 
450         infoFactory.addAttribute(GBEAN_PORT, Integer.class, true);
451         infoFactory.addAttribute(GBEAN_CONNECTION_TIMEOUT, Integer.class, true);
452         infoFactory.addAttribute(GBEAN_TIMEOUT, Integer.class, true);
453         infoFactory.addAttribute(GBEAN_RESET, Boolean.class, true);
454         infoFactory.addAttribute(GBEAN_MESSAGE_CLASS, String.class, true);
455         infoFactory.addAttribute(GBEAN_LOCALADDRESS, String.class, true);
456         infoFactory.addAttribute(GBEAN_LOCALPORT, Integer.class, true);
457         infoFactory.addAttribute(GBEAN_APOP, Boolean.class, true);
458         infoFactory.addAttribute(GBEAN_FACTORY_CLASS, String.class, true);
459         infoFactory.addAttribute(GBEAN_FACTORY_FALLBACK, Boolean.class, true);
460         infoFactory.addAttribute(GBEAN_FACTORY_PORT, Integer.class, true);
461 
462         infoFactory.addAttribute(GBEAN_OBJECTNAME, String.class, false);
463         infoFactory.addAttribute(GBEAN_PROTOCOL, String.class, true);
464         infoFactory.addAttribute(GBEAN_PROPERTIES, Properties.class, true);
465         infoFactory.addAttribute(GBEAN_HOST, String.class, true);
466         infoFactory.addAttribute(GBEAN_USER, String.class, true);
467         infoFactory.addOperation(GBEAN_ADD_OVERRIDES, new Class[]{Properties.class});
468 
469         infoFactory.setConstructor(new String[]{GBEAN_OBJECTNAME, GBEAN_PROPERTIES, GBEAN_HOST, GBEAN_USER,
470                                                 GBEAN_PORT,
471                                                 GBEAN_CONNECTION_TIMEOUT,
472                                                 GBEAN_TIMEOUT,
473                                                 GBEAN_RESET,
474                                                 GBEAN_MESSAGE_CLASS,
475                                                 GBEAN_LOCALADDRESS,
476                                                 GBEAN_LOCALPORT,
477                                                 GBEAN_APOP,
478                                                 GBEAN_FACTORY_CLASS,
479                                                 GBEAN_FACTORY_FALLBACK,
480                                                 GBEAN_FACTORY_PORT});
481 
482         GBEAN_INFO = infoFactory.getBeanInfo();
483     }
484 
485     public static GBeanInfo getGBeanInfo() {
486         return GBEAN_INFO;
487     }
488 }