billbarker 01/11/20 19:02:27
Modified: src/share/org/apache/tomcat/util/depend
DependClassLoader12.java
Log:
Teaches the DependClassLoader how to define packages for Java2
Fix for bug #4948
Reported By: Joel Bartley [EMAIL PROTECTED]
Submitted By: Joel Bartley [EMAIL PROTECTED]
Revision Changes Path
1.5 +52 -1
jakarta-tomcat/src/share/org/apache/tomcat/util/depend/DependClassLoader12.java
Index: DependClassLoader12.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/depend/DependClassLoader12.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DependClassLoader12.java 2001/09/29 04:37:42 1.4
+++ DependClassLoader12.java 2001/11/21 03:02:27 1.5
@@ -60,6 +60,7 @@
import java.net.*;
import java.text.*;
import java.util.*;
+import java.util.jar.*;
import java.util.zip.*;
import java.security.*;
@@ -107,6 +108,56 @@
// PermissionCollection perms=Policy.getPolicy().getPermissions(cs);
// ProtectionDomain pd=new ProtectionDomain( cs,perms);
// System.out.println("XXX " + name + ": " + cs + "\n" + perms );
- return defineClass(name, data, s, end, (ProtectionDomain)pd);
+ int idx = name.lastIndexOf(".");
+ String pkgname = idx != -1 ? name.substring(0, idx) : null;
+ if ( pkgname != null ) {
+ Package p = getPackage(pkgname);
+ if ( p == null ) {
+ if ( "jar".equals(res.getProtocol()) ) {
+ try {
+ JarURLConnection juconn =
+ (JarURLConnection)res.openConnection();
+ Manifest mf = juconn.getManifest();
+ if(mf == null) // Jar may not be Java2
+ throw new IOException("No Manifest");
+ Attributes main = mf.getMainAttributes();
+ Attributes pkg = mf.getAttributes(
+ pkgname.replace('.', '/').concat("/")
+ );
+ boolean sealed = Boolean.getBoolean(
+ getAttribute(Attributes.Name.SEALED, main, pkg)
+ );
+ definePackage(
+ pkgname,
+ getAttribute(Attributes.Name.SPECIFICATION_TITLE, main, pkg),
+ getAttribute(Attributes.Name.SPECIFICATION_VERSION, main, pkg),
+ getAttribute(Attributes.Name.SPECIFICATION_VENDOR, main, pkg),
+ getAttribute(Attributes.Name.IMPLEMENTATION_TITLE, main, pkg),
+ getAttribute(Attributes.Name.IMPLEMENTATION_VERSION, main, pkg),
+ getAttribute(Attributes.Name.IMPLEMENTATION_VENDOR, main, pkg),
+ sealed ? res : null
+ );
+ } catch ( IOException e ) {
+ definePackage(pkgname, null, null, null, null, null, null, null);
+ }
+ } else {
+ definePackage(pkgname, null, null, null, null, null, null, null);
+ }
+ }
+ }
+ return defineClass(name, data, s, end, (ProtectionDomain)pd);
}
+
+ private String getAttribute(Attributes.Name key, Attributes main, Attributes
pkg)
+ {
+ String value = null;
+ if ( pkg != null ) {
+ value = (String)pkg.get(key);
+ }
+ if ( value == null ) {
+ value = (String)main.get(key);
+ }
+ return value;
+ }
+
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>