KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > Yasna > forum > database > DataSourceConnectionProvider


1 /**
2  * Copyright (C) 2001 Yasna.com. All rights reserved.
3  *
4  * ===================================================================
5  * The Apache Software License, Version 1.1
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in
16  * the documentation and/or other materials provided with the
17  * distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  * if any, must include the following acknowledgment:
21  * "This product includes software developed by
22  * Yasna.com (http://www.yasna.com)."
23  * Alternately, this acknowledgment may appear in the software itself,
24  * if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Yazd" and "Yasna.com" must not be used to
27  * endorse or promote products derived from this software without
28  * prior written permission. For written permission, please
29  * contact yazd@yasna.com.
30  *
31  * 5. Products derived from this software may not be called "Yazd",
32  * nor may "Yazd" appear in their name, without prior written
33  * permission of Yasna.com.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED. IN NO EVENT SHALL YASNA.COM OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of Yasna.com. For more information
51  * on Yasna.com, please see <http://www.yasna.com>.
52  */

53
54 /**
55  * Copyright (C) 2000 CoolServlets.com. All rights reserved.
56  *
57  * ===================================================================
58  * The Apache Software License, Version 1.1
59  *
60  * Redistribution and use in source and binary forms, with or without
61  * modification, are permitted provided that the following conditions
62  * are met:
63  *
64  * 1. Redistributions of source code must retain the above copyright
65  * notice, this list of conditions and the following disclaimer.
66  *
67  * 2. Redistributions in binary form must reproduce the above copyright
68  * notice, this list of conditions and the following disclaimer in
69  * the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3. The end-user documentation included with the redistribution,
73  * if any, must include the following acknowledgment:
74  * "This product includes software developed by
75  * CoolServlets.com (http://www.coolservlets.com)."
76  * Alternately, this acknowledgment may appear in the software itself,
77  * if and wherever such third-party acknowledgments normally appear.
78  *
79  * 4. The names "Jive" and "CoolServlets.com" must not be used to
80  * endorse or promote products derived from this software without
81  * prior written permission. For written permission, please
82  * contact webmaster@coolservlets.com.
83  *
84  * 5. Products derived from this software may not be called "Jive",
85  * nor may "Jive" appear in their name, without prior written
86  * permission of CoolServlets.com.
87  *
88  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
89  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
90  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
91  * DISCLAIMED. IN NO EVENT SHALL COOLSERVLETS.COM OR
92  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
93  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
94  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
95  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
96  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
97  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
98  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
99  * SUCH DAMAGE.
100  * ====================================================================
101  *
102  * This software consists of voluntary contributions made by many
103  * individuals on behalf of CoolServlets.com. For more information
104  * on CoolServlets.com, please see <http://www.coolservlets.com>.
105  */

106
107 package com.Yasna.forum.database;
108
109 import java.sql.Connection JavaDoc;
110 import java.sql.SQLException JavaDoc;
111 import javax.sql.DataSource JavaDoc;
112 import java.util.Properties JavaDoc;
113 import java.util.Enumeration JavaDoc;
114 import javax.naming.Context JavaDoc;
115 import javax.naming.InitialContext JavaDoc;
116 import javax.naming.NamingException JavaDoc;
117 import com.Yasna.forum.PropertyManager;
118
119 /**
120  * An implementation of DbConnectionProvider that utilizes a JDBC 2.0 DataSource
121  * made available via JNDI. This is useful for application servers where a pooled
122  * data connection is already provided so Yazd can share the pool with the
123  * other applications.<p>
124  *
125  * The JNDI location of the DataSource is retrieved from the
126  * {@link com.Yasna.forum.PropertyManager} as the
127  * <code>JNDIDataSource.name</code> property. This can be overiden by setting
128  * the provider's <code>name</code> property if required.
129  *
130  * @author <a HREF="mailto:joe@truemesh.com">Joe Walnes</a>
131  *
132  * @see com.Yasna.forum.database.DbConnectionProvider
133  */

134 public class DataSourceConnectionProvider extends DbConnectionProvider {
135
136     private static final String JavaDoc NAME = "JNDI DataSource Connection Provider";
137     private static final String JavaDoc DESCRIPTION =
138         "Connection Provider for Yazd to lookup pooled "
139         + "DataSource from JNDI location. Requires 'name' "
140         + "property with JNDI location. This can be set in "
141         + "the properties file as 'JNDIDataSource.name'";
142     private static final String JavaDoc AUTHOR = "Joe Walnes - joe@truemesh.com";
143     private static final int MAJOR_VERSION = 1;
144     private static final int MINOR_VERSION = 0;
145     private static final boolean POOLED = true;
146
147     private Properties JavaDoc properties;
148     private DataSource JavaDoc dataSource;
149
150     private static final boolean DEBUG = false;
151
152     /**
153      * Keys of JNDI properties to query PropertyManager for.
154      */

155     private static final String JavaDoc[] jndiPropertyKeys = {
156         Context.APPLET ,
157         Context.AUTHORITATIVE ,
158         Context.BATCHSIZE ,
159         Context.DNS_URL ,
160         Context.INITIAL_CONTEXT_FACTORY ,
161         Context.LANGUAGE ,
162         Context.OBJECT_FACTORIES ,
163         Context.PROVIDER_URL ,
164         Context.REFERRAL ,
165         Context.SECURITY_AUTHENTICATION ,
166         Context.SECURITY_CREDENTIALS ,
167         Context.SECURITY_PRINCIPAL ,
168         Context.SECURITY_PROTOCOL ,
169         Context.STATE_FACTORIES ,
170         Context.URL_PKG_PREFIXES
171     };
172
173     /**
174      * Initialize.
175      */

176     public DataSourceConnectionProvider() {
177         debug("constructor()");
178         properties = new Properties JavaDoc();
179         setProperty("name",PropertyManager.getProperty("JNDIDataSource.name"));
180     }
181
182     /**
183      * Lookup DataSource from JNDI context.
184     */

185     protected void start() {
186         debug("start()");
187         String JavaDoc name = getProperty("name");
188         if (name==null || name.length()==0) {
189             error("No name specified for DataSource JNDI lookup - 'name' " +
190             "Property should be set.", null);
191             return;
192         }
193         try {
194             Properties JavaDoc contextProperties = new Properties JavaDoc();
195             for (int i=0; i<jndiPropertyKeys.length; i++) {
196                 String JavaDoc k = jndiPropertyKeys[i];
197                 String JavaDoc v = PropertyManager.getProperty(k);
198                 if (v != null) {
199                     contextProperties.setProperty(k,v);
200                 }
201             }
202             Context JavaDoc context = new InitialContext JavaDoc(contextProperties);
203             dataSource = (DataSource JavaDoc) context.lookup( name );
204         }
205         catch (Exception JavaDoc e) {
206             error("Could not lookup DataSource at '" + name + "'",e);
207         }
208     }
209
210     /**
211      * Destroy then start.
212      */

213     protected void restart() {
214         debug("restart()");
215         destroy();
216         start();
217     }
218
219     /**
220      * Save properties.
221      */

222     protected void destroy() {
223         debug("destroy()");
224         String JavaDoc name = getProperty("name");
225         if (name!=null && name.length()>0) {
226             PropertyManager.setProperty("JNDIDataSource.name", name);
227         }
228     }
229
230     /**
231      * Get new Connection from DataSource.
232      */

233     public Connection JavaDoc getConnection() {
234         debug("getConnection()");
235         if (dataSource==null) {
236             error("DataSource has not yet been looked up",null);
237             return null;
238         }
239         try {
240             return dataSource.getConnection();
241         }
242         catch (SQLException JavaDoc e) {
243             error("Could not retrieve Connection from DataSource",e);
244             return null;
245         }
246     }
247
248     public String JavaDoc getProperty(String JavaDoc name) {
249         debug("getProperty('"+name+"+')");
250         return properties.getProperty(name);
251     }
252
253     public void setProperty(String JavaDoc name, String JavaDoc value) {
254         debug("setProperty('"+name+"+','"+value+"')");
255         properties.setProperty(name,value);
256     }
257
258     public Enumeration JavaDoc propertyNames() {
259         debug("propertyNames()");
260         return properties.propertyNames();
261     }
262
263     public String JavaDoc getPropertyDescription(String JavaDoc name) {
264         debug("getPropertyDescription('"+name+"')");
265         if (name.equals("name")) {
266             return "JNDI name to lookup. eg: java:comp/env/jdbc/MyDataSource";
267         }
268         else {
269             return null;
270         }
271     }
272
273    /**
274     * Log an error.
275     *
276     * @param msg Description of error
277     * @param e Exception to printStackTrace (may be null)
278     */

279     private final void error(String JavaDoc msg, Exception JavaDoc e) {
280         System.err.println("Error: "+msg);
281         if (e!=null) {
282             e.printStackTrace();
283         }
284     }
285
286     /**
287      * Display messages for debugging
288      */

289     private final void debug(String JavaDoc msg) {
290         if (DEBUG) {
291             System.err.println("DEBUG: "+msg);
292         }
293     }
294 }
295
Popular Tags