Skip to content

Commit

Permalink
feat(transcoding): added http method check and code refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
zZHorizonZz committed Apr 24, 2024
1 parent 44ac07c commit 82bde60
Show file tree
Hide file tree
Showing 22 changed files with 298 additions and 581 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.google.protobuf.Message;

public interface MutinyTranscodingService {
public interface GrpcTranscoding {

String getGrpcServiceName();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
import io.quarkus.grpc.GlobalInterceptor;
import io.quarkus.grpc.GrpcClient;
import io.quarkus.grpc.GrpcService;
import io.quarkus.grpc.GrpcTranscoding;
import io.quarkus.grpc.GrpcTranscodingMethod;
import io.quarkus.grpc.MutinyBean;
import io.quarkus.grpc.MutinyClient;
import io.quarkus.grpc.MutinyGrpc;
import io.quarkus.grpc.MutinyService;
import io.quarkus.grpc.MutinyStub;
import io.quarkus.grpc.MutinyTranscodingService;
import io.quarkus.grpc.RegisterClientInterceptor;
import io.quarkus.grpc.RegisterInterceptor;
import io.quarkus.grpc.RegisterInterceptors;
Expand Down Expand Up @@ -51,7 +51,7 @@ public class GrpcDotNames {
public static final DotName MUTINY_BEAN = DotName.createSimple(MutinyBean.class.getName());
public static final DotName MUTINY_SERVICE = DotName.createSimple(MutinyService.class.getName());

public static final DotName MUTINY_TRANSCODING_SERVICE = DotName.createSimple(MutinyTranscodingService.class.getName());
public static final DotName GRPC_TRANSCODING = DotName.createSimple(GrpcTranscoding.class.getName());
public static final DotName GRPC_METHOD = DotName.createSimple(GrpcTranscodingMethod.class.getName());

public static final DotName GLOBAL_INTERCEPTOR = DotName.createSimple(GlobalInterceptor.class.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,6 @@ ServiceStartBuildItem initializeServer(GrpcServerRecorder recorder,
List<RecorderBeanInitializedBuildItem> orderEnforcer,
LaunchModeBuildItem launchModeBuildItem,
VertxWebRouterBuildItem routerBuildItem,
GrpcTranscodingServerBuildItem transcodingServerBuildItem,
VertxBuildItem vertx, Capabilities capabilities) {

// Build the list of blocking methods per service implementation
Expand All @@ -705,7 +704,6 @@ ServiceStartBuildItem initializeServer(GrpcServerRecorder recorder,
//Uses mainrouter when the 'quarkus.http.root-path' is not '/'
recorder.initializeGrpcServer(vertx.getVertx(),
routerBuildItem.getMainRouter() != null ? routerBuildItem.getMainRouter() : routerBuildItem.getHttpRouter(),
transcodingServerBuildItem.getTranscodingServer(),
config, shutdown, blocking, virtuals, launchModeBuildItem.getLaunchMode(),
capabilities.isPresent(Capability.SECURITY));
return new ServiceStartBuildItem(GRPC_SERVER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
import org.jboss.jandex.DotName;

import io.quarkus.builder.item.MultiBuildItem;
import io.quarkus.grpc.runtime.transcoding.GrpcTranscodingMethod;
import io.quarkus.grpc.transcoding.GrpcTranscodingMethod;

public final class GrpcMarshallingBuildItem extends MultiBuildItem {
public final class GrpcTranscodingBuildItem extends MultiBuildItem {

final DotName marshallingClass;
final List<GrpcTranscodingMethod> transcodingMethods;

public GrpcMarshallingBuildItem(DotName marshallingClass, List<GrpcTranscodingMethod> transcodingMethods) {
public GrpcTranscodingBuildItem(DotName marshallingClass, List<GrpcTranscodingMethod> transcodingMethods) {
this.marshallingClass = marshallingClass;
this.transcodingMethods = transcodingMethods;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.grpc.runtime.GrpcTranscodingRecorder;
import io.quarkus.grpc.runtime.transcoding.GrpcTranscodingContainer;
import io.quarkus.grpc.runtime.transcoding.GrpcTranscodingMethod;
import io.quarkus.grpc.runtime.transcoding.GrpcTranscodingServer;
import io.quarkus.grpc.transcoding.GrpcTranscodingContainer;
import io.quarkus.grpc.transcoding.GrpcTranscodingMethod;
import io.quarkus.grpc.transcoding.GrpcTranscodingRecorder;
import io.quarkus.grpc.transcoding.GrpcTranscodingServer;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.vertx.deployment.VertxBuildItem;
import io.quarkus.vertx.http.deployment.VertxWebRouterBuildItem;
Expand All @@ -54,20 +54,17 @@ FeatureBuildItem feature() {
@BuildStep
void processGeneratedBeans(CombinedIndexBuildItem index,
BuildProducer<AnnotationsTransformerBuildItem> transformers,
BuildProducer<GrpcMarshallingBuildItem> marshallings,
BuildProducer<GrpcTranscodingBuildItem> marshallings,
BuildProducer<AdditionalBeanBuildItem> delegatingBeans) {
Set<DotName> generatedBeans = new HashSet<>();
Map<String, List<GrpcTranscodingMethod>> methods = new HashMap<>();

for (ClassInfo generatedBean : index.getIndex().getAllKnownImplementors(GrpcDotNames.MUTINY_TRANSCODING_SERVICE)) {
for (ClassInfo generatedBean : index.getIndex().getAllKnownImplementors(GrpcDotNames.GRPC_TRANSCODING)) {
DotName generatedBeanName = generatedBean.name();
generatedBeans.add(generatedBeanName);

// Extract gRPC transcoding configuration from methods and store the results
List<GrpcTranscodingMethod> transcodingMethods = collectTranscodingMethods(generatedBean);
methods.put(generatedBeanName.toString(), transcodingMethods);

marshallings.produce(new GrpcMarshallingBuildItem(generatedBeanName, transcodingMethods));
log.info("Registering a delegating bean for {}", generatedBeanName);
marshallings.produce(new GrpcTranscodingBuildItem(generatedBeanName, transcodingMethods));
}

delegatingBeans.produce(AdditionalBeanBuildItem.unremovableOf(GrpcTranscodingContainer.class));
Expand All @@ -80,6 +77,7 @@ public boolean appliesTo(AnnotationTarget.Kind kind) {

@Override
public void transform(TransformationContext context) {
// Check if the class is a generated gRPC transcoding bean
if (generatedBeans.contains(context.getTarget().asClass().name())) {
context.transform()
.add(BuiltinScope.SINGLETON.getName())
Expand All @@ -95,20 +93,20 @@ public void transform(TransformationContext context) {
GrpcTranscodingServerBuildItem buildTranscoding(GrpcTranscodingRecorder recorder,
VertxBuildItem vertx,
VertxWebRouterBuildItem routerBuildItem,
List<GrpcMarshallingBuildItem> marshallings,
List<GrpcTranscodingBuildItem> marshallings,
Capabilities capabilities,
ShutdownContextBuildItem shutdown) {
// Build a map to organize the collected gRPC transcoding methods by service name
Map<String, List<GrpcTranscodingMethod>> methods = new HashMap<>();
for (GrpcMarshallingBuildItem item : marshallings) {
for (GrpcTranscodingBuildItem item : marshallings) {
String name = item.getMarshallingClass().toString().replace("Marshalling", "");
log.info("Registering transcoding methods for {}", name);
methods.put(name, item.getTranscodingMethods());
}

// Create and initialize the gRPC transcoding server
RuntimeValue<GrpcTranscodingServer> server = recorder.initializeMarshallingServer(vertx.getVertx(),
routerBuildItem.getHttpRouter(), shutdown, methods, capabilities.isPresent(Capability.SECURITY));
return new GrpcTranscodingServerBuildItem(server);
//recorder.buildTranscoding(routerBuildItem.getHttpRouter(), methods, shutdown);
}

private static List<GrpcTranscodingMethod> collectTranscodingMethods(ClassInfo service) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.quarkus.grpc.deployment;

import io.quarkus.builder.item.SimpleBuildItem;
import io.quarkus.grpc.runtime.transcoding.GrpcTranscodingServer;
import io.quarkus.grpc.transcoding.GrpcTranscodingServer;
import io.quarkus.runtime.RuntimeValue;

public final class GrpcTranscodingServerBuildItem extends SimpleBuildItem {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ package {{packageName}};

import jakarta.ws.rs.core.Response;
import io.quarkus.grpc.GrpcService;
import io.quarkus.grpc.MutinyTranscodingService;
import io.quarkus.grpc.GrpcTranscoding;
import io.quarkus.grpc.GrpcTranscodingDescriptor;
import com.google.protobuf.Message;
import com.google.protobuf.util.JsonFormat;
Expand All @@ -13,7 +13,7 @@ import com.google.protobuf.InvalidProtocolBufferException;
@jakarta.annotation.Generated(
value = "by {{classPrefix}} Grpc generator",
comments = "Source: {{protoName}}")
public class {{serviceName}}Marshalling implements MutinyTranscodingService {
public class {{serviceName}}Marshalling implements GrpcTranscoding {
@Override
public String getGrpcServiceName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
import io.quarkus.grpc.runtime.reflection.ReflectionServiceV1alpha;
import io.quarkus.grpc.runtime.supports.CompressionInterceptor;
import io.quarkus.grpc.runtime.supports.blocking.BlockingServerInterceptor;
import io.quarkus.grpc.runtime.transcoding.GrpcTranscodingServer;
import io.quarkus.grpc.spi.GrpcBuilderProvider;
import io.quarkus.runtime.LaunchMode;
import io.quarkus.runtime.QuarkusBindException;
Expand Down Expand Up @@ -93,7 +92,6 @@ public static List<GrpcServiceDefinition> getServices() {

public void initializeGrpcServer(RuntimeValue<Vertx> vertxSupplier,
RuntimeValue<Router> routerSupplier,
RuntimeValue<GrpcTranscodingServer> transcodingServerSupplier,
GrpcConfiguration cfg,
ShutdownContext shutdown,
Map<String, List<String>> blockingMethodsPerService,
Expand Down Expand Up @@ -135,21 +133,19 @@ public void initializeGrpcServer(RuntimeValue<Vertx> vertxSupplier,
launchMode);
}
} else {
buildGrpcServer(vertx, configuration, routerSupplier, transcodingServerSupplier, shutdown,
buildGrpcServer(vertx, configuration, routerSupplier, shutdown,
blockingMethodsPerService, virtualMethodsPerService,
grpcContainer, launchMode, securityPresent);
}
}

// TODO -- handle XDS
private void buildGrpcServer(Vertx vertx, GrpcServerConfiguration configuration, RuntimeValue<Router> routerSupplier,
RuntimeValue<GrpcTranscodingServer> transcodingServerSupplier,
ShutdownContext shutdown, Map<String, List<String>> blockingMethodsPerService,
Map<String, List<String>> virtualMethodsPerService,
GrpcContainer grpcContainer, LaunchMode launchMode, boolean securityPresent) {

GrpcServer server = GrpcServer.server(vertx);
GrpcTranscodingServer transcodingServer = transcodingServerSupplier.getValue();

List<ServerInterceptor> globalInterceptors = grpcContainer.getSortedGlobalInterceptors();

Expand All @@ -169,7 +165,6 @@ private void buildGrpcServer(Vertx vertx, GrpcServerConfiguration configuration,
vertx, grpcContainer, blockingMethodsPerService, virtualMethodsPerService, compressionInterceptor,
globalInterceptors, service,
launchMode == LaunchMode.DEVELOPMENT);
LOGGER.infof("Registered gRPC service '%s'", service.definition.getServiceDescriptor().getName());
GrpcServiceBridge bridge = GrpcServiceBridge.bridge(serviceDefinition);
bridge.bind(server);
definitions.add(service.definition);
Expand Down Expand Up @@ -228,11 +223,6 @@ private static boolean isGrpc(RoutingContext rc) {
return header != null && GRPC_CONTENT_TYPE.matcher(header.toLowerCase(Locale.ROOT)).matches();
}

private static boolean isTranscoding(RoutingContext rc) {
String header = rc.request().getHeader("content-type");
return header != null && header.toLowerCase(Locale.ROOT).startsWith("application/json");
}

private void prodStart(GrpcContainer grpcContainer, Vertx vertx, GrpcServerConfiguration configuration,
GrpcBuilderProvider<?> provider, Map<String, List<String>> blockingMethodsPerService,
Map<String, List<String>> virtualMethodsPerService,
Expand Down Expand Up @@ -411,7 +401,7 @@ public static final class GrpcServiceDefinition {
public final BindableService service;
public final ServerServiceDefinition definition;

GrpcServiceDefinition(BindableService service, ServerServiceDefinition definition) {
public GrpcServiceDefinition(BindableService service, ServerServiceDefinition definition) {
this.service = service;
this.definition = definition;
}
Expand Down
Loading

0 comments on commit 82bde60

Please sign in to comment.