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

shz.core.model.Request Maven / Gradle / Ivy

There is a newer version: 10.3.1
Show newest version
package shz.core.model;

import shz.core.AccessibleHelp;
import shz.core.NullHelp;
import shz.core.AccessibleCacheHelp;
import shz.core.cl.ClassLoaderHelp;
import shz.core.cl.CustomClassLoader;
import shz.core.id.IdPayload;
import shz.core.msg.*;

import java.io.Serializable;
import java.util.Arrays;
import java.util.function.Function;

@SuppressWarnings("unchecked")
public class Request implements Serializable {
    private static final long serialVersionUID = 1334707764364480223L;
    private final ID id;
    private final String version;
    private final T payload;
    private final long timestamp;

    protected Request(ID id, String version, T payload) {
        this.id = id;
        this.version = version;
        this.payload = payload;
        this.timestamp = System.currentTimeMillis();
    }

    public static  Request of(ID id, String version, T payload) {
        return new Request<>(id, version, payload);
    }

    public static  Request of(ID id, T payload) {
        return of(id, "", payload);
    }

    public static  Request of(T payload) {
        return of(null, "", payload);
    }

    public static  Request of(Request request, T payload) {
        return request == null ? of(payload) : of(request.id, request.version, payload);
    }

    public static  Request of(Request request) {
        return of(request, null);
    }

    public final ID id() {
        return id;
    }

    public final String version() {
        return version;
    }

    public final T payload() {
        return payload;
    }

    public final long timestamp() {
        return timestamp;
    }

    @Override
    public String toString() {
        return "Request{" +
                "id=" + id +
                ", version='" + version + '\'' +
                ", payload=" + payload +
                ", timestamp=" + timestamp +
                '}';
    }

    public static final class ClassInfo implements Serializable {
        private static final long serialVersionUID = 3665381348076587378L;
        private final String classpath;
        private final Object[] initargs;
        private final byte[] classByte;

        public ClassInfo(String classpath, Object[] initargs, byte[] classByte) {
            this.classpath = classpath;
            this.initargs = initargs;
            this.classByte = classByte;
        }
    }

    public final  Response> invoke(Function, Object> beanFunc) {
        if (NullHelp.isBlank(id)) return Response.fail(ClientFailureMsg.fail("缺少id"));
        IdPayload idPayload = IdPayload.of(id);
        if (!(payload instanceof RpcPayload)) return Response.fail(ServerFailureMsg.fail("非法调用"), idPayload);
        RpcPayload rpcPayload = (RpcPayload) payload;
        if (NullHelp.isBlank(rpcPayload.className()) || NullHelp.isBlank(rpcPayload.methodName()))
            return Response.fail(ClientFailureMsg.fail("缺少类信息"), idPayload);
        Object receiver = null;
        Object data = rpcPayload.data();
        if (data instanceof ClassInfo) {
            ClassInfo classInfo = (ClassInfo) data;
            if (NullHelp.nonEmpty(classInfo.classByte)) {
                CustomClassLoader cl = new CustomClassLoader(t -> classInfo.classByte);
                Class cls = ClassLoaderHelp.load(rpcPayload.className(), true, cl);
                receiver = AccessibleHelp.newInstance(cls, classInfo.initargs);
            }
            if (receiver == null && NullHelp.nonBlank(classInfo.classpath)) {
                CustomClassLoader cl = CustomClassLoader.of(classInfo.classpath);
                Class cls = ClassLoaderHelp.load(rpcPayload.className(), true, cl);
                receiver = AccessibleHelp.newInstance(cls, classInfo.initargs);
            }
        }
        if (receiver == null && beanFunc != null) try {
            receiver = beanFunc.apply(ClassLoaderHelp.load(rpcPayload.className()));
        } catch (Throwable t) {
            return Response.fail(FailureMsg.fail(t), idPayload);
        }
        if (receiver == null) return Response.fail(ServerFailureMsg.fail("缺少实例"), idPayload);
        Object invoke;
        try {
            Class[] ptypes = Arrays.stream(rpcPayload.ptypes()).map(ClassLoaderHelp::load).toArray(Class[]::new);
            invoke = NullHelp.isBlank(rpcPayload.rtype())
                    ? AccessibleCacheHelp.invoke(receiver, rpcPayload.methodName(), ptypes, rpcPayload.args())
                    : AccessibleHelp.invoke(receiver, rpcPayload.methodName(), ClassLoaderHelp.load(rpcPayload.rtype()), ptypes, rpcPayload.args());
        } catch (Throwable t) {
            return Response.fail(FailureMsg.fail(t), idPayload);
        }
        if (invoke == null) return Response.ok(idPayload);
        if (invoke instanceof Response) {
            Response response = (Response) invoke;
            return Response.of(response, IdPayload.of(id, (R) response.getPayload()));
        }
        return Response.ok(IdPayload.of(id, (R) invoke));
    }

    public final  Response> invoke() {
        return invoke(AccessibleHelp::newInstance);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy