bsh.classpath

Class ClassManagerImpl

public class ClassManagerImpl extends BshClassManager

	Manage all classloading in BeanShell.
	Allows classpath extension and class file reloading.

	This class holds the implementation of the BshClassManager so that it
	can be separated from the core package.

	This class currently relies on 1.2 for BshClassLoader and weak references.
	Is there a workaround for weak refs?  If so we could make this work
	with 1.1 by supplying our own classloader code...

	See "http://www.beanshell.org/manual/classloading.html" for details
	on the bsh classloader architecture.

	Bsh has a multi-tiered class loading architecture.  No class loader is
	used unless/until the classpath is modified or a class is reloaded.

	Note: we may need some synchronization in here

	Note on jdk1.2 dependency:

	We are forced to use weak references here to accomodate all of the 
	fleeting namespace listeners.  (NameSpaces must be informed if the class 
	space changes so that they can un-cache names).  I had the interesting 
	thought that a way around this would be to implement BeanShell's own 
	garbage collector...  Then I came to my senses and said - screw it, 
	class re-loading will require 1.2.
	
Constructor Summary
ClassManagerImpl()
Used by BshClassManager singleton constructor
Method Summary
voidaddClassPath(URL path)
voidaddListener(Listener l)
ClassclassForName(String name)
protected voidclassLoaderChanged()
Clear global class cache and notify namespaces to clear their class caches.
voiddoSuperImport()
Support for "import *;" Hide details in here as opposed to NameSpace.
voiddump(PrintWriter i)
ClassLoadergetBaseLoader()
StringgetClassNameByUnqName(String name)
Return the name or null if none is found, Throw an ClassPathException containing detail if name is ambigous.
BshClassPathgetClassPath()
Get the full blown classpath.
URLgetResource(String path)
Get a resource URL using the BeanShell classpath
InputStreamgetResourceAsStream(String path)
Get a resource stream using the BeanShell classpath
protected booleanhasSuperImport()
ClassplainClassForName(String name)
Delegate for bottom level implementation of Class.forName().
voidreloadAllClasses()
Overlay the entire path with a new class loader.
voidreloadClasses(String[] classNames)
Reloading classes means creating a new classloader and using it whenever we are asked for classes in the appropriate space.
voidreloadPackage(String pack)
Reload all classes in the specified package: e.g.
voidremoveListener(Listener l)
voidreset()
Clear all classloading behavior and class caches and reset to initial state.
voidsetClassPath(URL[] cp)
Set a new base classpath and create a new base classloader.

Constructor Detail

ClassManagerImpl

public ClassManagerImpl()
Used by BshClassManager singleton constructor

Method Detail

addClassPath

public void addClassPath(URL path)

addListener

public void addListener(Listener l)

classForName

public Class classForName(String name)

Returns: the class or null

classLoaderChanged

protected void classLoaderChanged()
Clear global class cache and notify namespaces to clear their class caches. The listener list is implemented with weak references so that we will not keep every namespace in existence forever.

doSuperImport

public void doSuperImport()
Support for "import *;" Hide details in here as opposed to NameSpace.

dump

public void dump(PrintWriter i)

getBaseLoader

public ClassLoader getBaseLoader()

getClassNameByUnqName

public String getClassNameByUnqName(String name)
Return the name or null if none is found, Throw an ClassPathException containing detail if name is ambigous.

getClassPath

public BshClassPath getClassPath()
Get the full blown classpath.

getResource

public URL getResource(String path)
Get a resource URL using the BeanShell classpath

Parameters: path should be an absolute path

getResourceAsStream

public InputStream getResourceAsStream(String path)
Get a resource stream using the BeanShell classpath

Parameters: path should be an absolute path

hasSuperImport

protected boolean hasSuperImport()

plainClassForName

public Class plainClassForName(String name)
Delegate for bottom level implementation of Class.forName(). This is here solely to provide for Java version specific features. In this case - the Thread getContextClassLoader() which is required to get bsh to see user classpath when it's installed in a web application or in the jre/lib/ext directory.

See Also: BshClassManager.plainClassForName()

reloadAllClasses

public void reloadAllClasses()
Overlay the entire path with a new class loader. Set the base path to the user path + base path. No point in including the boot class path (can't reload thos).

reloadClasses

public void reloadClasses(String[] classNames)
Reloading classes means creating a new classloader and using it whenever we are asked for classes in the appropriate space. For this we use a DiscreteFilesClassLoader

reloadPackage

public void reloadPackage(String pack)
Reload all classes in the specified package: e.g. "com.sun.tools" The special package name "" can be used to refer to unpackaged classes.

removeListener

public void removeListener(Listener l)

reset

public void reset()
Clear all classloading behavior and class caches and reset to initial state.

setClassPath

public void setClassPath(URL[] cp)
Set a new base classpath and create a new base classloader. This means all types change.
B) 2000 pat@pat.net :-)