
shz.core.model.Request Maven / Gradle / Ivy
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