KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > naming > factory > MailSessionFactory


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You 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 implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17
18 package org.apache.naming.factory;
19
20 import java.security.AccessController JavaDoc;
21 import java.security.PrivilegedAction JavaDoc;
22 import java.util.Enumeration JavaDoc;
23 import java.util.Hashtable JavaDoc;
24 import java.util.Properties JavaDoc;
25 import javax.mail.Authenticator JavaDoc;
26 import javax.mail.PasswordAuthentication JavaDoc;
27 import javax.mail.Session JavaDoc;
28 import javax.naming.Name JavaDoc;
29 import javax.naming.Context JavaDoc;
30 import javax.naming.RefAddr JavaDoc;
31 import javax.naming.Reference JavaDoc;
32 import javax.naming.spi.ObjectFactory JavaDoc;
33
34 /**
35  * <p>Factory class that creates a JNDI named JavaMail Session factory,
36  * which can be used for managing inbound and outbound electronic mail
37  * messages via JavaMail APIs. All messaging environment properties
38  * described in the JavaMail Specification may be passed to the Session
39  * factory; however the following properties are the most commonly used:</p>
40  * <ul>
41  * <li>
42  * <li><strong>mail.smtp.host</strong> - Hostname for outbound transport
43  * connections. Defaults to <code>localhost</code> if not specified.</li>
44  * </ul>
45  *
46  * <p>This factory can be configured in a <code>&lt;DefaultContext&gt;</code>
47  * or <code>&lt;Context&gt;</code> element in your <code>conf/server.xml</code>
48  * configuration file. An example of factory configuration is:</p>
49  * <pre>
50  * &lt;Resource name="mail/smtp" auth="CONTAINER"
51  * type="javax.mail.Session"/&gt;
52  * &lt;ResourceParams name="mail/smtp"&gt;
53  * &lt;parameter&gt;
54  * &lt;name&gt;factory&lt;/name&gt;
55  * &lt;value&gt;org.apache.naming.factory.MailSessionFactory&lt;/value&gt;
56  * &lt;/parameter&gt;
57  * &lt;parameter&gt;
58  * &lt;name&gt;mail.smtp.host&lt;/name&gt;
59  * &lt;value&gt;mail.mycompany.com&lt;/value&gt;
60  * &lt;/parameter&gt;
61  * &lt;/ResourceParams&gt;
62  * </pre>
63  *
64  * @author Craig R. McClanahan
65  * @version $Revision: 467222 $ $Date: 2006-10-24 05:17:11 +0200 (mar., 24 oct. 2006) $
66  */

67
68 public class MailSessionFactory implements ObjectFactory JavaDoc {
69
70
71     /**
72      * The Java type for which this factory knows how to create objects.
73      */

74     protected static final String JavaDoc factoryType = "javax.mail.Session";
75
76
77     /**
78      * Create and return an object instance based on the specified
79      * characteristics.
80      *
81      * @param refObj Reference information containing our parameters, or null
82      * if there are no parameters
83      * @param name The name of this object, relative to context, or null
84      * if there is no name
85      * @param context The context to which name is relative, or null if name
86      * is relative to the default initial context
87      * @param env Environment variables, or null if there are none
88      *
89      * @exception Exception if an error occurs during object creation
90      */

91     public Object JavaDoc getObjectInstance(Object JavaDoc refObj, Name JavaDoc name, Context JavaDoc context,
92                     Hashtable JavaDoc env) throws Exception JavaDoc
93     {
94
95         // Return null if we cannot create an object of the requested type
96
final Reference JavaDoc ref = (Reference JavaDoc) refObj;
97         if (!ref.getClassName().equals(factoryType))
98             return (null);
99
100         // Create a new Session inside a doPrivileged block, so that JavaMail
101
// can read its default properties without throwing Security
102
// exceptions.
103
//
104
// Bugzilla 31288, 33077: add support for authentication.
105
return AccessController.doPrivileged( new PrivilegedAction JavaDoc() {
106         public Object JavaDoc run() {
107
108                     // Create the JavaMail properties we will use
109
Properties JavaDoc props = new Properties JavaDoc();
110                     props.put("mail.transport.protocol", "smtp");
111                     props.put("mail.smtp.host", "localhost");
112
113                     String JavaDoc password = null;
114
115                     Enumeration JavaDoc attrs = ref.getAll();
116                     while (attrs.hasMoreElements()) {
117                         RefAddr JavaDoc attr = (RefAddr JavaDoc) attrs.nextElement();
118                         if ("factory".equals(attr.getType())) {
119                             continue;
120                         }
121
122                         if ("password".equals(attr.getType())) {
123                             password = (String JavaDoc) attr.getContent();
124                             continue;
125                         }
126
127                         props.put(attr.getType(), (String JavaDoc) attr.getContent());
128                     }
129
130                     Authenticator JavaDoc auth = null;
131                     if (password != null) {
132                         String JavaDoc user = props.getProperty("mail.smtp.user");
133                         if(user == null) {
134                             user = props.getProperty("mail.user");
135                         }
136                         
137                         if(user != null) {
138                             final PasswordAuthentication JavaDoc pa = new PasswordAuthentication JavaDoc(user, password);
139                             auth = new Authenticator JavaDoc() {
140                                     protected PasswordAuthentication JavaDoc getPasswordAuthentication() {
141                                         return pa;
142                                     }
143                                 };
144                         }
145                     }
146
147                     // Create and return the new Session object
148
Session JavaDoc session = Session.getInstance(props, auth);
149                     return (session);
150
151         }
152         } );
153
154     }
155
156
157 }
158
Popular Tags