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]>

Reply via email to