All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.proxy.ProxyConfiguration Maven / Gradle / Ivy

There is a newer version: 6.6.2.Final
Show newest version
/*
 * 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 .
 */
package org.hibernate.proxy;

import java.lang.reflect.Method;

import org.hibernate.engine.spi.PrimeAmongSecondarySupertypes;

import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.FieldValue;
import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.StubValue;
import net.bytebuddy.implementation.bind.annotation.This;

/**
 * A proxy configuration allows the definition of an interceptor object that decides on the behavior of a proxy.
 * This interface is meant for internal use but is in a public package in order to provide code generation.
 * 

* While this interface depends on Byte Buddy types, this is only true for annotation types which are silently * suppressed by the runtime if they are not available on a class loader. This allows using this interceptor * and configuration with for example OSGi without any export of Byte Buddy when using Hibernate. */ public interface ProxyConfiguration extends PrimeAmongSecondarySupertypes { /** * The canonical field name for an interceptor object stored in a proxied object. */ String INTERCEPTOR_FIELD_NAME = "$$_hibernate_interceptor"; /** * Defines an interceptor object that specifies the behavior of the proxy object. * * @param interceptor The interceptor object. */ void $$_hibernate_set_interceptor(Interceptor interceptor); @Override default ProxyConfiguration asProxyConfiguration() { return this; } /** * An interceptor object that is responsible for invoking a proxy's method. */ interface Interceptor { /** * Intercepts a method call to a proxy. * * @param instance The proxied instance. * @param method The invoked method. * @param arguments The intercepted method arguments. * * @return The method's return value. * * @throws Throwable If the intercepted method raises an exception. */ @RuntimeType Object intercept(@This Object instance, @Origin Method method, @AllArguments Object[] arguments) throws Throwable; } /** * A static interceptor that guards against method calls before the interceptor is set. */ class InterceptorDispatcher { /** * Intercepts a method call to a proxy. * * @param instance The proxied instance. * @param method The invoked method. * @param arguments The method arguments. * @param stubValue The intercepted method's default value. * @param interceptor The proxy object's interceptor instance. * * @return The intercepted method's return value. * * @throws Throwable If the intercepted method raises an exception. */ @RuntimeType public static Object intercept( @This final Object instance, @Origin final Method method, @AllArguments final Object[] arguments, @StubValue final Object stubValue, @FieldValue(INTERCEPTOR_FIELD_NAME) Interceptor interceptor ) throws Throwable { if ( interceptor == null ) { if ( method.getName().equals( "getHibernateLazyInitializer" ) ) { return instance; } else { return stubValue; } } else { return interceptor.intercept( instance, method, arguments ); } } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy