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

io.jexxa.adapterapi.invocation.DefaultInvocationHandler Maven / Gradle / Ivy

package io.jexxa.adapterapi.invocation;

import io.jexxa.adapterapi.interceptor.AfterInterceptor;
import io.jexxa.adapterapi.interceptor.AroundInterceptor;
import io.jexxa.adapterapi.interceptor.BeforeInterceptor;
import io.jexxa.adapterapi.invocation.context.ConsumerInvocationContext;
import io.jexxa.adapterapi.invocation.context.FunctionInvocationContext;
import io.jexxa.adapterapi.invocation.context.MethodInvocationContext;
import io.jexxa.adapterapi.invocation.context.RunnableInvocationContext;
import io.jexxa.adapterapi.invocation.context.SupplierInvocationContext;
import io.jexxa.adapterapi.invocation.function.SerializableConsumer;
import io.jexxa.adapterapi.invocation.function.SerializableFunction;
import io.jexxa.adapterapi.invocation.function.SerializableRunnable;
import io.jexxa.adapterapi.invocation.function.SerializableSupplier;
import io.jexxa.adapterapi.invocation.transaction.TransactionManager;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 *  @deprecated Use {@link TransactionalInvocationHandler} instead
 */
@SuppressWarnings("UnusedReturnValue")
@Deprecated(forRemoval = true)
public class DefaultInvocationHandler implements AroundInterceptor, BeforeInterceptor, AfterInterceptor, JexxaInvocationHandler {
    private final List beforeList = new ArrayList<>();
    private final List afterList = new ArrayList<>();
    private final List aroundList = new ArrayList<>();

    public static final Object GLOBAL_SYNCHRONIZATION_OBJECT = new Object();

    @Override
    public void before(InvocationContext invocationContext)
    {
        beforeList.forEach(element -> element.before(invocationContext));
    }

    @Override
    public void after(InvocationContext invocationContext)
    {
        afterList.forEach(element -> element.after(invocationContext));
    }

    @Override
    public void around(InvocationContext invocationContext)
    {
        invocationContext.proceed();
    }

    @Override
    public DefaultInvocationHandler registerAround(AroundInterceptor interceptor) {
        aroundList.add(interceptor);
        return this;
    }

    @Override
    public DefaultInvocationHandler registerBefore(BeforeInterceptor interceptor) {
        beforeList.add(interceptor);
        return this;
    }

    @Override
    public DefaultInvocationHandler registerAfter(AfterInterceptor interceptor) {
        afterList.add(interceptor);
        return this;
    }

    @Override
    public JexxaInvocationHandler newInstance() {
        return new DefaultInvocationHandler();
    }


    @Override
    public Object invoke(Method method, Object object, Object[] args)
    {
        var invocationContext = new MethodInvocationContext(method, object, args, aroundList);

        invoke(invocationContext);

        return invocationContext.getReturnValue();
    }

    @Override
    public void invoke(Object targetObject, SerializableRunnable runnable)
    {
        var invocationContext = new RunnableInvocationContext(targetObject, runnable, aroundList);
        invoke(invocationContext);
    }

    @Override
    public  void invoke(Object targetObject,SerializableConsumer consumer, T argument)
    {
        var invocationContext = new ConsumerInvocationContext<>(targetObject, consumer, argument, aroundList);
        invoke(invocationContext);
    }

    @Override
    public  T invoke(Object targetObject,SerializableSupplier supplier) {
        var invocationContext = new SupplierInvocationContext<>(targetObject, supplier, aroundList);
        invoke(invocationContext);
        return invocationContext.getReturnValue();
    }

    @Override
    public  R invoke(Object targetObject,SerializableFunction function, T argument) {
        var invocationContext = new FunctionInvocationContext<>(targetObject, function, argument, aroundList);
        invoke(invocationContext);
        return invocationContext.getReturnValue();
    }

    protected void invoke(InvocationContext invocationContext)  {
        synchronized (GLOBAL_SYNCHRONIZATION_OBJECT)
        {
            try {
                TransactionManager.initTransaction();
                before(invocationContext);
                around(invocationContext);
                after(invocationContext);
                TransactionManager.closeTransaction();
            } catch (Exception e) {
                TransactionManager.rollback();
                TransactionManager.closeTransaction();
                throw e;
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy