View Javadoc

1   package org.apache.torque.avalon;
2   
3   /* ====================================================================
4    * The Apache Software License, Version 1.1
5    *
6    * Copyright (c) 2003 The Apache Software Foundation.  All rights
7    * reserved.
8    *
9    * Redistribution and use in source and binary forms, with or without
10   * modification, are permitted provided that the following conditions
11   * are met:
12   *
13   * 1. Redistributions of source code must retain the above copyright
14   *    notice, this list of conditions and the following disclaimer.
15   *
16   * 2. Redistributions in binary form must reproduce the above copyright
17   *    notice, this list of conditions and the following disclaimer in
18   *    the documentation and/or other materials provided with the
19   *    distribution.
20   *
21   * 3. The end-user documentation included with the redistribution,
22   *    if any, must include the following acknowledgment:
23   *       "This product includes software developed by the
24   *        Apache Software Foundation (http://www.apache.org/)."
25   *    Alternately, this acknowledgment may appear in the software itself,
26   *    if and wherever such third-party acknowledgments normally appear.
27   *
28   * 4. The names "Apache" and "Apache Software Foundation" and
29   *    "Apache Turbine" must not be used to endorse or promote products
30   *    derived from this software without prior written permission. For
31   *    written permission, please contact apache@apache.org.
32   *
33   * 5. Products derived from this software may not be called "Apache",
34   *    "Apache Turbine", nor may "Apache" appear in their name, without
35   *    prior written permission of the Apache Software Foundation.
36   *
37   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48   * SUCH DAMAGE.
49   * ====================================================================
50   *
51   * This software consists of voluntary contributions made by many
52   * individuals on behalf of the Apache Software Foundation.  For more
53   * information on the Apache Software Foundation, please see
54   * <http://www.apache.org/>.
55   */
56  
57  import java.sql.Connection;
58  
59  import org.apache.avalon.framework.activity.Initializable;
60  import org.apache.avalon.framework.activity.Startable;
61  import org.apache.avalon.framework.component.Component;
62  import org.apache.avalon.framework.configuration.Configurable;
63  import org.apache.avalon.framework.configuration.Configuration;
64  import org.apache.avalon.framework.configuration.ConfigurationException;
65  import org.apache.avalon.framework.context.Context;
66  import org.apache.avalon.framework.context.ContextException;
67  import org.apache.avalon.framework.context.Contextualizable;
68  import org.apache.avalon.framework.logger.AbstractLogEnabled;
69  import org.apache.avalon.framework.thread.ThreadSafe;
70  
71  import org.apache.commons.lang.StringUtils;
72  
73  import org.apache.torque.TorqueException;
74  import org.apache.torque.TorqueInstance;
75  import org.apache.torque.adapter.DB;
76  import org.apache.torque.manager.AbstractBaseManager;
77  import org.apache.torque.map.DatabaseMap;
78  
79  /***
80   * Avalon component for Torque.
81   *
82   * @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a>
83   * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
84   * @version $Id: TorqueComponent.java,v 1.7 2003/07/24 10:31:27 henning Exp $
85   */
86  public class TorqueComponent
87          extends AbstractLogEnabled
88          implements Component,
89                     Configurable,
90                     Initializable,
91                     Contextualizable,
92                     Startable,
93                     ThreadSafe
94  {
95      /*** The Avalon Context */
96      private Context context = null;
97  
98      /*** The instance of Torque used by this component. */
99      private TorqueInstance torqueInstance = null;
100 
101     /*** The configuration file for Torque. */
102     private String configFile = null;
103 
104 
105     /***
106      * Creates a new instance.  Default constructor used by Avalon.
107      */
108     public TorqueComponent()
109     {
110         // If we simply do a "new TorqueInstance()" here, we will get
111         // into trouble when some internal classes (e.g. the DatasSource Factory)
112         // simply calls Torque.<xxx> and gets a different TorqueInstance
113         // than the one we configured here. Make sure that we use the
114         // same object as the Facade class does.
115         this.torqueInstance = org.apache.torque.Torque.getInstance();
116     }
117 
118     /***
119      * Creates a new instance.
120      *
121      * @param torqueInstance The instance of the Torque core used by
122      * this component.
123      */
124     protected TorqueComponent(TorqueInstance torqueInstance)
125     {
126         this.torqueInstance = torqueInstance;
127     }
128 
129     /***
130      * @return A reference to our instance of the Torque core.
131      */
132     private TorqueInstance getTorque()
133     {
134         return torqueInstance;
135     }
136 
137     /*
138      * ========================================================================
139      *
140      * Avalon Component Interfaces
141      *
142      * ========================================================================
143      */
144 
145     /***
146      * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
147      */
148     public void configure(Configuration configuration)
149             throws ConfigurationException
150     {
151         getLogger().debug("configure(" + configuration + ")");
152 
153         String configFile = configuration.getChild("configfile").getValue();
154         String appRoot = null;
155 
156         try
157         {
158             appRoot = (context == null) 
159                     ? null : (String) context.get("componentAppRoot");
160         }
161         catch (ContextException ce)
162         {
163             getLogger().error("Could not load Application Root from Context");
164         }
165 
166         if (StringUtils.isNotEmpty(appRoot))
167         {
168             if (appRoot.endsWith("/"))
169             {
170                 appRoot = appRoot.substring(0, appRoot.length() - 1);
171                 getLogger().debug("Application Root changed to " + appRoot);
172             }
173 
174             if (configFile.startsWith("/"))
175             {
176                 configFile = configFile.substring(1);
177                 getLogger().debug("Config File changes to " + configFile);
178             }
179             
180             StringBuffer sb = new StringBuffer();
181             sb.append(appRoot);
182             sb.append('/');
183             sb.append(configFile);
184             
185             configFile = sb.toString();
186         }
187 
188         getLogger().debug("Config File is " + configFile);
189 
190         this.configFile = configFile;
191     }
192 
193     /***
194      * @see org.apache.avalon.framework.context.Contextualizable
195      */
196     public void contextualize(Context context)
197             throws ContextException
198     {
199         this.context = context;
200     }
201 
202     /***
203      * @see org.apache.avalon.framework.activity.Initializable#initialize()
204      */
205     public void initialize()
206             throws Exception
207     {
208         getLogger().debug("initialize()");
209         getTorque().init(configFile);
210     }
211 
212     /***
213      * @see org.apache.avalon.framework.activity.Startable#start()
214      */
215     public void start()
216     {
217         getLogger().debug("start()");
218     }
219 
220     /***
221      * @see org.apache.avalon.framework.activity.Startable#stop()
222      */
223     public void stop()
224     {
225         getLogger().debug("stop()");
226         getTorque().shutdown();
227     }
228 
229 
230     /*
231      * ========================================================================
232      *
233      * Torque Methods, accessible from the Component
234      *
235      * ========================================================================
236      */
237 
238     /***
239      * Determine whether Torque has already been initialized.
240      *
241      * @return true if Torque is already initialized
242      */
243     public boolean isInit()
244     {
245         return getTorque().isInit();
246     }
247 
248     /***
249      * Get the configuration for this component.
250      *
251      * @return the Configuration
252      */
253     public org.apache.commons.configuration.Configuration getConfiguration()
254     {
255         return getTorque().getConfiguration();
256     }
257 
258     /***
259      * This method returns a Manager for the given name.
260      *
261      * @param name name of the manager
262      * @return a Manager
263      */
264     public AbstractBaseManager getManager(String name)
265     {
266         return getTorque().getManager(name);
267     }
268 
269     /***
270      * This methods returns either the Manager from the configuration file,
271      * or the default one provided by the generated code.
272      *
273      * @param name name of the manager
274      * @param defaultClassName the class to use if name has not been configured
275      * @return a Manager
276      */
277     public AbstractBaseManager getManager(String name,
278             String defaultClassName)
279     {
280         return getTorque().getManager(name, defaultClassName);
281     }
282 
283     /***
284      * Returns the default database map information.
285      *
286      * @return A DatabaseMap.
287      * @throws TorqueException Any exceptions caught during processing will be
288      *         rethrown wrapped into a TorqueException.
289      */
290     public DatabaseMap getDatabaseMap()
291             throws TorqueException
292     {
293         return getTorque().getDatabaseMap();
294     }
295 
296     /***
297      * Returns the database map information. Name relates to the name
298      * of the connection pool to associate with the map.
299      *
300      * @param name The name of the database corresponding to the
301      *        <code>DatabaseMap</code> to retrieve.
302      * @return The named <code>DatabaseMap</code>.
303      * @throws TorqueException Any exceptions caught during processing will be
304      *         rethrown wrapped into a TorqueException.
305      */
306     public DatabaseMap getDatabaseMap(String name)
307             throws TorqueException
308     {
309         return getTorque().getDatabaseMap(name);
310     }
311 
312     /***
313      * Register a MapBuilder
314      *
315      * @param className the MapBuilder
316      */
317     public void registerMapBuilder(String className)
318     {
319         getTorque().registerMapBuilder(className);
320     }
321 
322     /***
323      * This method returns a Connection from the default pool.
324      *
325      * @return The requested connection.
326      * @throws TorqueException Any exceptions caught during processing will be
327      *         rethrown wrapped into a TorqueException.
328      */
329     public Connection getConnection()
330             throws TorqueException
331     {
332         return getTorque().getConnection();
333     }
334 
335     /***
336      *
337      * @param name The database name.
338      * @return a database connection
339      * @throws TorqueException Any exceptions caught during processing will be
340      *         rethrown wrapped into a TorqueException.
341      */
342     public Connection getConnection(String name)
343             throws TorqueException
344     {
345         return getTorque().getConnection(name);
346     }
347 
348     /***
349      * This method returns a Connecton using the given parameters.
350      * You should only use this method if you need user based access to the
351      * database!
352      *
353      * @param name The database name.
354      * @param username The name of the database user.
355      * @param password The password of the database user.
356      * @return A Connection.
357      * @throws TorqueException Any exceptions caught during processing will be
358      *         rethrown wrapped into a TorqueException.
359      */
360     public Connection getConnection(String name, String username,
361             String password)
362             throws TorqueException
363     {
364         return getTorque().getConnection(name, username, password);
365     }
366     /***
367      * Returns database adapter for a specific connection pool.
368      *
369      * @param name A pool name.
370      * @return The corresponding database adapter.
371      * @throws TorqueException Any exceptions caught during processing will be
372      *         rethrown wrapped into a TorqueException.
373      */
374     public DB getDB(String name)
375             throws TorqueException
376     {
377         return getTorque().getDB(name);
378     }
379 
380     /***
381      * Returns the name of the default database.
382      *
383      * @return name of the default DB
384      */
385     public String getDefaultDB()
386     {
387         return getTorque().getDefaultDB();
388     }
389 
390     /***
391      * Closes a connection.
392      *
393      * @param con A Connection to close.
394      */
395     public void closeConnection(Connection con)
396     {
397         getTorque().closeConnection(con);
398     }
399 }