1 /*
2 * Copyright 2000-2004 The Apache Software Foundation.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.apache.commons.scaffold.http;
18
19 import java.io.IOException;
20
21 import javax.servlet.ServletException;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.apache.commons.scaffold.sql.ConnectionAdaptor;
26 import org.apache.commons.scaffold.sql.ServletAdaptor;
27
28
29 /**
30 * Initialize a <code>ConnectionAdaptor</code> for this application.
31 * <p>
32 * The servlet itself is <b>not</b> involved in managing the connection.
33 * The ConnectionAdaptor is a standalone object.
34 * This servlet simply provides a means to initialize and load a
35 * ConnectionAdaptor for use by your application.
36 * <p>
37 * This servlet can be configured to use an alternate adaptor or
38 * adaptor key using initialization parameters:
39 * <p>
40 * <b>adaptor</b> The default adaptor is
41 * <code>org.apache.scaffold.sql.ConnectionAdaptor</code>.
42 * Any sublcass of ConnectionAdaptor can be specified instead.
43 * <p>
44 * <b>adaptor.key</b> The default adaptor key is <code>DATA_SOURCE</code>.
45 * Another key can be specified instead. This is the attribute to use
46 * when looking up the datasource in JNDI, the servlet context, or
47 * whatever.
48 * <p>
49 * To use the Struts generic connection pool, specify the adaptor as
50 * <code>org.apache.scaffold.sql.ServletAdaptor</code> and the
51 * adaptor.key as <code>org.apache.struts.action.DATA_SOURCE</code>
52 * <p>
53 * To use the Resin connection pool, specify the <b>res-ref-name</b>
54 * in the Resin conf as the <b>adaptor.key</b>.
55 * <p>
56 * To use Poolman without JNDI, use the Poolman adaptor in the
57 * sql package, and specify the dbName from the poolman.xml as the
58 * <b>adaptor.key</b>
59 *
60 * @see org.apache.scaffold.sql.ConnectionAdaptor
61 * @see org.apache.scaffold.sql.Servletdaptor
62 * @see org.apache.scaffold.sql.PoolmanAdaptor
63 *
64 * @author Ted Husted
65 * @author Steve Raeburn
66 *
67 */
68 public class ConnectionServlet extends ResourceServlet {
69
70 // ------------------------------------------------------- Class variables
71
72 /**
73 * Commons logging instance
74 */
75 private static Log log = LogFactory.getLog(ResourceServlet.class);
76
77
78 /**
79 * Default parameter for setting a custom adaptor type
80 * in the servlet configuration.
81 */
82 private static String ADAPTOR_PARAMETER = "adaptor";
83
84
85 /**
86 * Default type to use if parameter not set
87 * ["org.apache.scaffold.sql.ConnectionAdaptor"].
88 */
89 private static String ADAPTOR_DEFAULT =
90 "org.apache.commons.scaffold.sql.ConnectionAdaptor";
91
92
93 /**
94 * Default parameter for setting the default attribute
95 * name, or key, used to retrieve the datasource.
96 * <p>
97 * For the Struts generic connection pool, you would set
98 * this to "org.apache.struts.action.DATA_SOURCE"
99 * [Action.DATA_SOURCE_KEY].
100 */
101 private static String ADAPTOR_KEY = "adaptor.key";
102
103
104 /**
105 * Field to hold our instance of the connection adaptor.
106 * Can be initialized to another ConnectionAdaptor at startup.
107 */
108 private static ConnectionAdaptor adaptor;
109
110
111 // ------------------------------------------------------ Logging Messages
112
113
114 /**
115 * Message for verbose logging.
116 */
117 private static String ADAPTOR_LOADING_EVENT =
118 "Loading ConnectionAdaptor";
119
120
121 /**
122 * Message to log if connector initialization fails.
123 */
124 private static String ADAPTOR_FAILED_EVENT =
125 "*** ConnectionAdaptor failed to load: ";
126
127
128 // -----------------------------------------------------------------------
129
130 /**
131 * Initialize the ConnectionAdaptor for this application.
132 * <p>
133 * An alternate ConnectionAdaptor can be specified in the servlet config
134 * by specifying the class type as the <b>adaptor</b> initialization
135 * parameter.
136 *
137 * @exception IOException if an input/output error is encountered
138 * @exception ServletException if we cannot initialize these resources
139 */
140 protected void initDefault() throws IOException, ServletException {
141
142 super.initDefault();
143 if (log.isDebugEnabled()) {
144 log(ADAPTOR_LOADING_EVENT);
145 }
146
147 // Check for an adaptor parameter
148 String adaptorClass =
149 getInitString(ADAPTOR_PARAMETER,ADAPTOR_DEFAULT);
150
151 // Create the default or custom adaptor
152 try {
153 adaptor = (ConnectionAdaptor)
154 Class.forName(adaptorClass).newInstance();
155 }
156
157 catch (Throwable t) {
158 log.error(ADAPTOR_FAILED_EVENT,t);
159 t.printStackTrace();
160 throw new ServletException(t);
161 }
162
163 // Check for an adaptor key
164 String key = getInitString(ADAPTOR_KEY,null);
165 if (null!=key) adaptor.setKey(key);
166
167 // ** kludge alert **
168 // If its a servlet adaptor, give it a servlet reference
169 if (adaptor instanceof ServletAdaptor) {
170 // Give adaptor access to servlet context.
171 ServletAdaptor s = (ServletAdaptor) adaptor;
172 s.setServlet(this);
173 }
174 }
175
176 } // end ConnectionServlet