prep for generated code

This commit is contained in:
Vaci Koblizek 2020-10-06 17:44:54 +01:00
parent be64ced181
commit b94f2d6c8c
4 changed files with 66 additions and 44 deletions

View file

@ -69,7 +69,7 @@ public final class AnyPointer {
return factory.fromPointerReader(this.segment, this.capTable, this.pointer, this.nestingLimit); return factory.fromPointerReader(this.segment, this.capTable, this.pointer, this.nestingLimit);
} }
public final Capability.Client getAsCapability() { public final Capability.Client getAsCap() {
return new Capability.Client( return new Capability.Client(
WireHelpers.readCapabilityPointer(this.segment, capTable, this.pointer, 0)); WireHelpers.readCapabilityPointer(this.segment, capTable, this.pointer, 0));
} }
@ -129,7 +129,12 @@ public final class AnyPointer {
factory.setPointerBuilder(this.segment, this.capTable, this.pointer, reader); factory.setPointerBuilder(this.segment, this.capTable, this.pointer, reader);
} }
public final void setAsCapability(Capability.Client cap) { public final Capability.Client getAsCap() {
return new Capability.Client(
WireHelpers.readCapabilityPointer(this.segment, capTable, this.pointer, 0));
}
public final void setAsCap(Capability.Client cap) {
WireHelpers.setCapabilityPointer(this.segment, capTable, this.pointer, cap.hook); WireHelpers.setCapabilityPointer(this.segment, capTable, this.pointer, cap.hook);
} }

View file

@ -1,5 +1,5 @@
package org.capnproto; package org.capnproto;
interface CapTableReader { public interface CapTableReader {
ClientHook extractCap(int index); ClientHook extractCap(int index);
} }

View file

@ -4,11 +4,11 @@ import java.util.concurrent.CompletableFuture;
public final class Capability { public final class Capability {
static abstract class BuilderContext { public static abstract class BuilderContext {
CapTableBuilder capTable; CapTableBuilder capTable;
} }
static class ReaderContext { public static class ReaderContext {
CapTableReader capTable; CapTableReader capTable;
} }
@ -36,6 +36,10 @@ public final class Capability {
this(newBrokenCap(exc)); this(newBrokenCap(exc));
} }
public ClientHook getHook() {
return this.hook;
}
private static ClientHook makeLocalClient(Server server) { private static ClientHook makeLocalClient(Server server) {
return server.makeLocalClient(); return server.makeLocalClient();
} }
@ -127,12 +131,12 @@ public final class Capability {
interfaceId, interfaceId,
methodId, methodId,
new CallContext<>(AnyPointer.factory, AnyPointer.factory, context)); new CallContext<>(AnyPointer.factory, AnyPointer.factory, context));
if (result.streaming) { if (result.isStreaming()) {
// TODO streaming // TODO streaming
return null; return null;
} }
else { else {
return result.promise; return result.getPromise();
} }
} }
@ -147,34 +151,6 @@ public final class Capability {
} }
} }
public static final class DispatchCallResult {
private final CompletableFuture<?> promise;
private final boolean streaming;
public DispatchCallResult(CompletableFuture<?> promise) {
this.promise = promise;
this.streaming = false;
}
DispatchCallResult(Throwable exc) {
this.promise = CompletableFuture.failedFuture(exc);
this.streaming = false;
}
DispatchCallResult(CompletableFuture<?> promise, boolean isStreaming) {
this.promise = promise;
this.streaming = isStreaming;
}
public CompletableFuture<?> getPromise() {
return promise;
}
public boolean isStreaming() {
return streaming;
}
}
public CompletableFuture<Client> shortenPath() { public CompletableFuture<Client> shortenPath() {
return null; return null;
} }
@ -183,28 +159,43 @@ public final class Capability {
return new Client(this.hook); return new Client(this.hook);
} }
protected final <Params, Results> CallContext<Params, Results> internalGetTypedContext( protected static <Params, Results> CallContext<Params, Results> typedContext(
FromPointerReader<Params> paramsFactory, FromPointerReader<Params> paramsFactory,
FromPointerBuilder<Results> resultsFactory, FromPointerBuilder<Results> resultsFactory,
CallContext<AnyPointer.Reader, AnyPointer.Builder> typeless) { CallContext<AnyPointer.Reader, AnyPointer.Builder> typeless) {
return new CallContext<>(paramsFactory, resultsFactory, typeless.hook); return new CallContext<>(paramsFactory, resultsFactory, typeless.hook);
} }
public abstract DispatchCallResult dispatchCall(long interfaceId, short methodId, protected abstract DispatchCallResult dispatchCall(
CallContext<AnyPointer.Reader, AnyPointer.Builder> context); long interfaceId, short methodId,
CallContext<AnyPointer.Reader, AnyPointer.Builder> context);
protected DispatchCallResult internalUnimplemented(String actualInterfaceName, long requestedTypeId) { protected static DispatchCallResult streamResult(CompletableFuture<?> result) {
return new DispatchCallResult(RpcException.unimplemented( // For streaming calls, we need to add an evalNow() here so that exceptions thrown
// directly from the call can propagate to later calls. If we don't capture the
// exception properly then the caller will never find out that this is a streaming
// call (indicated by the boolean in the return value) so won't know to propagate
// the exception.
// TODO the above comment...
return new DispatchCallResult(result, true);
}
protected static DispatchCallResult result(CompletableFuture<?> result) {
return new DispatchCallResult(result, false);
}
protected static CompletableFuture<?> internalUnimplemented(String actualInterfaceName, long requestedTypeId) {
return CompletableFuture.failedFuture(RpcException.unimplemented(
"Method not implemented. " + actualInterfaceName + " " + requestedTypeId)); "Method not implemented. " + actualInterfaceName + " " + requestedTypeId));
} }
protected DispatchCallResult internalUnimplemented(String interfaceName, long typeId, short methodId) { protected static CompletableFuture<?> internalUnimplemented(String interfaceName, long typeId, short methodId) {
return new DispatchCallResult(RpcException.unimplemented( return CompletableFuture.failedFuture(RpcException.unimplemented(
"Method not implemented. " + interfaceName + " " + typeId + " " + methodId)); "Method not implemented. " + interfaceName + " " + typeId + " " + methodId));
} }
protected DispatchCallResult internalUnimplemented(String interfaceName, String methodName, long typeId, short methodId) { protected static CompletableFuture<?> internalUnimplemented(String interfaceName, String methodName, long typeId, short methodId) {
return new DispatchCallResult(RpcException.unimplemented( return CompletableFuture.failedFuture(RpcException.unimplemented(
"Method not implemented. " + interfaceName + " " + typeId + " " + methodName + " " + methodId)); "Method not implemented. " + interfaceName + " " + typeId + " " + methodName + " " + methodId));
} }
} }

View file

@ -0,0 +1,26 @@
package org.capnproto;
import java.util.concurrent.CompletableFuture;
public final class DispatchCallResult {
private final CompletableFuture<?> promise;
private final boolean streaming;
public DispatchCallResult(CompletableFuture<?> promise, boolean isStreaming) {
this.promise = promise;
this.streaming = isStreaming;
}
public DispatchCallResult(Throwable exc) {
this(CompletableFuture.failedFuture(exc), false);
}
public CompletableFuture<?> getPromise() {
return promise;
}
public boolean isStreaming() {
return streaming;
}
}