replace typeless requests with anonymous implementations

This commit is contained in:
Vaci Koblizek 2020-11-27 10:19:06 +00:00
parent 585a21259e
commit 6e5bcc62ae
4 changed files with 92 additions and 151 deletions

View file

@ -1637,7 +1637,7 @@ final class RpcState<VatId> {
private Request<AnyPointer.Builder> newCallNoIntercept(long interfaceId, short methodId) { private Request<AnyPointer.Builder> newCallNoIntercept(long interfaceId, short methodId) {
if (isDisconnected()) { if (isDisconnected()) {
return Request.newBrokenRequest(AnyPointer.factory, disconnected); return Capability.newBrokenRequest(disconnected);
} }
var request = new RpcRequest(this); var request = new RpcRequest(this);
@ -1645,7 +1645,7 @@ final class RpcState<VatId> {
callBuilder.setInterfaceId(interfaceId); callBuilder.setInterfaceId(interfaceId);
callBuilder.setMethodId(methodId); callBuilder.setMethodId(methodId);
var root = request.getRoot(); var root = request.getRoot();
return new AnyPointer.Request(root, request); return Capability.newTypelessRequest(root, request);
} }
} }
@ -1689,7 +1689,7 @@ final class RpcState<VatId> {
if (redirect != null) { if (redirect != null) {
var redirected = redirect.newCall( var redirected = redirect.newCall(
this.callBuilder.getInterfaceId(), this.callBuilder.getMethodId()); this.callBuilder.getInterfaceId(), this.callBuilder.getMethodId());
var replacement = new AnyPointer.Request(paramsBuilder, redirected.getHook()); var replacement = Capability.newTypelessRequest(paramsBuilder, redirected.getHook());
return replacement.sendInternal(); return replacement.sendInternal();
} }

View file

@ -21,8 +21,6 @@
package org.capnproto; package org.capnproto;
import java.util.concurrent.CompletableFuture;
public final class AnyPointer { public final class AnyPointer {
public static final class Factory public static final class Factory
implements PointerFactory<Builder, Reader>, implements PointerFactory<Builder, Reader>,
@ -189,86 +187,4 @@ public final class AnyPointer {
return new Pipeline(this.hook, newOps); return new Pipeline(this.hook, newOps);
} }
} }
public static final class Request
implements org.capnproto.Request<Builder> {
private final Builder params;
private final RequestHook requestHook;
Request(Builder params, RequestHook requestHook) {
this.params = params;
this.requestHook = requestHook;
}
@Override
public Builder getParams() {
return this.params;
}
@Override
public org.capnproto.Request<Builder> getTypelessRequest() {
return this;
}
@Override
public org.capnproto.Request<Builder> getBaseRequest() {
return this;
}
@Override
public RequestHook getHook() {
return this.requestHook;
}
@Override
public FromPointerBuilder<Builder> getParamsFactory() {
return AnyPointer.factory;
}
@Override
public RemotePromise<Reader> sendInternal() {
return this.requestHook.send();
}
}
public static final class StreamingRequest
implements org.capnproto.StreamingRequest<Builder> {
private final Builder params;
private final RequestHook requestHook;
StreamingRequest(AnyPointer.Request request) {
this(request.params, request.requestHook);
}
StreamingRequest(Builder params, RequestHook requestHook) {
this.params = params;
this.requestHook = requestHook;
}
@Override
public Builder getParams() {
return this.params;
}
@Override
public org.capnproto.StreamingRequest<Builder> getTypelessRequest() {
return this;
}
@Override
public RequestHook getHook() {
return this.requestHook;
}
@Override
public FromPointerBuilder<Builder> getParamsFactory() {
return AnyPointer.factory;
}
public CompletableFuture<java.lang.Void> send() {
return this.requestHook.sendStreaming();
}
}
} }

View file

@ -109,7 +109,7 @@ public final class Capability {
default <T> StreamingRequest<T> newStreamingCall(FromPointerBuilder<T> paramsFactory, long interfaceId, short methodId) { default <T> StreamingRequest<T> newStreamingCall(FromPointerBuilder<T> paramsFactory, long interfaceId, short methodId) {
var request = this.getHook().newCall(interfaceId, methodId); var request = this.getHook().newCall(interfaceId, methodId);
var streamingRequest = new AnyPointer.StreamingRequest(request.getParams(), request.getHook()); var streamingRequest = newTypelessStreamingRequest(request.getParams(), request.getHook());
return new StreamingRequest<>() { return new StreamingRequest<>() {
@Override @Override
public FromPointerBuilder<T> getParamsFactory() { public FromPointerBuilder<T> getParamsFactory() {
@ -204,7 +204,7 @@ public final class Capability {
public Request<AnyPointer.Builder> newCall(long interfaceId, short methodId) { public Request<AnyPointer.Builder> newCall(long interfaceId, short methodId) {
var hook = new LocalRequest(interfaceId, methodId, this); var hook = new LocalRequest(interfaceId, methodId, this);
var root = hook.message.getRoot(AnyPointer.factory); var root = hook.message.getRoot(AnyPointer.factory);
return new AnyPointer.Request(root, hook); return newTypelessRequest(root, hook);
} }
@Override @Override
@ -556,6 +556,89 @@ public final class Capability {
} }
} }
static Request<AnyPointer.Builder> newTypelessRequest(AnyPointer.Builder params, RequestHook requestHook) {
return new Request<>() {
@Override
public AnyPointer.Builder getParams() {
return params;
}
@Override
public org.capnproto.Request<AnyPointer.Builder> getTypelessRequest() {
return this;
}
@Override
public org.capnproto.Request<AnyPointer.Builder> getBaseRequest() {
return this;
}
@Override
public RequestHook getHook() {
return requestHook;
}
@Override
public FromPointerBuilder<AnyPointer.Builder> getParamsFactory() {
return AnyPointer.factory;
}
@Override
public RemotePromise<AnyPointer.Reader> sendInternal() {
return requestHook.send();
}
};
}
static StreamingRequest<AnyPointer.Builder> newTypelessStreamingRequest(AnyPointer.Builder params, RequestHook requestHook) {
return new StreamingRequest<>() {
@Override
public AnyPointer.Builder getParams() {
return params;
}
@Override
public org.capnproto.StreamingRequest<AnyPointer.Builder> getTypelessRequest() {
return this;
}
@Override
public RequestHook getHook() {
return requestHook;
}
@Override
public FromPointerBuilder<AnyPointer.Builder> getParamsFactory() {
return AnyPointer.factory;
}
public CompletableFuture<java.lang.Void> send() {
return requestHook.sendStreaming();
}
};
}
static Request<AnyPointer.Builder> newBrokenRequest(Throwable exc) {
var message = new MessageBuilder();
var params = message.getRoot(AnyPointer.factory);
var hook = new RequestHook() {
@Override
public RemotePromise<AnyPointer.Reader> send() {
return new RemotePromise<>(CompletableFuture.failedFuture(exc),
new AnyPointer.Pipeline(PipelineHook.newBrokenPipeline(exc)));
}
@Override
public CompletableFuture<java.lang.Void> sendStreaming() {
return CompletableFuture.failedFuture(exc);
}
};
return Capability.newTypelessRequest(params, hook);
}
public static ClientHook newBrokenCap(String reason) { public static ClientHook newBrokenCap(String reason) {
return newBrokenClient(reason, false, ClientHook.BROKEN_CAPABILITY_BRAND); return newBrokenClient(reason, false, ClientHook.BROKEN_CAPABILITY_BRAND);
} }
@ -568,16 +651,15 @@ public final class Capability {
return newBrokenClient(RpcException.failed("Called null capability"), true, ClientHook.NULL_CAPABILITY_BRAND); return newBrokenClient(RpcException.failed("Called null capability"), true, ClientHook.NULL_CAPABILITY_BRAND);
} }
static private ClientHook newBrokenClient(String reason, boolean resolved, Object brand) { private static ClientHook newBrokenClient(String reason, boolean resolved, Object brand) {
return newBrokenClient(RpcException.failed(reason), resolved, brand); return newBrokenClient(RpcException.failed(reason), resolved, brand);
} }
static private ClientHook newBrokenClient(Throwable exc, boolean resolved, Object brand) { private static ClientHook newBrokenClient(Throwable exc, boolean resolved, Object brand) {
return new ClientHook() { return new ClientHook() {
@Override @Override
public Request<AnyPointer.Builder> newCall(long interfaceId, short methodId) { public Request<AnyPointer.Builder> newCall(long interfaceId, short methodId) {
var broken = Request.newBrokenRequest(AnyPointer.factory, exc); return newBrokenRequest(exc);
return new AnyPointer.Request(broken.getParams(), broken.getHook());
} }
@Override @Override
@ -689,7 +771,7 @@ public final class Capability {
var hook = new LocalRequest(interfaceId, methodId, this); var hook = new LocalRequest(interfaceId, methodId, this);
this.pendingCalls.add(hook); this.pendingCalls.add(hook);
var root = hook.message.getRoot(AnyPointer.factory); var root = hook.message.getRoot(AnyPointer.factory);
return new AnyPointer.Request(root, hook); return newTypelessRequest(root, hook);
} }
@Override @Override

View file

@ -14,61 +14,4 @@ public interface Request<Params>
default RequestBase<AnyPointer.Builder> getTypelessRequest() { default RequestBase<AnyPointer.Builder> getTypelessRequest() {
return getBaseRequest().getTypelessRequest(); return getBaseRequest().getTypelessRequest();
} }
static <Params> Request<Params> newBrokenRequest(FromPointerBuilder<Params> paramsFactory,
Throwable exc) {
var message = new MessageBuilder();
var hook = new RequestHook() {
@Override
public RemotePromise<AnyPointer.Reader> send() {
return new RemotePromise<>(CompletableFuture.failedFuture(exc),
new AnyPointer.Pipeline(PipelineHook.newBrokenPipeline(exc)));
}
@Override
public CompletableFuture<java.lang.Void> sendStreaming() {
return CompletableFuture.failedFuture(exc);
}
};
return new Request<>() {
@Override
public FromPointerBuilder<Params> getParamsFactory() {
return paramsFactory;
}
@Override
public RequestBase<AnyPointer.Builder> getTypelessRequest() {
return new AnyPointer.Request(message.getRoot(AnyPointer.factory), hook);
}
@Override
public Request<Params> getBaseRequest() {
return this;
}
};
}
static <Params> Request<Params> fromTypeless(
FromPointerBuilder<Params> paramsFactory,
Request<AnyPointer.Builder> typeless) {
return new Request<>() {
@Override
public FromPointerBuilder<Params> getParamsFactory() {
return paramsFactory;
}
@Override
public Request<AnyPointer.Builder> getTypelessRequest() {
return typeless;
}
@Override
public Request<Params> getBaseRequest() {
return this;
}
};
}
} }