### Eclipse Workspace Patch 1.0 #P cglib Index: src/proxy/net/sf/cglib/proxy/Enhancer.java =================================================================== RCS file: /cvsroot/cglib/cglib/src/proxy/net/sf/cglib/proxy/Enhancer.java,v retrieving revision 1.86 diff -u -r1.86 Enhancer.java --- src/proxy/net/sf/cglib/proxy/Enhancer.java 16 Mar 2007 00:57:17 -0000 1.86 +++ src/proxy/net/sf/cglib/proxy/Enhancer.java 8 Apr 2010 04:19:40 -0000 @@ -171,6 +171,8 @@ } else { this.superclass = superclass; } + // Ensure we can load the class into the same package + setProtDomainSrc(superclass); } /** Index: src/proxy/net/sf/cglib/core/ReflectUtils.java =================================================================== RCS file: /cvsroot/cglib/cglib/src/proxy/net/sf/cglib/core/ReflectUtils.java,v retrieving revision 1.30 diff -u -r1.30 ReflectUtils.java --- src/proxy/net/sf/cglib/core/ReflectUtils.java 11 Jan 2009 19:47:49 -0000 1.30 +++ src/proxy/net/sf/cglib/core/ReflectUtils.java 8 Apr 2010 04:19:40 -0000 @@ -380,12 +380,30 @@ } public static Class defineClass(String className, byte[] b, ClassLoader loader) throws Exception { - Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), PROTECTION_DOMAIN }; - Class c = (Class)DEFINE_CLASS.invoke(loader, args); - // Force static initializers to run. - Class.forName(className, true, loader); - return c; - } +// Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), PROTECTION_DOMAIN }; +// Class c = (Class)DEFINE_CLASS.invoke(loader, args); +// // Force static initializers to run. +// Class.forName(className, true, loader); +// return c; + return defineClass(className, b, loader, null); + } + + public static Class defineClass(String className, byte[] b, + ClassLoader loader, final Class protDomainSrc) throws Exception { + ProtectionDomain pd = (protDomainSrc == null ? PROTECTION_DOMAIN + : (ProtectionDomain) AccessController + .doPrivileged(new PrivilegedAction() { + public Object run() { + return protDomainSrc.getProtectionDomain(); + } + })); + Object[] args = new Object[] { className, b, new Integer(0), + new Integer(b.length), pd }; + Class c = (Class)DEFINE_CLASS.invoke(loader, args); + // Force static initializers to run. + Class.forName(className, true, loader); + return c; + } public static int findPackageProtected(Class[] classes) { for (int i = 0; i < classes.length; i++) { Index: src/proxy/net/sf/cglib/core/AbstractClassGenerator.java =================================================================== RCS file: /cvsroot/cglib/cglib/src/proxy/net/sf/cglib/core/AbstractClassGenerator.java,v retrieving revision 1.37 diff -u -r1.37 AbstractClassGenerator.java --- src/proxy/net/sf/cglib/core/AbstractClassGenerator.java 26 Sep 2005 14:46:39 -0000 1.37 +++ src/proxy/net/sf/cglib/core/AbstractClassGenerator.java 8 Apr 2010 04:19:40 -0000 @@ -39,6 +39,7 @@ private NamingPolicy namingPolicy = DefaultNamingPolicy.INSTANCE; private Source source; private ClassLoader classLoader; + private Class protDomainSrc; private String namePrefix; private Object key; private boolean useCache = true; @@ -118,7 +119,14 @@ public void setUseCache(boolean useCache) { this.useCache = useCache; } - + + /* + * Sets a class to provide the ProtectionDomain 'by example' + */ + public void setProtDomainSrc(Class protDomainSrc) { + this.protDomainSrc = protDomainSrc; + } + /** * @see #setUseCache */ @@ -216,7 +224,7 @@ byte[] b = strategy.generate(this); String className = ClassNameReader.getClassName(new ClassReader(b)); getClassNameCache(loader).add(className); - gen = ReflectUtils.defineClass(className, b, loader); + gen = ReflectUtils.defineClass(className, b, loader, protDomainSrc); } if (useCache) {