HHH-13061 Introduce a 'none' option for BytecodeProvider implementation choice
This commit is contained in:
parent
817e463764
commit
04fbabce2e
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.bytecode.internal.none;
|
||||
|
||||
import org.hibernate.HibernateException;
|
||||
import org.hibernate.bytecode.enhance.spi.EnhancementContext;
|
||||
import org.hibernate.bytecode.enhance.spi.Enhancer;
|
||||
import org.hibernate.bytecode.spi.BytecodeProvider;
|
||||
import org.hibernate.bytecode.spi.ProxyFactoryFactory;
|
||||
import org.hibernate.bytecode.spi.ReflectionOptimizer;
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
|
||||
/**
|
||||
* This BytecodeProvider represents the "no-op" enhancer; mostly useful
|
||||
* as an optimisation when not needing any byte code optimisation applied,
|
||||
* for example when the entities have been enhanced at compile time.
|
||||
* Choosing this BytecodeProvider allows to exclude the bytecode enhancement
|
||||
* libraries from the runtime classpath, but is not compatible
|
||||
* with the option AvailableSettings#USE_REFLECTION_OPTIMIZER .
|
||||
*
|
||||
* @since 5.4
|
||||
*/
|
||||
public final class BytecodeProviderImpl implements BytecodeProvider {
|
||||
|
||||
@Override
|
||||
public ProxyFactoryFactory getProxyFactoryFactory() {
|
||||
return new NoProxyFactoryFactory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReflectionOptimizer getReflectionOptimizer(
|
||||
Class clazz,
|
||||
String[] getterNames,
|
||||
String[] setterNames,
|
||||
Class[] types) {
|
||||
throw new HibernateException( "Using the ReflectionOptimizer is not possible when the configured BytecodeProvider is 'none'. Disable " + AvailableSettings.USE_REFLECTION_OPTIMIZER + " or use a different BytecodeProvider");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enhancer getEnhancer(EnhancementContext enhancementContext) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.bytecode.internal.none;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.HibernateException;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||
import org.hibernate.proxy.HibernateProxy;
|
||||
import org.hibernate.proxy.ProxyFactory;
|
||||
import org.hibernate.type.CompositeType;
|
||||
|
||||
final class DisallowedProxyFactory implements ProxyFactory {
|
||||
|
||||
static final DisallowedProxyFactory INSTANCE = new DisallowedProxyFactory();
|
||||
|
||||
@Override
|
||||
public void postInstantiate(
|
||||
String entityName,
|
||||
Class persistentClass,
|
||||
Set<Class> interfaces,
|
||||
Method getIdentifierMethod,
|
||||
Method setIdentifierMethod,
|
||||
CompositeType componentIdType) throws HibernateException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateProxy getProxy(Serializable id, SharedSessionContractImplementor session) throws HibernateException {
|
||||
throw new HibernateException( "Generation of HibernateProxy instances at runtime is not allowed when the configured BytecodeProvider is 'none'; your model requires a more advanced BytecodeProvider to be enabled." );
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.bytecode.internal.none;
|
||||
|
||||
import org.hibernate.bytecode.spi.BasicProxyFactory;
|
||||
import org.hibernate.bytecode.spi.ProxyFactoryFactory;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.proxy.ProxyFactory;
|
||||
|
||||
|
||||
/**
|
||||
* When entities are enhanced in advance, proxies are not needed.
|
||||
*/
|
||||
final class NoProxyFactoryFactory implements ProxyFactoryFactory {
|
||||
|
||||
@Override
|
||||
public ProxyFactory buildProxyFactory(SessionFactoryImplementor sessionFactory) {
|
||||
return DisallowedProxyFactory.INSTANCE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BasicProxyFactory buildBasicProxyFactory(Class superClass, Class[] interfaces) {
|
||||
return new NoneBasicProxyFactory( superClass, interfaces );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.bytecode.internal.none;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.hibernate.HibernateException;
|
||||
import org.hibernate.bytecode.spi.BasicProxyFactory;
|
||||
|
||||
/**
|
||||
* This is used to instantiate "components" which are either Abstract or defined by an Interface.
|
||||
*/
|
||||
final class NoneBasicProxyFactory implements BasicProxyFactory {
|
||||
|
||||
private final Class superClass;
|
||||
private final Class[] interfaces;
|
||||
|
||||
public NoneBasicProxyFactory(Class superClass, Class[] interfaces) {
|
||||
this.superClass = superClass;
|
||||
this.interfaces = interfaces;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getProxy() {
|
||||
throw new HibernateException( "NoneBasicProxyFactory is unable to generate a BasicProxy for type " + superClass + " and interfaces " + Arrays.toString( interfaces ) + ". Enable a different BytecodeProvider." );
|
||||
}
|
||||
|
||||
}
|
|
@ -329,6 +329,7 @@ public final class Environment implements AvailableSettings {
|
|||
|
||||
public static final String BYTECODE_PROVIDER_NAME_JAVASSIST = "javassist";
|
||||
public static final String BYTECODE_PROVIDER_NAME_BYTEBUDDY = "bytebuddy";
|
||||
public static final String BYTECODE_PROVIDER_NAME_NONE = "none";
|
||||
public static final String BYTECODE_PROVIDER_NAME_DEFAULT = BYTECODE_PROVIDER_NAME_BYTEBUDDY;
|
||||
|
||||
public static BytecodeProvider buildBytecodeProvider(Properties properties) {
|
||||
|
@ -337,6 +338,9 @@ public final class Environment implements AvailableSettings {
|
|||
}
|
||||
|
||||
private static BytecodeProvider buildBytecodeProvider(String providerName) {
|
||||
if ( BYTECODE_PROVIDER_NAME_NONE.equals( providerName ) ) {
|
||||
return new org.hibernate.bytecode.internal.none.BytecodeProviderImpl();
|
||||
}
|
||||
if ( BYTECODE_PROVIDER_NAME_BYTEBUDDY.equals( providerName ) ) {
|
||||
return new org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue