JasperLoaderpublic class JasperLoader extends URLClassLoader Class loader for loading servlet class files (corresponding to JSP files)
and tag handler class files (corresponding to tag files). |
Fields Summary |
---|
private PermissionCollection | permissionCollection | private CodeSource | codeSource | private ClassLoader | parent | private SecurityManager | securityManager | private Map | bytecodes |
Constructors Summary |
---|
public JasperLoader(URL[] urls, ClassLoader parent, PermissionCollection permissionCollection, CodeSource codeSource, Map bytecodes)
super(urls, parent);
this.permissionCollection = permissionCollection;
this.codeSource = codeSource;
this.parent = parent;
this.securityManager = System.getSecurityManager();
this.bytecodes = bytecodes;
|
Methods Summary |
---|
public java.lang.Class | findClass(java.lang.String className)
// If the class file is in memory, use it
byte[] cdata = this.bytecodes.get(className);
String path = className.replace('.", '/") + ".class";
if (cdata == null) {
// If the bytecode preprocessor is not enabled, use super.findClass
// as usual.
if (!PreprocessorUtil.isPreprocessorEnabled()) {
return super.findClass(className);
}
// read class data from file
cdata = loadClassDataFromFile(path);
if (cdata == null) {
throw new ClassNotFoundException(className);
}
}
// Preprocess the loaded byte code
if (PreprocessorUtil.isPreprocessorEnabled()) {
cdata = PreprocessorUtil.processClass(path, cdata);
}
Class clazz = null;
if (securityManager != null) {
ProtectionDomain pd
= new ProtectionDomain(codeSource, permissionCollection);
clazz = defineClass(className, cdata, 0, cdata.length, pd);
} else {
clazz = defineClass(className, cdata, 0, cdata.length);
}
return clazz;
| public final java.security.PermissionCollection | getPermissions(java.security.CodeSource codeSource)Get the Permissions for a CodeSource.
Since this ClassLoader is only used for a JSP page in
a web application context, we just return our preset
PermissionCollection for the web app context.
return permissionCollection;
| public java.lang.Class | loadClass(java.lang.String name)Load the class with the specified name. This method searches for
classes in the same manner as loadClass(String, boolean)
with false as the second argument.
return (loadClass(name, false));
| public java.lang.Class | loadClass(java.lang.String name, boolean resolve)Load the class with the specified name, searching using the following
algorithm until it finds and returns the class. If the class cannot
be found, returns ClassNotFoundException .
- Call
findLoadedClass(String) to check if the
class has already been loaded. If it has, the same
Class object is returned.
- If the
delegate property is set to true ,
call the loadClass() method of the parent class
loader, if any.
- Call
findClass() to find this class in our locally
defined repositories.
- Call the
loadClass() method of our parent
class loader, if any.
If the class was found using the above steps, and the
resolve flag is true , this method will then
call resolveClass(Class) on the resulting Class object.
Class clazz = null;
// (0) Check our previously loaded class cache
clazz = findLoadedClass(name);
if (clazz != null) {
if (resolve)
resolveClass(clazz);
return (clazz);
}
// (.5) Permission to access this class when using a SecurityManager
if (securityManager != null) {
int dot = name.lastIndexOf('.");
if (dot >= 0) {
try {
// Do not call the security manager since by default, we grant that package.
if (!"org.apache.jasper.runtime".equalsIgnoreCase(name.substring(0,dot))){
securityManager.checkPackageAccess(name.substring(0,dot));
}
} catch (SecurityException se) {
String error = "Security Violation, attempt to use " +
"Restricted Class: " + name;
se.printStackTrace();
throw new ClassNotFoundException(error);
}
}
}
if( !name.startsWith(Constants.JSP_PACKAGE_NAME) ) {
// Class is not in org.apache.jsp, therefore, have our
// parent load it
clazz = parent.loadClass(name);
if( resolve )
resolveClass(clazz);
return clazz;
}
return findClass(name);
| private byte[] | loadClassDataFromFile(java.lang.String fileName)
byte[] classBytes = null;
try {
InputStream in = null;
if (SecurityUtil.isPackageProtectionEnabled()){
in = (InputStream)AccessController.doPrivileged(
new PrivilegedAction(){
public Object run(){
return getResourceAsStream(fileName);
}
});
} else {
in = getResourceAsStream(fileName);
}
if (in == null) {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
for (int i = 0; (i = in.read(buf)) != -1; ) {
baos.write(buf, 0, i);
}
in.close();
baos.close();
classBytes = baos.toByteArray();
} catch(Exception ex) {
ex.printStackTrace();
return null;
}
return classBytes;
|
|