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

com.github.veithen.visualwas.framework.proxy.InvocationStyle Maven / Gradle / Ivy

The newest version!
/*
 * #%L
 * VisualWAS
 * %%
 * Copyright (C) 2013 - 2020 Andreas Veithen
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 * 
 * 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public 
 * License along with this program.  If not, see
 * .
 * #L%
 */
package com.github.veithen.visualwas.framework.proxy;

import java.lang.reflect.Method;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public abstract class InvocationStyle {
    public static final InvocationStyle SYNC = new InvocationStyle() {
        @Override
        MethodInfo getMethodInfo(Method method) {
            if (method.getReturnType() != CompletableFuture.class) {
                return new SyncMethodInfo(method);
            } else {
                return null;
            }
        }

        @Override
        Object invoke(InvocationTarget target, Operation operation, Object[] args) throws Throwable {
            try {
                return target.invoke(new Invocation(operation, this, args)).get();
            } catch (ExecutionException ex) {
                throw ex.getCause();
            }
        }
    };
    
    public static final InvocationStyle ASYNC = new InvocationStyle() {
        @Override
        MethodInfo getMethodInfo(Method method) {
            if (method.getReturnType() == CompletableFuture.class && method.getName().endsWith("Async")) {
                return new AsyncMethodInfo(method);
            } else {
                return null;
            }
        }

        @Override
        Object invoke(InvocationTarget target, Operation operation, Object[] args) throws Throwable {
            return target.invoke(new Invocation(operation, this, args));
        }
    };

    static final InvocationStyle[] INSTANCES = { SYNC, ASYNC };

    abstract MethodInfo getMethodInfo(Method method);
    abstract Object invoke(InvocationTarget target, Operation operation, Object[] args) throws Throwable;
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy