KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bsf > util > event > EventAdapterRegistry


1 /*
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2002 The Apache Software Foundation. All rights
5  * reserved.
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, if
20  * any, must include the following acknowlegement:
21  * "This product includes software developed by the
22  * Apache Software Foundation (http://www.apache.org/)."
23  * Alternately, this acknowlegement may appear in the software itself,
24  * if and wherever such third-party acknowlegements normally appear.
25  *
26  * 4. The names "Apache BSF", "Apache", and "Apache Software Foundation"
27  * must not be used to endorse or promote products derived from
28  * this software without prior written permission. For written
29  * permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache"
32  * nor may "Apache" appear in their names without prior written
33  * permission of the Apache Group.
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 THE APACHE SOFTWARE FOUNDATION 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 individuals
50  * on behalf of the Apache Software Foundation and was originally created by
51  * Sanjiva Weerawarana and others at International Business Machines
52  * Corporation. For more information on the Apache Software Foundation,
53  * please see <http://www.apache.org/>.
54  */

55
56 package org.apache.bsf.util.event;
57
58 import java.util.Hashtable JavaDoc;
59 import org.apache.bsf.util.event.generator.EventAdapterGenerator;
60
61 /**
62  * The <em>EventAdapterRegistry</em> is the registry of event adapters.
63  * If a desired adapter is not found, the adapter will be dynamically
64  * generated when lookup is attempted. Set the <code>dynamic</code> property
65  * to <code>false</code> to disable this feature.
66  * <p>
67  * This implementation first looks for an adapter in its lookup table
68  * and if it doesn't find one looks for a standard implementation of
69  * that adapter in the org.apache.bsf.util.event.adapters package with a
70  * standard naming convention. The naming convention it assumes is the
71  * following: for event listener type <tt>a.b.c.FooListener</tt>,
72  * it loads an adapter of type
73  * <tt>org.apache.bsf.util.event.adapters.a_b_c_FooAdapter</tt>.
74  * If both the loading and the dynamic generation fail, then a
75  * <code>null</code> is returned.
76  * <p>
77  *
78  * @author Sanjiva Weerawarana
79  * @author Matthew J. Duftler
80  * @see EventAdapter
81  */

82 public class EventAdapterRegistry {
83   private static Hashtable JavaDoc reg = new Hashtable JavaDoc ();
84   private static ClassLoader JavaDoc cl = null;
85   private static String JavaDoc adapterPackage = "org.apache.bsf.util.event.adapters";
86   private static String JavaDoc adapterSuffix = "Adapter";
87   private static boolean dynamic = true;
88
89   public static Class JavaDoc lookup (Class JavaDoc listenerType) {
90     String JavaDoc key = listenerType.getName().replace ('.', '_');
91     Class JavaDoc adapterClass = (Class JavaDoc) reg.get (key);
92     
93     if (adapterClass == null) {
94       String JavaDoc en = key.substring (0, key.lastIndexOf ("Listener"));
95       String JavaDoc cn = adapterPackage + "." + en + adapterSuffix;
96
97       try {
98         // Try to resolve one.
99
adapterClass = (cl != null) ? cl.loadClass (cn) : Class.forName (cn);
100       } catch (ClassNotFoundException JavaDoc e) {
101         if (dynamic) {
102           // Unable to resolve one, try to generate one.
103
adapterClass =
104             EventAdapterGenerator.makeEventAdapterClass (listenerType, false);
105         }
106       }
107
108       if (adapterClass != null) {
109         reg.put (key, adapterClass);
110       }
111     }
112
113     return adapterClass;
114   }
115   public static void register (Class JavaDoc listenerType, Class JavaDoc eventAdapterClass) {
116     String JavaDoc key = listenerType.getName().replace('.', '_');
117     reg.put (key, eventAdapterClass);
118   }
119   /**
120    * Class loader to use to load event adapter classes.
121    */

122   public static void setClassLoader (ClassLoader JavaDoc cloader) {
123     cl = cloader;
124   }
125   /**
126    * Indicates whether or not to dynamically generate adapters; default is
127    * <code>true</code>.
128    * <p>
129    * If the <code>dynamic</code> property is set to true, and the
130    * <code>ClassLoader</code> is unable to resolve an adapter, one will be
131    * dynamically generated.
132    *
133    * @param dynamic whether or not to dynamically generate adapters.
134    */

135   public static void setDynamic (boolean dynamic) {
136     EventAdapterRegistry.dynamic = dynamic;
137   }
138 }
139
Popular Tags