use of io.quarkus.arc.deployment.GeneratedBeanBuildItem 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.GeneratedBeanBuildItem in project automatiko-engine by automatiko-io.
the class AutomatikoQuarkusProcessor method generatePersistenceInfo.
private void generatePersistenceInfo(AutomatikoBuildTimeConfig config, PackageConfig pconfig, AppPaths appPaths, BuildProducer<GeneratedBeanBuildItem> generatedBeans, BuildProducer<AdditionalIndexedClassesBuildItem> additionalIndexClass, IndexView index, LaunchModeBuildItem launchMode, BuildProducer<NativeImageResourceBuildItem> resource, CurateOutcomeBuildItem curateOutcomeBuildItem) throws Exception, BootstrapDependencyProcessingException {
ClassInfo persistenceClass = index.getClassByName(createDotName(persistenceFactoryClass));
boolean usePersistence = persistenceClass != null;
List<String> parameters = new ArrayList<>();
if (usePersistence) {
for (MethodInfo mi : persistenceClass.methods()) {
if (mi.name().equals("<init>") && !mi.parameters().isEmpty()) {
parameters = mi.parameters().stream().map(p -> p.name().toString()).collect(Collectors.toList());
break;
}
}
}
Collection<GeneratedFile> generatedFiles = getGeneratedPersistenceFiles(config, appPaths, index, usePersistence, parameters);
if (!generatedFiles.isEmpty()) {
writeGeneratedFiles(appPaths, generatedFiles);
compile(appPaths, curateOutcomeBuildItem.getApplicationModel(), generatedFiles, launchMode.getLaunchMode(), generatedBeans, additionalIndexClass, GeneratedBeanBuildItem::new, pconfig);
}
}
use of io.quarkus.arc.deployment.GeneratedBeanBuildItem 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.GeneratedBeanBuildItem in project kogito-runtimes by kiegroup.
the class KogitoAssetsProcessor method indexBuildItems.
private KogitoGeneratedClassesBuildItem indexBuildItems(KogitoBuildContext context, Collection<GeneratedBeanBuildItem> buildItems) {
Indexer kogitoIndexer = new Indexer();
Set<DotName> kogitoIndex = new HashSet<>();
for (GeneratedBeanBuildItem generatedBeanBuildItem : buildItems) {
IndexingUtil.indexClass(generatedBeanBuildItem.getName(), kogitoIndexer, combinedIndexBuildItem.getIndex(), kogitoIndex, context.getClassLoader(), generatedBeanBuildItem.getData());
}
Map<String, byte[]> generatedClasses = buildItems.stream().collect(Collectors.toMap(GeneratedBeanBuildItem::getName, GeneratedBeanBuildItem::getData));
return new KogitoGeneratedClassesBuildItem(kogitoIndexer.complete(), generatedClasses);
}
use of io.quarkus.arc.deployment.GeneratedBeanBuildItem in project kogito-runtimes by kiegroup.
the class KogitoQuarkusResourceUtils method makeBuildItems.
private static Collection<GeneratedBeanBuildItem> makeBuildItems(AppPaths appPaths, ResourceReader resources) throws IOException {
Collection<GeneratedBeanBuildItem> buildItems = new ArrayList<>();
for (KiePath path : resources.getFilePaths()) {
byte[] data = resources.getBytes(path);
String className = toClassName(path.asString());
// TODO this can be removed when we will use a version of quarkus having that fix
if (className.equals(HOT_RELOAD_SUPPORT_FQN)) {
for (Path classPath : appPaths.getClassesPaths()) {
// Write the class bytecode in the first available directory class path if any
if (classPath.toFile().isDirectory()) {
Files.write(pathOf(classPath.toString(), HOT_RELOAD_SUPPORT_PATH + ".class"), data);
break;
}
}
}
buildItems.add(new GeneratedBeanBuildItem(className, data));
}
return buildItems;
}
Aggregations