Search in sources :

Example 1 with DomainModelRegisteredEvent

use of org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent in project kogito-apps by kiegroup.

the class GraphQLProtoSchemaMapper method onDomainModelRegisteredEvent.

public void onDomainModelRegisteredEvent(@Observes DomainModelRegisteredEvent event) {
    LOGGER.debug("Received new domain event: {}", event);
    GraphQLSchema schema = schemaManager.getGraphQLSchema();
    schemaManager.transform(builder -> {
        builder.clearAdditionalTypes();
        Map<String, DomainDescriptor> map = event.getAdditionalTypes().stream().collect(toMap(desc -> getTypeName(desc.getTypeName()), desc -> desc));
        Map<String, GraphQLType> additionalTypes = new ConcurrentHashMap<>();
        GraphQLObjectType rootType = new GraphQLObjectTypeMapper(schema, additionalTypes, map).apply(event.getDomainDescriptor());
        additionalTypes.put(rootType.getName(), rootType);
        GraphQLInputObjectType whereArgumentType = new GraphQLInputObjectTypeMapper(schema, additionalTypes).apply(rootType);
        additionalTypes.put(whereArgumentType.getName(), whereArgumentType);
        GraphQLInputObjectType orderByType = new GraphQLOrderByTypeMapper(schema, additionalTypes).apply(rootType);
        additionalTypes.put(orderByType.getName(), orderByType);
        LOGGER.debug("New GraphQL types: {}", additionalTypes.keySet());
        Set<GraphQLType> newTypes = additionalTypes.entrySet().stream().map(entry -> entry.getValue()).collect(toSet());
        newTypes.addAll(schema.getAdditionalTypes().stream().filter(type -> additionalTypes.containsKey(((GraphQLNamedType) type).getName()) == false).collect(toSet()));
        builder.additionalTypes(newTypes);
        GraphQLObjectType query = schema.getQueryType();
        // Should use extend instead?
        query = query.transform(qBuilder -> {
            if (qBuilder.hasField(rootType.getName())) {
                qBuilder.clearFields();
                qBuilder.fields(schema.getQueryType().getFieldDefinitions().stream().filter(field -> rootType.getName().equals(field.getName()) == false).collect(toList()));
            }
            GraphQLQueryParserRegistry.get().registerParser(whereArgumentType);
            GraphQLArgument where = newArgument().name("where").type(whereArgumentType).build();
            GraphQLArgument orderBy = newArgument().name("orderBy").type(orderByType).build();
            GraphQLArgument pagination = newArgument().name("pagination").type(new GraphQLTypeReference("Pagination")).build();
            qBuilder.field(newFieldDefinition().name(rootType.getName()).type(GraphQLList.list(rootType)).arguments(asList(where, orderBy, pagination)));
        });
        builder.query(query);
        GraphQLObjectType subscription = schema.getSubscriptionType();
        subscription = subscription.transform(sBuilder -> {
            sBuilder.field(newFieldDefinition().name(rootType.getName() + "Added").type(nonNull(rootType)).build());
            sBuilder.field(newFieldDefinition().name(rootType.getName() + "Updated").type(nonNull(rootType)).build());
        });
        builder.subscription(subscription);
        GraphQLCodeRegistry registry = schema.getCodeRegistry().transform(codeBuilder -> {
            codeBuilder.dataFetcher(coordinates("Query", rootType.getName()), schemaManager.getDomainModelDataFetcher(event.getProcessId()));
            codeBuilder.dataFetcher(coordinates("Subscription", rootType.getName() + "Added"), schemaManager.getDomainModelAddedDataFetcher(event.getProcessId()));
            codeBuilder.dataFetcher(coordinates("Subscription", rootType.getName() + "Updated"), schemaManager.getDomainModelUpdatedDataFetcher(event.getProcessId()));
        });
        builder.codeRegistry(registry);
    });
}
Also used : GraphQLCodeRegistry(graphql.schema.GraphQLCodeRegistry) GraphQLNamedType(graphql.schema.GraphQLNamedType) GraphQLInputObjectType(graphql.schema.GraphQLInputObjectType) LoggerFactory(org.slf4j.LoggerFactory) GraphQLType(graphql.schema.GraphQLType) Inject(javax.inject.Inject) GraphQLInputObjectTypeMapper(org.kie.kogito.index.graphql.query.GraphQLInputObjectTypeMapper) Collectors.toMap(java.util.stream.Collectors.toMap) GraphQLNonNull.nonNull(graphql.schema.GraphQLNonNull.nonNull) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) Observes(javax.enterprise.event.Observes) DomainModelRegisteredEvent(org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent) GraphQLSchema(graphql.schema.GraphQLSchema) GraphQLQueryParserRegistry(org.kie.kogito.index.graphql.query.GraphQLQueryParserRegistry) Collectors.toSet(java.util.stream.Collectors.toSet) GraphQLObjectTypeMapper.getTypeName(org.kie.kogito.index.graphql.GraphQLObjectTypeMapper.getTypeName) GraphQLObjectType(graphql.schema.GraphQLObjectType) Logger(org.slf4j.Logger) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) GraphQLArgument.newArgument(graphql.schema.GraphQLArgument.newArgument) GraphQLArgument(graphql.schema.GraphQLArgument) FieldCoordinates.coordinates(graphql.schema.FieldCoordinates.coordinates) GraphQLFieldDefinition.newFieldDefinition(graphql.schema.GraphQLFieldDefinition.newFieldDefinition) Collectors.toList(java.util.stream.Collectors.toList) GraphQLList(graphql.schema.GraphQLList) GraphQLTypeReference(graphql.schema.GraphQLTypeReference) DomainDescriptor(org.kie.kogito.persistence.api.proto.DomainDescriptor) ApplicationScoped(javax.enterprise.context.ApplicationScoped) GraphQLOrderByTypeMapper(org.kie.kogito.index.graphql.query.GraphQLOrderByTypeMapper) GraphQLTypeReference(graphql.schema.GraphQLTypeReference) GraphQLType(graphql.schema.GraphQLType) GraphQLArgument(graphql.schema.GraphQLArgument) GraphQLSchema(graphql.schema.GraphQLSchema) GraphQLOrderByTypeMapper(org.kie.kogito.index.graphql.query.GraphQLOrderByTypeMapper) GraphQLInputObjectType(graphql.schema.GraphQLInputObjectType) GraphQLObjectType(graphql.schema.GraphQLObjectType) GraphQLInputObjectTypeMapper(org.kie.kogito.index.graphql.query.GraphQLInputObjectTypeMapper) GraphQLCodeRegistry(graphql.schema.GraphQLCodeRegistry) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) DomainDescriptor(org.kie.kogito.persistence.api.proto.DomainDescriptor)

Example 2 with DomainModelRegisteredEvent

use of org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent in project kogito-apps by kiegroup.

the class ProtoDomainModelProducer method onFileDescriptorRegistered.

public void onFileDescriptorRegistered(@Observes FileDescriptorRegisteredEvent event) {
    FileDescriptor descriptor = event.getDescriptor();
    String rootMessage = (String) descriptor.getOption("kogito_model").getValue();
    String processId = (String) descriptor.getOption("kogito_id").getValue();
    Map<String, Descriptor> map = descriptor.getMessageTypes().stream().collect(toMap(AnnotatedDescriptorImpl::getName, desc -> desc));
    Descriptor rootDescriptor = map.remove(rootMessage);
    DomainDescriptor domain = new DomainDescriptorMapper().apply(rootDescriptor);
    List<DomainDescriptor> additionalTypes = map.values().stream().map(desc -> new DomainDescriptorMapper().apply(desc)).collect(toList());
    domainEvent.fire(new DomainModelRegisteredEvent(processId, domain, additionalTypes));
}
Also used : Event(javax.enterprise.event.Event) FileDescriptor(org.infinispan.protostream.descriptors.FileDescriptor) Logger(org.slf4j.Logger) LoggerFactory(org.slf4j.LoggerFactory) Descriptor(org.infinispan.protostream.descriptors.Descriptor) Function(java.util.function.Function) FieldDescriptor(org.infinispan.protostream.descriptors.FieldDescriptor) Inject(javax.inject.Inject) AnnotatedDescriptorImpl(org.infinispan.protostream.impl.AnnotatedDescriptorImpl) AttributeDescriptor(org.kie.kogito.persistence.api.proto.AttributeDescriptor) FileDescriptorRegisteredEvent(org.kie.kogito.persistence.protobuf.FileDescriptorRegisteredEvent) List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) Collectors.toMap(java.util.stream.Collectors.toMap) DomainDescriptor(org.kie.kogito.persistence.api.proto.DomainDescriptor) Map(java.util.Map) Observes(javax.enterprise.event.Observes) DomainModelRegisteredEvent(org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent) ApplicationScoped(javax.enterprise.context.ApplicationScoped) FileDescriptor(org.infinispan.protostream.descriptors.FileDescriptor) Descriptor(org.infinispan.protostream.descriptors.Descriptor) FieldDescriptor(org.infinispan.protostream.descriptors.FieldDescriptor) AttributeDescriptor(org.kie.kogito.persistence.api.proto.AttributeDescriptor) DomainDescriptor(org.kie.kogito.persistence.api.proto.DomainDescriptor) DomainModelRegisteredEvent(org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent) DomainDescriptor(org.kie.kogito.persistence.api.proto.DomainDescriptor) FileDescriptor(org.infinispan.protostream.descriptors.FileDescriptor)

Example 3 with DomainModelRegisteredEvent

use of org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent in project kogito-apps by kiegroup.

the class ProtoDomainModelProducerTest method onFileDescriptorRegistered.

@Test
void onFileDescriptorRegistered() {
    FileDescriptor fileDescriptor = getTestFileDescriptor();
    FileDescriptorRegisteredEvent event = new FileDescriptorRegisteredEvent(fileDescriptor);
    protoDomainModelProducer.onFileDescriptorRegistered(event);
    verify(domainEvent).fire(eq(new DomainModelRegisteredEvent(TestUtils.PROCESS_ID, TestUtils.DOMAIN_DESCRIPTOR, TestUtils.ADDITIONAL_DESCRIPTORS)));
}
Also used : DomainModelRegisteredEvent(org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent) FileDescriptor(org.infinispan.protostream.descriptors.FileDescriptor) Test(org.junit.jupiter.api.Test)

Aggregations

DomainModelRegisteredEvent (org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent)3 Map (java.util.Map)2 Collectors.toList (java.util.stream.Collectors.toList)2 Collectors.toMap (java.util.stream.Collectors.toMap)2 ApplicationScoped (javax.enterprise.context.ApplicationScoped)2 Observes (javax.enterprise.event.Observes)2 Inject (javax.inject.Inject)2 FileDescriptor (org.infinispan.protostream.descriptors.FileDescriptor)2 DomainDescriptor (org.kie.kogito.persistence.api.proto.DomainDescriptor)2 Logger (org.slf4j.Logger)2 LoggerFactory (org.slf4j.LoggerFactory)2 FieldCoordinates.coordinates (graphql.schema.FieldCoordinates.coordinates)1 GraphQLArgument (graphql.schema.GraphQLArgument)1 GraphQLArgument.newArgument (graphql.schema.GraphQLArgument.newArgument)1 GraphQLCodeRegistry (graphql.schema.GraphQLCodeRegistry)1 GraphQLFieldDefinition.newFieldDefinition (graphql.schema.GraphQLFieldDefinition.newFieldDefinition)1 GraphQLInputObjectType (graphql.schema.GraphQLInputObjectType)1 GraphQLList (graphql.schema.GraphQLList)1 GraphQLNamedType (graphql.schema.GraphQLNamedType)1 GraphQLNonNull.nonNull (graphql.schema.GraphQLNonNull.nonNull)1