/*
* Copyright 2004,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.bsf.util.event;
import java.util.Hashtable;
import org.apache.bsf.util.event.generator.EventAdapterGenerator;
/**
* The <em>EventAdapterRegistry</em> is the registry of event adapters.
* If a desired adapter is not found, the adapter will be dynamically
* generated when lookup is attempted. Set the <code>dynamic</code> property
* to <code>false</code> to disable this feature.
* <p>
* This implementation first looks for an adapter in its lookup table
* and if it doesn't find one looks for a standard implementation of
* that adapter in the org.apache.bsf.util.event.adapters package with a
* standard naming convention. The naming convention it assumes is the
* following: for event listener type <tt>a.b.c.FooListener</tt>,
* it loads an adapter of type
* <tt>org.apache.bsf.util.event.adapters.a_b_c_FooAdapter</tt>.
* If both the loading and the dynamic generation fail, then a
* <code>null</code> is returned.
* <p>
*
* @author Sanjiva Weerawarana
* @author Matthew J. Duftler
* @see EventAdapter
*/
public class EventAdapterRegistry {
private static Hashtable reg = new Hashtable ();
private static ClassLoader cl = null;
private static String adapterPackage = "org.apache.bsf.util.event.adapters";
private static String adapterSuffix = "Adapter";
private static boolean dynamic = true;
public static Class lookup (Class listenerType) {
String key = listenerType.getName().replace ('.', '_');
Class adapterClass = (Class) reg.get (key);
if (adapterClass == null) {
String en = key.substring (0, key.lastIndexOf ("Listener"));
String cn = adapterPackage + "." + en + adapterSuffix;
try {
// Try to resolve one.
// adapterClass = (cl != null) ? cl.loadClass (cn) : Class.forName (cn);
adapterClass = (cl != null) ? cl.loadClass (cn)
: Thread.currentThread().getContextClassLoader().loadClass (cn); // rgf, 2006-01-05
} catch (ClassNotFoundException e) {
if (dynamic) {
// Unable to resolve one, try to generate one.
adapterClass = // if second argument is set to 'true', then the class file will be stored in the filesystem
EventAdapterGenerator.makeEventAdapterClass (listenerType, false);
}
}
if (adapterClass != null) {
reg.put (key, adapterClass);
}
}
return adapterClass;
}
public static void register (Class listenerType, Class eventAdapterClass) {
String key = listenerType.getName().replace('.', '_');
reg.put (key, eventAdapterClass);
}
/**
* Class loader to use to load event adapter classes.
*/
public static void setClassLoader (ClassLoader cloader) {
cl = cloader;
}
/**
* Indicates whether or not to dynamically generate adapters; default is
* <code>true</code>.
* <p>
* If the <code>dynamic</code> property is set to true, and the
* <code>ClassLoader</code> is unable to resolve an adapter, one will be
* dynamically generated.
*
* @param dynamic whether or not to dynamically generate adapters.
*/
public static void setDynamic (boolean dynamic) {
EventAdapterRegistry.dynamic = dynamic;
}
}