diff --git a/build.gradle b/build.gradle index 4268fd6139..113337409a 100644 --- a/build.gradle +++ b/build.gradle @@ -36,9 +36,6 @@ libraries = [ commons_annotations: 'org.hibernate:hibernate-commons-annotations:3.2.0.Final', - // CGLIB - cglib: 'cglib:cglib:2.2', - // Jakarta commons-collections todo : get rid of commons-collections dependency commons_collections: 'commons-collections:commons-collections:3.1', diff --git a/hibernate-core/hibernate-core.gradle b/hibernate-core/hibernate-core.gradle index 19cd7ef59f..e777062524 100644 --- a/hibernate-core/hibernate-core.gradle +++ b/hibernate-core/hibernate-core.gradle @@ -11,9 +11,6 @@ dependencies { compile( libraries.jpa ) antlr( libraries.antlr ) provided( libraries.javassist ) - provided( libraries.cglib ) { - transitive = true - } provided( libraries.ant ) provided( libraries.jacc ) provided( libraries.validation ) @@ -25,9 +22,6 @@ dependencies { } testRuntime( 'jaxen:jaxen:1.1' ) testRuntime( libraries.javassist ) - testRuntime( libraries.cglib ) { - transitive = true - } } manifest.mainAttributes( diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/buildtime/CGLIBInstrumenter.java b/hibernate-core/src/main/java/org/hibernate/bytecode/buildtime/CGLIBInstrumenter.java deleted file mode 100644 index 42b8e6cabe..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/buildtime/CGLIBInstrumenter.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.bytecode.buildtime; - -import java.io.ByteArrayInputStream; -import java.util.Set; -import net.sf.cglib.core.ClassNameReader; -import net.sf.cglib.transform.impl.InterceptFieldEnabled; -import org.hibernate.bytecode.ClassTransformer; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; -import org.hibernate.bytecode.util.BasicClassFilter; -import org.hibernate.bytecode.util.ClassDescriptor; -import org.objectweb.asm.ClassReader; - -/** - * Strategy for performing build-time instrumentation of persistent classes in order to enable - * field-level interception using CGLIB. - * - * @author Steve Ebersole - * @author Gavin King - */ -public class CGLIBInstrumenter extends AbstractInstrumenter { - private static final BasicClassFilter CLASS_FILTER = new BasicClassFilter(); - - private final BytecodeProviderImpl provider = new BytecodeProviderImpl(); - - public CGLIBInstrumenter(Logger logger, Options options) { - super( logger, options ); - } - - @Override - protected ClassDescriptor getClassDescriptor(byte[] byecode) throws Exception { - return new CustomClassDescriptor( byecode ); - } - - @Override - protected ClassTransformer getClassTransformer(ClassDescriptor descriptor, Set classNames) { - if ( descriptor.isInstrumented() ) { - logger.debug( "class [" + descriptor.getName() + "] already instrumented" ); - return null; - } - else { - return provider.getTransformer( CLASS_FILTER, new CustomFieldFilter( descriptor, classNames ) ); - } - } - - private static class CustomClassDescriptor implements ClassDescriptor { - private final byte[] bytecode; - private final String name; - private final boolean isInstrumented; - - public CustomClassDescriptor(byte[] bytecode) throws Exception { - this.bytecode = bytecode; - ClassReader reader = new ClassReader( new ByteArrayInputStream( bytecode ) ); - String[] names = ClassNameReader.getClassInfo( reader ); - this.name = names[0]; - boolean instrumented = false; - for ( int i = 1; i < names.length; i++ ) { - if ( InterceptFieldEnabled.class.getName().equals( names[i] ) ) { - instrumented = true; - break; - } - } - this.isInstrumented = instrumented; - } - - public String getName() { - return name; - } - - public boolean isInstrumented() { - return isInstrumented; - } - - public byte[] getBytes() { - return bytecode; - } - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/AccessOptimizerAdapter.java b/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/AccessOptimizerAdapter.java deleted file mode 100644 index e53465eaad..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/AccessOptimizerAdapter.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.bytecode.cglib; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import net.sf.cglib.beans.BulkBean; -import net.sf.cglib.beans.BulkBeanException; -import org.hibernate.PropertyAccessException; -import org.hibernate.bytecode.ReflectionOptimizer; - -/** - * The {@link ReflectionOptimizer.AccessOptimizer} implementation for CGLIB - * which simply acts as an adpater to the {@link BulkBean} class. - * - * @author Steve Ebersole - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class AccessOptimizerAdapter implements ReflectionOptimizer.AccessOptimizer, Serializable { - - public static final String PROPERTY_GET_EXCEPTION = - "exception getting property value with CGLIB (set hibernate.bytecode.use_reflection_optimizer=false for more info)"; - - public static final String PROPERTY_SET_EXCEPTION = - "exception setting property value with CGLIB (set hibernate.bytecode.use_reflection_optimizer=false for more info)"; - - private Class mappedClass; - private BulkBean bulkBean; - - public AccessOptimizerAdapter(BulkBean bulkBean, Class mappedClass) { - this.bulkBean = bulkBean; - this.mappedClass = mappedClass; - } - - public String[] getPropertyNames() { - return bulkBean.getGetters(); - } - - public Object[] getPropertyValues(Object object) { - try { - return bulkBean.getPropertyValues( object ); - } - catch ( Throwable t ) { - throw new PropertyAccessException( - t, - PROPERTY_GET_EXCEPTION, - false, - mappedClass, - getterName( t, bulkBean ) - ); - } - } - - public void setPropertyValues(Object object, Object[] values) { - try { - bulkBean.setPropertyValues( object, values ); - } - catch ( Throwable t ) { - throw new PropertyAccessException( - t, - PROPERTY_SET_EXCEPTION, - true, - mappedClass, - setterName( t, bulkBean ) - ); - } - } - - private static String setterName(Throwable t, BulkBean optimizer) { - if ( t instanceof BulkBeanException ) { - return optimizer.getSetters()[( ( BulkBeanException ) t ).getIndex()]; - } - else { - return "?"; - } - } - - private static String getterName(Throwable t, BulkBean optimizer) { - if ( t instanceof BulkBeanException ) { - return optimizer.getGetters()[( ( BulkBeanException ) t ).getIndex()]; - } - else { - return "?"; - } - } - - private void writeObject(ObjectOutputStream out) throws IOException { - out.writeObject( mappedClass ); - out.writeObject( bulkBean.getGetters() ); - out.writeObject( bulkBean.getSetters() ); - out.writeObject( bulkBean.getPropertyTypes() ); - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - Class beanClass = ( Class ) in.readObject(); - String[] getters = ( String[] ) in.readObject(); - String[] setters = ( String[] ) in.readObject(); - Class[] types = ( Class[] ) in.readObject(); - bulkBean = BulkBean.create( beanClass, getters, setters, types ); - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java deleted file mode 100644 index 2c163be1c8..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.bytecode.cglib; - -import java.lang.reflect.Modifier; -import net.sf.cglib.beans.BulkBean; -import net.sf.cglib.beans.BulkBeanException; -import net.sf.cglib.reflect.FastClass; -import org.hibernate.HibernateLogger; -import org.hibernate.bytecode.BytecodeProvider; -import org.hibernate.bytecode.ProxyFactoryFactory; -import org.hibernate.bytecode.ReflectionOptimizer; -import org.hibernate.bytecode.util.FieldFilter; -import org.hibernate.internal.util.StringHelper; -import org.jboss.logging.Logger; - -/** - * Bytecode provider implementation for CGLIB. - * - * @author Steve Ebersole - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class BytecodeProviderImpl implements BytecodeProvider { - - private static final HibernateLogger LOG = Logger.getMessageLogger(HibernateLogger.class, BytecodeProviderImpl.class.getName()); - - public BytecodeProviderImpl() { - LOG.deprecated(); - } - - public ProxyFactoryFactory getProxyFactoryFactory() { - return new ProxyFactoryFactoryImpl(); - } - - public ReflectionOptimizer getReflectionOptimizer( - Class clazz, - String[] getterNames, - String[] setterNames, - Class[] types) { - FastClass fastClass; - BulkBean bulkBean; - try { - fastClass = FastClass.create( clazz ); - bulkBean = BulkBean.create( clazz, getterNames, setterNames, types ); - if ( !clazz.isInterface() && !Modifier.isAbstract( clazz.getModifiers() ) ) { - if ( fastClass == null ) { - bulkBean = null; - } - else { - //test out the optimizer: - Object instance = fastClass.newInstance(); - bulkBean.setPropertyValues( instance, bulkBean.getPropertyValues( instance ) ); - } - } - } - catch( Throwable t ) { - fastClass = null; - bulkBean = null; - if (LOG.isDebugEnabled()) { - int index = 0; - if (t instanceof BulkBeanException) index = ((BulkBeanException)t).getIndex(); - if (index >= 0) LOG.debugf("Reflection optimizer disabled for: %s [%s: %s (property %s)", - clazz.getName(), - StringHelper.unqualify(t.getClass().getName()), - t.getMessage(), - setterNames[index]); - else LOG.debugf("Reflection optimizer disabled for: %s [%s: %s", - clazz.getName(), - StringHelper.unqualify(t.getClass().getName()), - t.getMessage()); - } - } - - if (fastClass != null && bulkBean != null) return new ReflectionOptimizerImpl(new InstantiationOptimizerAdapter(fastClass), - new AccessOptimizerAdapter(bulkBean, clazz)); - return null; - } - - public org.hibernate.bytecode.ClassTransformer getTransformer(org.hibernate.bytecode.util.ClassFilter classFilter, FieldFilter fieldFilter) { - return new CglibClassTransformer( classFilter, fieldFilter ); - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/CglibClassTransformer.java b/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/CglibClassTransformer.java deleted file mode 100644 index b72aa1a60e..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/CglibClassTransformer.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.bytecode.cglib; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.ProtectionDomain; -import net.sf.cglib.core.ClassNameReader; -import net.sf.cglib.core.DebuggingClassWriter; -import net.sf.cglib.transform.ClassReaderGenerator; -import net.sf.cglib.transform.ClassTransformer; -import net.sf.cglib.transform.TransformingClassGenerator; -import net.sf.cglib.transform.impl.InterceptFieldEnabled; -import net.sf.cglib.transform.impl.InterceptFieldFilter; -import net.sf.cglib.transform.impl.InterceptFieldTransformer; -import org.hibernate.HibernateException; -import org.hibernate.HibernateLogger; -import org.hibernate.bytecode.AbstractClassTransformerImpl; -import org.hibernate.bytecode.util.ClassFilter; -import org.hibernate.bytecode.util.FieldFilter; -import org.jboss.logging.Logger; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Type; - -/** - * Enhance the classes allowing them to implements InterceptFieldEnabled - * This interface is then used by Hibernate for some optimizations. - * - * @author Emmanuel Bernard - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class CglibClassTransformer extends AbstractClassTransformerImpl { - - private static final HibernateLogger LOG = Logger.getMessageLogger(HibernateLogger.class, CglibClassTransformer.class.getName()); - - public CglibClassTransformer(ClassFilter classFilter, FieldFilter fieldFilter) { - super( classFilter, fieldFilter ); - } - - @Override - protected byte[] doTransform( - ClassLoader loader, - String className, - Class classBeingRedefined, - ProtectionDomain protectionDomain, - byte[] classfileBuffer) { - ClassReader reader; - try { - reader = new ClassReader( new ByteArrayInputStream( classfileBuffer ) ); - } - catch (IOException e) { - LOG.unableToReadClass(e.getMessage()); - throw new HibernateException( "Unable to read class: " + e.getMessage() ); - } - - String[] names = ClassNameReader.getClassInfo( reader ); - ClassWriter w = new DebuggingClassWriter( ClassWriter.COMPUTE_MAXS ); - ClassTransformer t = getClassTransformer( names ); - if ( t != null ) { - LOG.debugf("Enhancing %s", className); - ByteArrayOutputStream out; - byte[] result; - try { - reader = new ClassReader( new ByteArrayInputStream( classfileBuffer ) ); - new TransformingClassGenerator( - new ClassReaderGenerator( reader, skipDebug() ), t - ).generateClass( w ); - out = new ByteArrayOutputStream(); - out.write( w.toByteArray() ); - result = out.toByteArray(); - out.close(); - } - catch (Exception e) { - LOG.unableToTransformClass(e.getMessage()); - throw new HibernateException( "Unable to transform class: " + e.getMessage() ); - } - return result; - } - return classfileBuffer; - } - - private int skipDebug() { - return ClassReader.SKIP_DEBUG; - } - - private ClassTransformer getClassTransformer(final String[] classInfo) { - if ( isAlreadyInstrumented( classInfo ) ) { - return null; - } - return new InterceptFieldTransformer( - new InterceptFieldFilter() { - public boolean acceptRead(Type owner, String name) { - return fieldFilter.shouldTransformFieldAccess( classInfo[0], owner.getClassName(), name ); - } - - public boolean acceptWrite(Type owner, String name) { - return fieldFilter.shouldTransformFieldAccess( classInfo[0], owner.getClassName(), name ); - } - } - ); - } - - private boolean isAlreadyInstrumented(String[] classInfo) { - for ( int i = 1; i < classInfo.length; i++ ) { - if ( InterceptFieldEnabled.class.getName().equals( classInfo[i] ) ) { - return true; - } - } - return false; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/InstantiationOptimizerAdapter.java b/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/InstantiationOptimizerAdapter.java deleted file mode 100644 index b49b6ff2ec..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/InstantiationOptimizerAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.bytecode.cglib; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import net.sf.cglib.reflect.FastClass; -import org.hibernate.InstantiationException; -import org.hibernate.bytecode.ReflectionOptimizer; - -/** - * The {@link ReflectionOptimizer.InstantiationOptimizer} implementation for CGLIB - * which simply acts as an adapter to the {@link FastClass} class. - * - * @author Steve Ebersole - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class InstantiationOptimizerAdapter implements ReflectionOptimizer.InstantiationOptimizer, Serializable { - private FastClass fastClass; - - public InstantiationOptimizerAdapter(FastClass fastClass) { - this.fastClass = fastClass; - } - - public Object newInstance() { - try { - return fastClass.newInstance(); - } - catch ( Throwable t ) { - throw new InstantiationException( - "Could not instantiate entity with CGLIB optimizer: ", - fastClass.getJavaClass(), - t - ); - } - } - - private void writeObject(ObjectOutputStream out) throws IOException { - out.writeObject( fastClass.getJavaClass() ); - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - Class beanClass = ( Class ) in.readObject(); - fastClass = FastClass.create( beanClass ); - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java deleted file mode 100644 index 5e93aaa224..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.bytecode.cglib; -import java.lang.reflect.Method; -import java.util.HashMap; -import net.sf.cglib.proxy.Callback; -import net.sf.cglib.proxy.CallbackFilter; -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.Factory; -import net.sf.cglib.proxy.MethodInterceptor; -import net.sf.cglib.proxy.MethodProxy; -import net.sf.cglib.proxy.NoOp; -import org.hibernate.AssertionFailure; -import org.hibernate.HibernateException; -import org.hibernate.bytecode.BasicProxyFactory; -import org.hibernate.bytecode.ProxyFactoryFactory; -import org.hibernate.proxy.ProxyFactory; -import org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory; - -/** - * A factory for CGLIB-based {@link ProxyFactory} instances. - * - * @author Steve Ebersole - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class ProxyFactoryFactoryImpl implements ProxyFactoryFactory { - - /** - * Builds a CGLIB-based proxy factory. - * - * @return a new CGLIB-based proxy factory. - */ - public ProxyFactory buildProxyFactory() { - return new CGLIBProxyFactory(); - } - - public BasicProxyFactory buildBasicProxyFactory(Class superClass, Class[] interfaces) { - return new BasicProxyFactoryImpl( superClass, interfaces ); - } - - public static class BasicProxyFactoryImpl implements BasicProxyFactory { - private final Class proxyClass; - private final Factory factory; - - public BasicProxyFactoryImpl(Class superClass, Class[] interfaces) { - if ( superClass == null && ( interfaces == null || interfaces.length < 1 ) ) { - throw new AssertionFailure( "attempting to build proxy without any superclass or interfaces" ); - } - - Enhancer en = new Enhancer(); - en.setUseCache( false ); - en.setInterceptDuringConstruction( false ); - en.setUseFactory( true ); - en.setCallbackTypes( CALLBACK_TYPES ); - en.setCallbackFilter( FINALIZE_FILTER ); - if ( superClass != null ) { - en.setSuperclass( superClass ); - } - if ( interfaces != null && interfaces.length > 0 ) { - en.setInterfaces( interfaces ); - } - proxyClass = en.createClass(); - try { - factory = ( Factory ) proxyClass.newInstance(); - } - catch ( Throwable t ) { - throw new HibernateException( "Unable to build CGLIB Factory instance" ); - } - } - - public Object getProxy() { - try { - return factory.newInstance( - new Callback[] { new PassThroughInterceptor( proxyClass.getName() ), NoOp.INSTANCE } - ); - } - catch ( Throwable t ) { - throw new HibernateException( "Unable to instantiate proxy instance" ); - } - } - } - - private static final CallbackFilter FINALIZE_FILTER = new CallbackFilter() { - public int accept(Method method) { - if ( method.getParameterTypes().length == 0 && method.getName().equals("finalize") ){ - return 1; - } - else { - return 0; - } - } - }; - - private static final Class[] CALLBACK_TYPES = new Class[] { MethodInterceptor.class, NoOp.class }; - - private static class PassThroughInterceptor implements MethodInterceptor { - private HashMap data = new HashMap(); - private final String proxiedClassName; - - public PassThroughInterceptor(String proxiedClassName) { - this.proxiedClassName = proxiedClassName; - } - - public Object intercept( - Object obj, - Method method, - Object[] args, - MethodProxy proxy) throws Throwable { - String name = method.getName(); - if ( "toString".equals( name ) ) { - return proxiedClassName + "@" + System.identityHashCode( obj ); - } - else if ( "equals".equals( name ) ) { - return args[0] instanceof Factory && ( ( Factory ) args[0] ).getCallback( 0 ) == this - ? Boolean.TRUE - : Boolean.FALSE; - } - else if ( "hashCode".equals( name ) ) { - return new Integer( System.identityHashCode( obj ) ); - } - boolean hasGetterSignature = method.getParameterTypes().length == 0 && method.getReturnType() != null; - boolean hasSetterSignature = method.getParameterTypes().length == 1 && ( method.getReturnType() == null || method.getReturnType() == void.class ); - if ( name.startsWith( "get" ) && hasGetterSignature ) { - String propName = name.substring( 3 ); - return data.get( propName ); - } - else if ( name.startsWith( "is" ) && hasGetterSignature ) { - String propName = name.substring( 2 ); - return data.get( propName ); - } - else if ( name.startsWith( "set" ) && hasSetterSignature) { - String propName = name.substring( 3 ); - data.put( propName, args[0] ); - return null; - } - else { - // todo : what else to do here? - return null; - } - } - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/ReflectionOptimizerImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/ReflectionOptimizerImpl.java deleted file mode 100644 index 1f0fa0b267..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/cglib/ReflectionOptimizerImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.bytecode.cglib; -import java.io.Serializable; -import org.hibernate.bytecode.ReflectionOptimizer; - -/** - * ReflectionOptimizer implementation for CGLIB. - * - * @author Steve Ebersole - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class ReflectionOptimizerImpl implements ReflectionOptimizer, Serializable { - private transient InstantiationOptimizerAdapter instantiationOptimizer; - private transient AccessOptimizerAdapter accessOptimizer; - - public ReflectionOptimizerImpl( - InstantiationOptimizerAdapter instantiationOptimizer, - AccessOptimizerAdapter accessOptimizer) { - this.instantiationOptimizer = instantiationOptimizer; - this.accessOptimizer = accessOptimizer; - } - - public InstantiationOptimizer getInstantiationOptimizer() { - return instantiationOptimizer; - } - - public AccessOptimizer getAccessOptimizer() { - return accessOptimizer; - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Environment.java b/hibernate-core/src/main/java/org/hibernate/cfg/Environment.java index d70c0c2988..945ce45fc8 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/Environment.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/Environment.java @@ -594,8 +594,6 @@ public final class Environment { LOG.version(Version.getVersionString()); - RENAMED_PROPERTIES.put( "hibernate.cglib.use_reflection_optimizer", USE_REFLECTION_OPTIMIZER ); - ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_NONE), "NONE" ); ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_READ_UNCOMMITTED), "READ_UNCOMMITTED" ); ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_READ_COMMITTED), "READ_COMMITTED" ); @@ -800,11 +798,8 @@ public final class Environment { if ( "javassist".equals( providerName ) ) { return new org.hibernate.bytecode.javassist.BytecodeProviderImpl(); } - else if ( "cglib".equals( providerName ) ) { - return new org.hibernate.bytecode.cglib.BytecodeProviderImpl(); - } - LOG.unknownBytecodeProvider(providerName); + LOG.unknownBytecodeProvider( providerName ); return new org.hibernate.bytecode.javassist.BytecodeProviderImpl(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/SettingsFactory.java b/hibernate-core/src/main/java/org/hibernate/cfg/SettingsFactory.java index b1fc9cbd37..ab409ec5e4 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/SettingsFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/SettingsFactory.java @@ -252,18 +252,15 @@ public class SettingsFactory implements Serializable { } - protected BytecodeProvider buildBytecodeProvider(String providerName) { - if ( "javassist".equals( providerName ) ) { - return new org.hibernate.bytecode.javassist.BytecodeProviderImpl(); - } - else if ( "cglib".equals( providerName ) ) { - return new org.hibernate.bytecode.cglib.BytecodeProviderImpl(); - } - else { - LOG.debugf("Using javassist as bytecode provider by default"); - return new org.hibernate.bytecode.javassist.BytecodeProviderImpl(); - } - } +// protected BytecodeProvider buildBytecodeProvider(String providerName) { +// if ( "javassist".equals( providerName ) ) { +// return new org.hibernate.bytecode.javassist.BytecodeProviderImpl(); +// } +// else { +// LOG.debugf("Using javassist as bytecode provider by default"); +// return new org.hibernate.bytecode.javassist.BytecodeProviderImpl(); +// } +// } private static String enabledDisabled(boolean value) { return value ? "enabled" : "disabled"; diff --git a/hibernate-core/src/main/java/org/hibernate/intercept/FieldInterceptionHelper.java b/hibernate-core/src/main/java/org/hibernate/intercept/FieldInterceptionHelper.java index 020bf1b289..a23192c450 100644 --- a/hibernate-core/src/main/java/org/hibernate/intercept/FieldInterceptionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/intercept/FieldInterceptionHelper.java @@ -25,7 +25,6 @@ package org.hibernate.intercept; import java.util.Set; import org.hibernate.engine.SessionImplementor; -import org.hibernate.intercept.cglib.CGLIBHelper; import org.hibernate.intercept.javassist.JavassistHelper; /** @@ -66,11 +65,7 @@ public class FieldInterceptionHelper { } Class[] definedInterfaces = entity.getClass().getInterfaces(); for ( int i = 0; i < definedInterfaces.length; i++ ) { - if ( "net.sf.cglib.transform.impl.InterceptFieldEnabled".equals( definedInterfaces[i].getName() ) ) { - // we have a CGLIB enhanced entity - return CGLIBHelper.extractFieldInterceptor( entity ); - } - else if ( "org.hibernate.bytecode.javassist.FieldHandled".equals( definedInterfaces[i].getName() ) ) { + if ( "org.hibernate.bytecode.javassist.FieldHandled".equals( definedInterfaces[i].getName() ) ) { // we have a Javassist enhanced entity return JavassistHelper.extractFieldInterceptor( entity ); } @@ -86,11 +81,7 @@ public class FieldInterceptionHelper { if ( entity != null ) { Class[] definedInterfaces = entity.getClass().getInterfaces(); for ( int i = 0; i < definedInterfaces.length; i++ ) { - if ( "net.sf.cglib.transform.impl.InterceptFieldEnabled".equals( definedInterfaces[i].getName() ) ) { - // we have a CGLIB enhanced entity - return CGLIBHelper.injectFieldInterceptor( entity, entityName, uninitializedFieldNames, session ); - } - else if ( "org.hibernate.bytecode.javassist.FieldHandled".equals( definedInterfaces[i].getName() ) ) { + if ( "org.hibernate.bytecode.javassist.FieldHandled".equals( definedInterfaces[i].getName() ) ) { // we have a Javassist enhanced entity return JavassistHelper.injectFieldInterceptor( entity, entityName, uninitializedFieldNames, session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/intercept/cglib/CGLIBHelper.java b/hibernate-core/src/main/java/org/hibernate/intercept/cglib/CGLIBHelper.java deleted file mode 100644 index 4c44b11a2e..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/intercept/cglib/CGLIBHelper.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.intercept.cglib; -import java.util.Set; -import net.sf.cglib.transform.impl.InterceptFieldEnabled; -import org.hibernate.engine.SessionImplementor; -import org.hibernate.intercept.FieldInterceptor; - -/** - * @author Steve Ebersole - */ -public class CGLIBHelper { - private CGLIBHelper() { - } - - public static FieldInterceptor extractFieldInterceptor(Object entity) { - return ( FieldInterceptor ) ( ( InterceptFieldEnabled ) entity ).getInterceptFieldCallback(); - } - - public static FieldInterceptor injectFieldInterceptor( - Object entity, - String entityName, - Set uninitializedFieldNames, - SessionImplementor session) { - FieldInterceptorImpl fieldInterceptor = new FieldInterceptorImpl( - session, uninitializedFieldNames, entityName - ); - ( ( InterceptFieldEnabled ) entity ).setInterceptFieldCallback( fieldInterceptor ); - return fieldInterceptor; - - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/intercept/cglib/FieldInterceptorImpl.java b/hibernate-core/src/main/java/org/hibernate/intercept/cglib/FieldInterceptorImpl.java deleted file mode 100644 index d640f24fcd..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/intercept/cglib/FieldInterceptorImpl.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - * - */ -package org.hibernate.intercept.cglib; -import java.io.Serializable; -import java.util.Set; -import net.sf.cglib.transform.impl.InterceptFieldCallback; -import org.hibernate.engine.SessionImplementor; -import org.hibernate.intercept.AbstractFieldInterceptor; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.LazyInitializer; - -/** - * A field-level interceptor that initializes lazily fetched properties. - * This interceptor can be attached to classes instrumented by CGLIB. - * Note that this implementation assumes that the instance variable - * name is the same as the name of the persistent property that must - * be loaded. - * - * @author Gavin King - */ -public final class FieldInterceptorImpl extends AbstractFieldInterceptor implements InterceptFieldCallback, Serializable { - - /** - * Package-protected constructor - * - * @param session The Hibernate session - * @param uninitializedFields Names of the fields we need to initialize on load - * @param entityName The entity name to which we are being bound - */ - FieldInterceptorImpl(SessionImplementor session, Set uninitializedFields, String entityName) { - super( session, uninitializedFields, entityName ); - } - - public boolean readBoolean(Object target, String name, boolean oldValue) { - return ( ( Boolean ) intercept( target, name, oldValue ? Boolean.TRUE : Boolean.FALSE ) ) - .booleanValue(); - } - - public byte readByte(Object target, String name, byte oldValue) { - return ( ( Byte ) intercept( target, name, new Byte( oldValue ) ) ).byteValue(); - } - - public char readChar(Object target, String name, char oldValue) { - return ( ( Character ) intercept( target, name, new Character( oldValue ) ) ) - .charValue(); - } - - public double readDouble(Object target, String name, double oldValue) { - return ( ( Double ) intercept( target, name, new Double( oldValue ) ) ) - .doubleValue(); - } - - public float readFloat(Object target, String name, float oldValue) { - return ( ( Float ) intercept( target, name, new Float( oldValue ) ) ) - .floatValue(); - } - - public int readInt(Object target, String name, int oldValue) { - return ( ( Integer ) intercept( target, name, new Integer( oldValue ) ) ) - .intValue(); - } - - public long readLong(Object target, String name, long oldValue) { - return ( ( Long ) intercept( target, name, new Long( oldValue ) ) ).longValue(); - } - - public short readShort(Object target, String name, short oldValue) { - return ( ( Short ) intercept( target, name, new Short( oldValue ) ) ) - .shortValue(); - } - - public Object readObject(Object target, String name, Object oldValue) { - Object value = intercept( target, name, oldValue ); - if (value instanceof HibernateProxy) { - LazyInitializer li = ( (HibernateProxy) value ).getHibernateLazyInitializer(); - if ( li.isUnwrap() ) { - value = li.getImplementation(); - } - } - return value; - } - - public boolean writeBoolean(Object target, String name, boolean oldValue, boolean newValue) { - dirty(); - intercept( target, name, oldValue ? Boolean.TRUE : Boolean.FALSE ); - return newValue; - } - - public byte writeByte(Object target, String name, byte oldValue, byte newValue) { - dirty(); - intercept( target, name, new Byte( oldValue ) ); - return newValue; - } - - public char writeChar(Object target, String name, char oldValue, char newValue) { - dirty(); - intercept( target, name, new Character( oldValue ) ); - return newValue; - } - - public double writeDouble(Object target, String name, double oldValue, double newValue) { - dirty(); - intercept( target, name, new Double( oldValue ) ); - return newValue; - } - - public float writeFloat(Object target, String name, float oldValue, float newValue) { - dirty(); - intercept( target, name, new Float( oldValue ) ); - return newValue; - } - - public int writeInt(Object target, String name, int oldValue, int newValue) { - dirty(); - intercept( target, name, new Integer( oldValue ) ); - return newValue; - } - - public long writeLong(Object target, String name, long oldValue, long newValue) { - dirty(); - intercept( target, name, new Long( oldValue ) ); - return newValue; - } - - public short writeShort(Object target, String name, short oldValue, short newValue) { - dirty(); - intercept( target, name, new Short( oldValue ) ); - return newValue; - } - - public Object writeObject(Object target, String name, Object oldValue, Object newValue) { - dirty(); - intercept( target, name, oldValue ); - return newValue; - } - - public String toString() { - return "FieldInterceptorImpl(" + - "entityName=" + getEntityName() + - ",dirty=" + isDirty() + - ",uninitializedFields=" + getUninitializedFields() + - ')'; - } - -} \ No newline at end of file diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/CGLIBLazyInitializer.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/CGLIBLazyInitializer.java deleted file mode 100644 index e4cb891de4..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/CGLIBLazyInitializer.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2010, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.proxy.pojo.cglib; - -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import net.sf.cglib.proxy.Callback; -import net.sf.cglib.proxy.CallbackFilter; -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.InvocationHandler; -import net.sf.cglib.proxy.NoOp; -import org.hibernate.HibernateException; -import org.hibernate.HibernateLogger; -import org.hibernate.LazyInitializationException; -import org.hibernate.engine.SessionImplementor; -import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.pojo.BasicLazyInitializer; -import org.hibernate.type.CompositeType; -import org.jboss.logging.Logger; - -/** - * A LazyInitializer implemented using the CGLIB bytecode generation library - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public final class CGLIBLazyInitializer extends BasicLazyInitializer implements InvocationHandler { - - private static final HibernateLogger LOG = Logger.getMessageLogger(HibernateLogger.class, CGLIBLazyInitializer.class.getName()); - - private static final CallbackFilter FINALIZE_FILTER = new CallbackFilter() { - public int accept(Method method) { - if ( method.getParameterTypes().length == 0 && method.getName().equals("finalize") ){ - return 1; - } - else { - return 0; - } - } - }; - - private Class[] interfaces; - private boolean constructed = false; - - static HibernateProxy getProxy( - final String entityName, - final Class persistentClass, - final Class[] interfaces, - final Method getIdentifierMethod, - final Method setIdentifierMethod, - CompositeType componentIdType, - final Serializable id, - final SessionImplementor session) throws HibernateException { - // note: interfaces is assumed to already contain HibernateProxy.class - - try { - final CGLIBLazyInitializer instance = new CGLIBLazyInitializer( - entityName, - persistentClass, - interfaces, - id, - getIdentifierMethod, - setIdentifierMethod, - componentIdType, - session - ); - - final HibernateProxy proxy; - Class factory = getProxyFactory(persistentClass, interfaces); - proxy = getProxyInstance(factory, instance); - instance.constructed = true; - return proxy; - } - catch (Throwable t) { - LOG.error(LOG.cglibEnhancementFailed(entityName), t); - throw new HibernateException(LOG.cglibEnhancementFailed(entityName), t); - } - } - - public static HibernateProxy getProxy( - final Class factory, - final String entityName, - final Class persistentClass, - final Class[] interfaces, - final Method getIdentifierMethod, - final Method setIdentifierMethod, - final CompositeType componentIdType, - final Serializable id, - final SessionImplementor session) throws HibernateException { - final CGLIBLazyInitializer instance = new CGLIBLazyInitializer( - entityName, - persistentClass, - interfaces, - id, - getIdentifierMethod, - setIdentifierMethod, - componentIdType, - session - ); - - final HibernateProxy proxy; - try { - proxy = getProxyInstance(factory, instance); - } - catch (Exception e) { - throw new HibernateException( "CGLIB Enhancement failed: " + persistentClass.getName(), e ); - } - instance.constructed = true; - - return proxy; - } - - private static HibernateProxy getProxyInstance(Class factory, CGLIBLazyInitializer instance) throws InstantiationException, IllegalAccessException { - HibernateProxy proxy; - try { - Enhancer.registerCallbacks(factory, new Callback[]{ instance, null }); - proxy = (HibernateProxy)factory.newInstance(); - } finally { - // HHH-2481 make sure the callback gets cleared, otherwise the instance stays in a static thread local. - Enhancer.registerCallbacks(factory, null); - } - return proxy; - } - - public static Class getProxyFactory(Class persistentClass, Class[] interfaces) - throws HibernateException { - Enhancer e = new Enhancer(); - e.setSuperclass( interfaces.length == 1 ? persistentClass : null ); - e.setInterfaces(interfaces); - e.setCallbackTypes(new Class[]{ - InvocationHandler.class, - NoOp.class, - }); - e.setCallbackFilter(FINALIZE_FILTER); - e.setUseFactory(false); - e.setInterceptDuringConstruction( false ); - return e.createClass(); - } - - private CGLIBLazyInitializer( - final String entityName, - final Class persistentClass, - final Class[] interfaces, - final Serializable id, - final Method getIdentifierMethod, - final Method setIdentifierMethod, - final CompositeType componentIdType, - final SessionImplementor session) { - super( - entityName, - persistentClass, - id, - getIdentifierMethod, - setIdentifierMethod, - componentIdType, - session - ); - this.interfaces = interfaces; - } - - public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { - if ( constructed ) { - Object result = invoke( method, args, proxy ); - if ( result == INVOKE_IMPLEMENTATION ) { - Object target = getImplementation(); - try { - final Object returnValue; - if ( ReflectHelper.isPublic( persistentClass, method ) ) { - if ( !method.getDeclaringClass().isInstance( target ) ) { - throw new ClassCastException( target.getClass().getName() ); - } - returnValue = method.invoke( target, args ); - } - else { - if ( !method.isAccessible() ) { - method.setAccessible( true ); - } - returnValue = method.invoke( target, args ); - } - return returnValue == target ? proxy : returnValue; - } - catch ( InvocationTargetException ite ) { - throw ite.getTargetException(); - } - } - else { - return result; - } - } - else { - // while constructor is running - if ( method.getName().equals( "getHibernateLazyInitializer" ) ) { - return this; - } - else { - throw new LazyInitializationException( "unexpected case hit, method=" + method.getName() ); - } - } - } - - @Override - protected Object serializableProxy() { - return new SerializableProxy( - getEntityName(), - persistentClass, - interfaces, - getIdentifier(), - ( isReadOnlySettingAvailable() ? Boolean.valueOf( isReadOnly() ) : isReadOnlyBeforeAttachedToSession() ), - getIdentifierMethod, - setIdentifierMethod, - componentIdType - ); - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/CGLIBProxyFactory.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/CGLIBProxyFactory.java deleted file mode 100644 index ea5c2c6111..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/CGLIBProxyFactory.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2010, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.proxy.pojo.cglib; -import java.io.Serializable; -import java.lang.reflect.Method; -import java.util.Set; -import org.hibernate.HibernateException; -import org.hibernate.engine.SessionImplementor; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.ProxyFactory; -import org.hibernate.type.CompositeType; - -/** - * @author Gavin King - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public class CGLIBProxyFactory implements ProxyFactory { - - protected static final Class[] NO_CLASSES = new Class[0]; - - private Class persistentClass; - private String entityName; - private Class[] interfaces; - private Method getIdentifierMethod; - private Method setIdentifierMethod; - private CompositeType componentIdType; - private Class factory; - - public void postInstantiate( - final String entityName, - final Class persistentClass, - final Set interfaces, - final Method getIdentifierMethod, - final Method setIdentifierMethod, - CompositeType componentIdType) - throws HibernateException { - this.entityName = entityName; - this.persistentClass = persistentClass; - this.interfaces = (Class[]) interfaces.toArray(NO_CLASSES); - this.getIdentifierMethod = getIdentifierMethod; - this.setIdentifierMethod = setIdentifierMethod; - this.componentIdType = componentIdType; - factory = CGLIBLazyInitializer.getProxyFactory(persistentClass, this.interfaces); - } - - public HibernateProxy getProxy(Serializable id, SessionImplementor session) - throws HibernateException { - - return CGLIBLazyInitializer.getProxy( - factory, - entityName, - persistentClass, - interfaces, - getIdentifierMethod, - setIdentifierMethod, - componentIdType, - id, - session - ); - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/SerializableProxy.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/SerializableProxy.java deleted file mode 100644 index ed358af133..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/cglib/SerializableProxy.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2010, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.proxy.pojo.cglib; -import java.io.Serializable; -import java.lang.reflect.Method; -import org.hibernate.HibernateException; -import org.hibernate.proxy.AbstractSerializableProxy; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.type.CompositeType; - -/** - * Serializable placeholder for CGLIB proxies - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated. - */ -@Deprecated -public final class SerializableProxy extends AbstractSerializableProxy { - - private Class persistentClass; - private Class[] interfaces; - private Class getIdentifierMethodClass; - private Class setIdentifierMethodClass; - private String getIdentifierMethodName; - private String setIdentifierMethodName; - private Class[] setIdentifierMethodParams; - private CompositeType componentIdType; - - public SerializableProxy() { - } - - public SerializableProxy( - final String entityName, - final Class persistentClass, - final Class[] interfaces, - final Serializable id, - final Boolean readOnly, - final Method getIdentifierMethod, - final Method setIdentifierMethod, - CompositeType componentIdType) { - super( entityName, id, readOnly ); - this.persistentClass = persistentClass; - this.interfaces = interfaces; - if (getIdentifierMethod!=null) { - getIdentifierMethodClass = getIdentifierMethod.getDeclaringClass(); - getIdentifierMethodName = getIdentifierMethod.getName(); - } - if (setIdentifierMethod!=null) { - setIdentifierMethodClass = setIdentifierMethod.getDeclaringClass(); - setIdentifierMethodName = setIdentifierMethod.getName(); - setIdentifierMethodParams = setIdentifierMethod.getParameterTypes(); - } - this.componentIdType = componentIdType; - } - - private Object readResolve() { - try { - HibernateProxy proxy = CGLIBLazyInitializer.getProxy( - getEntityName(), - persistentClass, - interfaces, - getIdentifierMethodName==null - ? null - : getIdentifierMethodClass.getDeclaredMethod( getIdentifierMethodName, (Class[]) null ), - setIdentifierMethodName==null - ? null - : setIdentifierMethodClass.getDeclaredMethod(setIdentifierMethodName, setIdentifierMethodParams), - componentIdType, - getId(), - null - ); - - setReadOnlyBeforeAttachedToSession( ( CGLIBLazyInitializer ) proxy.getHibernateLazyInitializer() ); - return proxy; - } - catch (NoSuchMethodException nsme) { - throw new HibernateException("could not create proxy for entity: " + getEntityName(), nsme); - } - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/tool/instrument/cglib/InstrumentTask.java b/hibernate-core/src/main/java/org/hibernate/tool/instrument/cglib/InstrumentTask.java deleted file mode 100644 index db367b5470..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/tool/instrument/cglib/InstrumentTask.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2010, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.tool.instrument.cglib; - -import org.hibernate.bytecode.buildtime.CGLIBInstrumenter; -import org.hibernate.bytecode.buildtime.Instrumenter; -import org.hibernate.bytecode.buildtime.Logger; -import org.hibernate.tool.instrument.BasicInstrumentationTask; - -/** - * An Ant task for instrumenting persistent classes in order to enable - * field-level interception using CGLIB. - *

- * In order to use this task, typically you would define a a taskdef - * similar to:

- * 
- *     
- * 
- * 
- * where lib.class.path is an ANT path reference containing all the - * required Hibernate and CGLIB libraries. - *

- * And then use it like:

- * 
- *     
- *         
- *         ...
- *     
- * 
- * 
- * where the nested ANT fileset includes the class you would like to have - * instrumented. - *

- * Optionally you can chose to enable "Extended Instrumentation" if desired - * by specifying the extended attribute on the task:

- * 
- *     ...
- * 
- * 
- * See the Hibernate manual regarding this option. - * - * @author Gavin King - * @author Steve Ebersole - * - * @deprecated Per HHH-5451 support for cglib as a bytecode provider has been deprecated; use - * {@link org.hibernate.tool.instrument.javassist.InstrumentTask} instead - */ -@Deprecated -public class InstrumentTask extends BasicInstrumentationTask { - public InstrumentTask() { - System.err.println( "Per HHH-5451 support for cglib as a bytecode provider has been deprecated." ); - } - - @Override - protected Instrumenter buildInstrumenter(Logger logger, Instrumenter.Options options) { - return new CGLIBInstrumenter( logger, options ); - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java deleted file mode 100644 index e189e56f03..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2011, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.test.bytecode.cglib; -import java.lang.reflect.Field; - -import org.hibernate.Session; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; -import org.hibernate.cfg.Environment; -import org.hibernate.proxy.HibernateProxy; - -import org.junit.Test; - -import org.hibernate.testing.Skip; -import org.hibernate.testing.TestForIssue; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.hibernate.test.bytecode.ProxyBean; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -/** - * Test that the static thread local callback object is cleared out of the proxy class after instantiated. - * This tests that the memory leak reported by HHH-2481 hasn't been re-introduced. - * - * @author Paul Malolepsy - */ -@TestForIssue(jiraKey = "HHH-2481") -public class CGLIBThreadLocalTest extends BaseCoreFunctionalTestCase { - public String[] getMappings() { - return new String[] {"bytecode/Bean.hbm.xml"}; - } - - public static class LocalSkipCheck implements Skip.Matcher { - @Override - public boolean isMatch() { - return !BytecodeProviderImpl.class.isInstance( Environment.getBytecodeProvider() ); - } - } - - @Test - @Skip( - condition = LocalSkipCheck.class, - message = "Environment not configured for CGLIB bytecode provider" - ) - public void testCglibClearing() { - //create the object for the test - Session s = openSession(); - s.beginTransaction(); - ProxyBean proxyBean = new ProxyBean(); - proxyBean.setSomeString( "my-bean" ); - proxyBean.setSomeLong( 1234 ); - s.save( proxyBean ); - s.getTransaction().commit(); - s.close(); - - // read the object as a proxy - s = openSession(); - s.beginTransaction(); - proxyBean = (ProxyBean) s.load( ProxyBean.class, proxyBean.getSomeString() ); - assertTrue( proxyBean instanceof HibernateProxy ); - try { - //check that the static thread callbacks thread local has been cleared out - Field field = proxyBean.getClass().getDeclaredField( "CGLIB$THREAD_CALLBACKS" ); - field.setAccessible( true ); - ThreadLocal threadCallbacksThreadLocal = (ThreadLocal) field.get( null ); - assertTrue( threadCallbacksThreadLocal.get() == null ); - } - catch (NoSuchFieldException e1) { - fail( "unable to find CGLIB$THREAD_CALLBACKS field in proxy." ); - } - catch (Throwable t) { - fail( "unexpected exception type : " + t ); - } - finally { - //clean up - s.delete( proxyBean ); - s.getTransaction().commit(); - s.close(); - } - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java deleted file mode 100644 index d34203d8f2..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2011, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.test.bytecode.cglib; - -import java.text.ParseException; - -import org.hibernate.Hibernate; -import org.hibernate.Session; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; -import org.hibernate.cfg.Environment; - -import org.junit.Test; - -import org.hibernate.testing.Skip; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.hibernate.test.bytecode.Bean; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.fail; - -/** - * Test that the Javassist-based lazy initializer properly handles InvocationTargetExceptions - * - * @author Steve Ebersole - */ -@Skip( - condition = InvocationTargetExceptionTest.LocalSkipMatcher.class, - message = "environment not configured for cglib bytecode provider" -) -public class InvocationTargetExceptionTest extends BaseCoreFunctionalTestCase { - public static class LocalSkipMatcher implements Skip.Matcher { - @Override - public boolean isMatch() { - return ! BytecodeProviderImpl.class.isInstance( Environment.getBytecodeProvider() ); - } - } - - @Override - public String[] getMappings() { - return new String[] { "bytecode/Bean.hbm.xml" }; - } - - @Test - public void testProxiedInvocationException() { - Session s = openSession(); - s.beginTransaction(); - Bean bean = new Bean(); - bean.setSomeString( "my-bean" ); - s.save( bean ); - s.getTransaction().commit(); - s.close(); - - s = openSession(); - s.beginTransaction(); - bean = ( Bean ) s.load( Bean.class, bean.getSomeString() ); - assertFalse( Hibernate.isInitialized( bean ) ); - try { - bean.throwException(); - fail( "exception not thrown" ); - } - catch ( ParseException e ) { - // expected behavior - } - catch( Throwable t ) { - fail( "unexpected exception type : " + t ); - } - - s.delete( bean ); - s.getTransaction().commit(); - s.close(); - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java deleted file mode 100644 index 3eae32b076..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2011, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.test.bytecode.cglib; - -import org.hibernate.bytecode.ReflectionOptimizer; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; - -import org.junit.Test; - -import org.hibernate.testing.junit4.BaseUnitTestCase; -import org.hibernate.test.bytecode.Bean; -import org.hibernate.test.bytecode.BeanReflectionHelper; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * @author Steve Ebersole - */ -public class ReflectionOptimizerTest extends BaseUnitTestCase { - @Test - public void testReflectionOptimization() { - BytecodeProviderImpl provider = new BytecodeProviderImpl(); - ReflectionOptimizer optimizer = provider.getReflectionOptimizer( - Bean.class, - BeanReflectionHelper.getGetterNames(), - BeanReflectionHelper.getSetterNames(), - BeanReflectionHelper.getTypes() - ); - assertNotNull( optimizer ); - assertNotNull( optimizer.getInstantiationOptimizer() ); - assertNotNull( optimizer.getAccessOptimizer() ); - - Object instance = optimizer.getInstantiationOptimizer().newInstance(); - assertEquals( instance.getClass(), Bean.class ); - Bean bean = ( Bean ) instance; - - optimizer.getAccessOptimizer().setPropertyValues( bean, BeanReflectionHelper.TEST_VALUES ); - assertEquals( bean.getSomeString(), BeanReflectionHelper.TEST_VALUES[0] ); - Object[] values = optimizer.getAccessOptimizer().getPropertyValues( bean ); - assertEquivalent( values, BeanReflectionHelper.TEST_VALUES ); - } - - private void assertEquivalent(Object[] checkValues, Object[] values) { - assertEquals( "Different lengths", checkValues.length, values.length ); - for ( int i = 0; i < checkValues.length; i++ ) { - assertEquals( "different values at index [" + i + "]", checkValues[i], values[i] ); - } - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java b/hibernate-core/src/test/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java deleted file mode 100644 index 4938684e44..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2011, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.test.instrument.runtime; - -import org.hibernate.bytecode.BytecodeProvider; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; - -/** - * @author Steve Ebersole - */ -public class CGLIBInstrumentationTest extends AbstractTransformingClassLoaderInstrumentTestCase { - protected BytecodeProvider buildBytecodeProvider() { - return new BytecodeProviderImpl(); - } -}