001: /*
002: * Copyright 2004,2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.apache.bsf.util.event;
018:
019: import java.util.Hashtable;
020:
021: import org.apache.bsf.util.event.generator.EventAdapterGenerator;
022:
023: /**
024: * The <em>EventAdapterRegistry</em> is the registry of event adapters.
025: * If a desired adapter is not found, the adapter will be dynamically
026: * generated when lookup is attempted. Set the <code>dynamic</code> property
027: * to <code>false</code> to disable this feature.
028: * <p>
029: * This implementation first looks for an adapter in its lookup table
030: * and if it doesn't find one looks for a standard implementation of
031: * that adapter in the org.apache.bsf.util.event.adapters package with a
032: * standard naming convention. The naming convention it assumes is the
033: * following: for event listener type <tt>a.b.c.FooListener</tt>,
034: * it loads an adapter of type
035: * <tt>org.apache.bsf.util.event.adapters.a_b_c_FooAdapter</tt>.
036: * If both the loading and the dynamic generation fail, then a
037: * <code>null</code> is returned.
038: * <p>
039: *
040: * @author Sanjiva Weerawarana
041: * @author Matthew J. Duftler
042: * @see EventAdapter
043: */
044: public class EventAdapterRegistry {
045: private static Hashtable reg = new Hashtable();
046: private static ClassLoader cl = null;
047: private static String adapterPackage = "org.apache.bsf.util.event.adapters";
048: private static String adapterSuffix = "Adapter";
049: private static boolean dynamic = true;
050:
051: public static Class lookup(Class listenerType) {
052: String key = listenerType.getName().replace('.', '_');
053: Class adapterClass = (Class) reg.get(key);
054:
055: if (adapterClass == null) {
056: String en = key.substring(0, key.lastIndexOf("Listener"));
057: String cn = adapterPackage + "." + en + adapterSuffix;
058:
059: try {
060: // Try to resolve one.
061: // adapterClass = (cl != null) ? cl.loadClass (cn) : Class.forName (cn);
062: adapterClass = (cl != null) ? cl.loadClass(cn) : Thread
063: .currentThread().getContextClassLoader()
064: .loadClass(cn); // rgf, 2006-01-05
065:
066: } catch (ClassNotFoundException e) {
067: if (dynamic) {
068: // Unable to resolve one, try to generate one.
069: adapterClass = // if second argument is set to 'true', then the class file will be stored in the filesystem
070: EventAdapterGenerator.makeEventAdapterClass(
071: listenerType, false);
072: }
073: }
074:
075: if (adapterClass != null) {
076: reg.put(key, adapterClass);
077: }
078: }
079:
080: return adapterClass;
081: }
082:
083: public static void register(Class listenerType,
084: Class eventAdapterClass) {
085: String key = listenerType.getName().replace('.', '_');
086: reg.put(key, eventAdapterClass);
087: }
088:
089: /**
090: * Class loader to use to load event adapter classes.
091: */
092: public static void setClassLoader(ClassLoader cloader) {
093: cl = cloader;
094: }
095:
096: /**
097: * Indicates whether or not to dynamically generate adapters; default is
098: * <code>true</code>.
099: * <p>
100: * If the <code>dynamic</code> property is set to true, and the
101: * <code>ClassLoader</code> is unable to resolve an adapter, one will be
102: * dynamically generated.
103: *
104: * @param dynamic whether or not to dynamically generate adapters.
105: */
106: public static void setDynamic(boolean dynamic) {
107: EventAdapterRegistry.dynamic = dynamic;
108: }
109: }
|