use of io.quarkus.arc.deployment.GeneratedBeanGizmoAdaptor in project camel-quarkus by apache.
the class GrpcProcessor method createBindableServiceBeans.
@BuildStep
void createBindableServiceBeans(BuildProducer<GeneratedBeanBuildItem> generatedBean, BuildProducer<ReflectiveClassBuildItem> reflectiveClass, CombinedIndexBuildItem combinedIndexBuildItem) {
IndexView index = combinedIndexBuildItem.getIndex();
Collection<ClassInfo> bindableServiceImpls = index.getAllKnownImplementors(BINDABLE_SERVICE_DOT_NAME);
// This mimics similar logic in DefaultBindableServiceFactory that uses Javassist ProxyFactory & MethodHandler
for (ClassInfo service : bindableServiceImpls) {
if (!Modifier.isAbstract(service.flags())) {
continue;
}
if (service.name().withoutPackagePrefix().startsWith("Mutiny")) {
/* The generate-code goal of quarkus-maven-plugin generates also Mutiny service that we do not use
* Not skipping it here results in randomly registering the Mutiny one or the right one.
* In case the Mutiny service one is registered, the client throws something like
* io.grpc.StatusRuntimeException: UNIMPLEMENTED */
continue;
}
String superClassName = service.name().toString();
String generatedClassName = superClassName + "QuarkusMethodHandler";
// Register the service classes for reflection
reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, service.name().toString()));
reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, service.enclosingClass().toString()));
reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, generatedClassName));
try (ClassCreator classCreator = ClassCreator.builder().classOutput(new GeneratedBeanGizmoAdaptor(generatedBean)).className(generatedClassName).superClass(superClassName).interfaces(CamelQuarkusBindableService.class).build()) {
classCreator.addAnnotation(Dependent.class);
FieldCreator serverMethodHandler = classCreator.getFieldCreator("methodHandler", GrpcMethodHandler.class.getName()).setModifiers(Modifier.PRIVATE);
// Create constructor
try (MethodCreator initMethod = classCreator.getMethodCreator("<init>", void.class)) {
initMethod.setModifiers(Modifier.PUBLIC);
initMethod.invokeSpecialMethod(MethodDescriptor.ofMethod(superClassName, "<init>", void.class), initMethod.getThis());
initMethod.returnValue(null);
}
// Create setMethodHandler override
try (MethodCreator setMethodHandlerMethod = classCreator.getMethodCreator("setMethodHandler", void.class, GrpcMethodHandler.class)) {
setMethodHandlerMethod.setModifiers(Modifier.PUBLIC);
ResultHandle self = setMethodHandlerMethod.getThis();
ResultHandle methodHandlerInstance = setMethodHandlerMethod.getMethodParam(0);
setMethodHandlerMethod.writeInstanceField(serverMethodHandler.getFieldDescriptor(), self, methodHandlerInstance);
setMethodHandlerMethod.returnValue(null);
}
// Override service methods that the gRPC component is interested in
// E.g methods with one or two parameters where one is of type StreamObserver
List<MethodInfo> methods = service.methods();
for (MethodInfo method : methods) {
if (isCandidateServiceMethod(method)) {
String[] params = method.parameters().stream().map(type -> type.name().toString()).toArray(String[]::new);
ClassInfo classInfo = index.getClassByName(DotName.createSimple(GrpcMethodHandler.class.getName()));
String returnType = method.returnType().name().toString();
try (MethodCreator methodCreator = classCreator.getMethodCreator(method.name(), returnType, params)) {
method.exceptions().stream().map(type -> type.name().toString()).forEach(methodCreator::addException);
if (method.parameters().size() == 1) {
ResultHandle returnValue = generateGrpcDelegateMethod(classInfo, serverMethodHandler, methodCreator, method, "handleForConsumerStrategy");
methodCreator.returnValue(returnValue);
} else if (method.parameters().size() == 2) {
generateGrpcDelegateMethod(classInfo, serverMethodHandler, methodCreator, method, "handle");
methodCreator.returnValue(null);
}
}
}
}
}
}
}
use of io.quarkus.arc.deployment.GeneratedBeanGizmoAdaptor in project quarkus-github-app by quarkiverse.
the class GitHubAppProcessor method generateClasses.
@BuildStep
void generateClasses(CombinedIndexBuildItem combinedIndex, LaunchModeBuildItem launchMode, BuildProducer<AdditionalBeanBuildItem> additionalBeans, BuildProducer<GeneratedBeanBuildItem> generatedBeans, BuildProducer<GeneratedClassBuildItem> generatedClasses, BuildProducer<ReflectiveClassBuildItem> reflectiveClasses, BuildProducer<AnnotationsTransformerBuildItem> annotationsTransformer) {
Collection<EventDefinition> allEventDefinitions = getAllEventDefinitions(combinedIndex.getIndex());
// Add @Vetoed to all the user-defined event listening classes
annotationsTransformer.produce(new AnnotationsTransformerBuildItem(new VetoUserDefinedEventListeningClassesAnnotationsTransformer(allEventDefinitions.stream().map(d -> d.getAnnotation()).collect(Collectors.toSet()))));
// Add the qualifiers as beans
String[] subscriberAnnotations = allEventDefinitions.stream().map(d -> d.getAnnotation().toString()).toArray(String[]::new);
additionalBeans.produce(new AdditionalBeanBuildItem(subscriberAnnotations));
DispatchingConfiguration dispatchingConfiguration = getDispatchingConfiguration(combinedIndex.getIndex(), allEventDefinitions);
ClassOutput classOutput = new GeneratedClassGizmoAdaptor(generatedClasses, true);
generateAnnotationLiterals(classOutput, dispatchingConfiguration);
ClassOutput beanClassOutput = new GeneratedBeanGizmoAdaptor(generatedBeans);
generateDispatcher(beanClassOutput, combinedIndex, launchMode, dispatchingConfiguration, reflectiveClasses);
generateMultiplexers(beanClassOutput, dispatchingConfiguration, reflectiveClasses);
}
use of io.quarkus.arc.deployment.GeneratedBeanGizmoAdaptor in project quarkus-github-action by quarkiverse.
the class GitHubActionProcessor method generateClasses.
@BuildStep
void generateClasses(CombinedIndexBuildItem combinedIndex, LaunchModeBuildItem launchMode, BuildProducer<AdditionalBeanBuildItem> additionalBeans, BuildProducer<GeneratedBeanBuildItem> generatedBeans, BuildProducer<GeneratedClassBuildItem> generatedClasses, BuildProducer<ReflectiveClassBuildItem> reflectiveClasses, BuildProducer<AnnotationsTransformerBuildItem> annotationsTransformer) {
Collection<EventDefinition> allEventDefinitions = getAllEventDefinitions(combinedIndex.getIndex());
// Add @Vetoed to all the user-defined event listening classes
annotationsTransformer.produce(new AnnotationsTransformerBuildItem(new VetoUserDefinedEventListeningClassesAnnotationsTransformer(allEventDefinitions.stream().map(d -> d.getAnnotation()).collect(Collectors.toSet()))));
// Add the qualifiers as beans
String[] subscriberAnnotations = allEventDefinitions.stream().map(d -> d.getAnnotation().toString()).toArray(String[]::new);
additionalBeans.produce(new AdditionalBeanBuildItem(subscriberAnnotations));
additionalBeans.produce(new AdditionalBeanBuildItem(Action.class));
DispatchingConfiguration dispatchingConfiguration = getDispatchingConfiguration(combinedIndex.getIndex(), allEventDefinitions);
ClassOutput classOutput = new GeneratedClassGizmoAdaptor(generatedClasses, true);
generateAnnotationLiterals(classOutput, dispatchingConfiguration);
ClassOutput beanClassOutput = new GeneratedBeanGizmoAdaptor(generatedBeans);
generatePayloadTypeResolver(beanClassOutput, reflectiveClasses, allEventDefinitions);
generateActionMain(beanClassOutput, combinedIndex, launchMode, dispatchingConfiguration, reflectiveClasses);
generateMultiplexers(beanClassOutput, dispatchingConfiguration, reflectiveClasses);
}
Aggregations