use of io.quarkiverse.githubapp.deployment.DispatchingConfiguration.EventDispatchingConfiguration in project quarkus-github-app by quarkiverse.
the class GitHubAppProcessor method generateDispatcher.
/**
* The role of the dispatcher is to receive the CDI events emitted by the reactive route.
* <p>
* It parses the raw payload into the appropriate {@link GHEventPayload} and then emit
* an async CDI event with a MultiplexedEvent containing the payload instance,
* the GitHub instance and the DynamicGraphQLClient instance if needed.
* <p>
* It only generates code for the GitHub events actually listened to by the application.
*/
private static void generateDispatcher(ClassOutput beanClassOutput, CombinedIndexBuildItem combinedIndex, LaunchModeBuildItem launchMode, DispatchingConfiguration dispatchingConfiguration, BuildProducer<ReflectiveClassBuildItem> reflectiveClasses) {
String dispatcherClassName = GitHubEvent.class.getName() + "DispatcherImpl";
reflectiveClasses.produce(new ReflectiveClassBuildItem(true, true, dispatcherClassName));
ClassCreator dispatcherClassCreator = ClassCreator.builder().classOutput(beanClassOutput).className(dispatcherClassName).build();
dispatcherClassCreator.addAnnotation(Singleton.class);
FieldCreator eventFieldCreator = dispatcherClassCreator.getFieldCreator(EVENT_EMITTER_FIELD, Event.class);
eventFieldCreator.addAnnotation(Inject.class);
eventFieldCreator.setModifiers(Modifier.PROTECTED);
FieldCreator gitHubServiceFieldCreator = dispatcherClassCreator.getFieldCreator(GITHUB_SERVICE_FIELD, GitHubService.class);
gitHubServiceFieldCreator.addAnnotation(Inject.class);
gitHubServiceFieldCreator.setModifiers(Modifier.PROTECTED);
MethodCreator dispatchMethodCreator = dispatcherClassCreator.getMethodCreator("dispatch", void.class, GitHubEvent.class);
dispatchMethodCreator.setModifiers(Modifier.PUBLIC);
dispatchMethodCreator.getParameterAnnotations(0).addAnnotation(DotNames.OBSERVES.toString());
ResultHandle gitHubEventRh = dispatchMethodCreator.getMethodParam(0);
ResultHandle installationIdRh = dispatchMethodCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHubEvent.class, "getInstallationId", Long.class), gitHubEventRh);
ResultHandle dispatchedEventRh = dispatchMethodCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHubEvent.class, "getEvent", String.class), gitHubEventRh);
ResultHandle dispatchedActionRh = dispatchMethodCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHubEvent.class, "getAction", String.class), gitHubEventRh);
ResultHandle dispatchedPayloadRh = dispatchMethodCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHubEvent.class, "getPayload", String.class), gitHubEventRh);
TryBlock tryBlock = dispatchMethodCreator.tryBlock();
ResultHandle gitHubRh = tryBlock.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHubService.class, "getInstallationClient", GitHub.class, Long.class), tryBlock.readInstanceField(FieldDescriptor.of(dispatcherClassCreator.getClassName(), GITHUB_SERVICE_FIELD, GitHubService.class), tryBlock.getThis()), installationIdRh);
ResultHandle gitHubGraphQLClientRh = tryBlock.loadNull();
if (dispatchingConfiguration.requiresGraphQLClient()) {
gitHubGraphQLClientRh = tryBlock.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHubService.class, "getInstallationGraphQLClient", DynamicGraphQLClient.class, Long.class), tryBlock.readInstanceField(FieldDescriptor.of(dispatcherClassCreator.getClassName(), GITHUB_SERVICE_FIELD, GitHubService.class), tryBlock.getThis()), installationIdRh);
}
for (EventDispatchingConfiguration eventDispatchingConfiguration : dispatchingConfiguration.getEventConfigurations().values()) {
ResultHandle eventRh = tryBlock.load(eventDispatchingConfiguration.getEvent());
String payloadType = eventDispatchingConfiguration.getPayloadType();
BytecodeCreator eventMatchesCreator = tryBlock.ifTrue(tryBlock.invokeVirtualMethod(MethodDescriptors.OBJECT_EQUALS, eventRh, dispatchedEventRh)).trueBranch();
ResultHandle payloadInstanceRh = eventMatchesCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(GitHub.class, "parseEventPayload", GHEventPayload.class, Reader.class, Class.class), gitHubRh, eventMatchesCreator.newInstance(MethodDescriptor.ofConstructor(StringReader.class, String.class), dispatchedPayloadRh), eventMatchesCreator.loadClass(payloadType));
ResultHandle multiplexedEventRh = eventMatchesCreator.newInstance(MethodDescriptor.ofConstructor(MultiplexedEvent.class, GHEventPayload.class, GitHub.class, DynamicGraphQLClient.class), payloadInstanceRh, gitHubRh, gitHubGraphQLClientRh);
for (Entry<String, EventAnnotation> eventAnnotationEntry : eventDispatchingConfiguration.getEventAnnotations().entrySet()) {
String action = eventAnnotationEntry.getKey();
EventAnnotation eventAnnotation = eventAnnotationEntry.getValue();
Class<?>[] literalParameterTypes = new Class<?>[eventAnnotation.getValues().size()];
Arrays.fill(literalParameterTypes, String.class);
List<ResultHandle> literalParameters = new ArrayList<>();
ResultHandle annotationLiteralRh = eventMatchesCreator.newInstance(MethodDescriptor.ofConstructor(getLiteralClassName(eventAnnotation.getName()), (Object[]) literalParameterTypes), literalParameters.toArray(ResultHandle[]::new));
ResultHandle annotationLiteralArrayRh = eventMatchesCreator.newArray(Annotation.class, 1);
eventMatchesCreator.writeArrayValue(annotationLiteralArrayRh, 0, annotationLiteralRh);
if (Actions.ALL.equals(action)) {
fireAsyncAction(eventMatchesCreator, launchMode.getLaunchMode(), dispatcherClassCreator.getClassName(), gitHubEventRh, multiplexedEventRh, annotationLiteralArrayRh);
} else {
BytecodeCreator actionMatchesCreator = eventMatchesCreator.ifTrue(eventMatchesCreator.invokeVirtualMethod(MethodDescriptors.OBJECT_EQUALS, eventMatchesCreator.load(action), dispatchedActionRh)).trueBranch();
fireAsyncAction(actionMatchesCreator, launchMode.getLaunchMode(), dispatcherClassCreator.getClassName(), gitHubEventRh, multiplexedEventRh, annotationLiteralArrayRh);
}
}
}
CatchBlockCreator catchBlockCreator = tryBlock.addCatch(Throwable.class);
catchBlockCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(ErrorHandlerBridgeFunction.class, "apply", Void.class, Throwable.class), catchBlockCreator.newInstance(MethodDescriptor.ofConstructor(ErrorHandlerBridgeFunction.class, GitHubEvent.class), gitHubEventRh), catchBlockCreator.getCaughtException());
dispatchMethodCreator.returnValue(null);
dispatcherClassCreator.close();
}
use of io.quarkiverse.githubapp.deployment.DispatchingConfiguration.EventDispatchingConfiguration in project quarkus-github-app by quarkiverse.
the class GitHubAppProcessor method generateAnnotationLiterals.
private static void generateAnnotationLiterals(ClassOutput classOutput, DispatchingConfiguration dispatchingConfiguration) {
for (EventDispatchingConfiguration eventDispatchingConfiguration : dispatchingConfiguration.getEventConfigurations().values()) {
for (EventAnnotationLiteral eventAnnotationLiteral : eventDispatchingConfiguration.getEventAnnotationLiterals()) {
String literalClassName = getLiteralClassName(eventAnnotationLiteral.getName());
String signature = String.format("Ljavax/enterprise/util/AnnotationLiteral<L%1$s;>;L%1$s;", eventAnnotationLiteral.getName().toString().replace('.', '/'));
ClassCreator literalClassCreator = ClassCreator.builder().classOutput(classOutput).className(literalClassName).signature(signature).superClass(AnnotationLiteral.class).interfaces(eventAnnotationLiteral.getName().toString()).build();
Class<?>[] parameterTypes = new Class<?>[eventAnnotationLiteral.getAttributes().size()];
Arrays.fill(parameterTypes, String.class);
MethodCreator constructorCreator = literalClassCreator.getMethodCreator("<init>", "V", (Object[]) parameterTypes);
constructorCreator.invokeSpecialMethod(MethodDescriptor.ofConstructor(AnnotationLiteral.class), constructorCreator.getThis());
for (int i = 0; i < eventAnnotationLiteral.getAttributes().size(); i++) {
constructorCreator.writeInstanceField(FieldDescriptor.of(literalClassName, eventAnnotationLiteral.getAttributes().get(i), String.class), constructorCreator.getThis(), constructorCreator.getMethodParam(i));
constructorCreator.setModifiers(Modifier.PUBLIC);
}
constructorCreator.returnValue(null);
for (String attribute : eventAnnotationLiteral.getAttributes()) {
// we only support String for now
literalClassCreator.getFieldCreator(attribute, String.class).setModifiers(Modifier.PRIVATE);
MethodCreator getterCreator = literalClassCreator.getMethodCreator(attribute, String.class);
getterCreator.setModifiers(Modifier.PUBLIC);
getterCreator.returnValue(getterCreator.readInstanceField(FieldDescriptor.of(literalClassName, attribute, String.class), getterCreator.getThis()));
}
literalClassCreator.close();
}
}
}
Aggregations