KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > tigris > scarab > da > DAFactory


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

48
49 import java.util.HashMap JavaDoc;
50 import java.util.Map JavaDoc;
51
52 import org.apache.commons.lang.exception.NestableError;
53
54 import org.apache.turbine.Turbine;
55
56 /**
57  * A lookup interface for the data access layer classes. Use instead
58  * of Fulcrum for simplicity. Migration to an Avalon-based or other
59  * "standard" API is a longer term possibility.
60  */

61 public class DAFactory
62 {
63     private static Map JavaDoc instances = new HashMap JavaDoc();
64
65     public static AttributeAccess getAttributeAccess()
66     {
67         return (AttributeAccess) lookup("AttributeAccess");
68     }
69
70     /**
71      * Gets a handle to one of our data access classes, in our
72      * configuration prefixed with <code>dataaccess</code> and
73      * sufffixed with <code>classname</code>
74      * (e.g. dataaccess.AttributeAccess.classname =
75      * org.tigris.scarab.da.ScarabAttributeAccess).
76      *
77      * @param identifier Which data access API to get a handle for.
78      * @throws LookupError If a ClassNotFoundException would normally
79      * be thrown.
80      * @throws LinkageError
81      */

82     private static Object JavaDoc lookup(String JavaDoc identifier)
83     {
84         Object JavaDoc da = instances.get(identifier);
85         if (da == null)
86         {
87             // There is an implicit race condition here. Worst case
88
// we create extra instances of our DA impl, and/or more
89
// than one HashMap. In either case, the cost of the
90
// waste is minimal.
91
Map JavaDoc map = new HashMap JavaDoc(instances);
92             String JavaDoc className = Turbine.getConfiguration()
93                 .getString("dataaccess." + identifier + ".classname");
94             try
95             {
96                 da = Class.forName(className).newInstance();
97                 map.put(identifier, da);
98                 instances = map;
99             }
100             catch (Exception JavaDoc e)
101             {
102                 throw new LookupError("Unable to create instantance of class '"
103                                       + className + '\'', e); //EXCEPTION
104
}
105         }
106         return da;
107     }
108
109     private static class LookupError extends NestableError
110     {
111         public LookupError(String JavaDoc msg, Throwable JavaDoc t)
112         {
113             super(msg, t);
114         }
115     }
116 }
117
Popular Tags