From 4bde80b3234ef9b1e770bf37012272ae4c5e1bdb Mon Sep 17 00:00:00 2001 From: Cristiano Nicolai <570894+cristianonicolai@users.noreply.github.com> Date: Thu, 31 Aug 2023 18:44:10 +1000 Subject: [PATCH] KOGITO-9737 - Index process definition data (#1842) --- .../index/AbstractProcessDataIndexIT.java | 11 ++ .../index/inmemory/KogitoDevServiceTest.java | 10 ++ .../kogito/index/api/KogitoRuntimeClient.java | 4 +- .../event/ProcessInstanceEventMapper.java | 16 ++ .../kogito/index/service/IndexingService.java | 3 + .../graphql/AbstractGraphQLSchemaManager.java | 34 +++- .../src/main/resources/basic.schema.graphqls | 29 ++++ .../service/api/KogitoRuntimeClientImpl.java | 12 +- .../graphql/GraphQLSchemaManagerImpl.java | 9 +- .../service/AbstractIndexingServiceIT.java | 22 +++ .../kogito/index/service/GraphQLUtils.java | 12 +- .../service/api/KogitoRuntimeClientTest.java | 10 +- .../index/service/cache/AbstractQueryIT.java | 2 + .../service/cache/AbstractStorageIT.java | 1 + .../AbstractWebSocketSubscriptionIT.java | 1 + .../AbstractGraphQLRuntimesQueriesIT.java | 10 +- .../AbstractDomainMessagingConsumerIT.java | 2 + .../AbstractMessagingConsumerIT.java | 2 + .../AbstractMessagingLoadKafkaIT.java | 15 ++ .../src/test/resources/graphql_queries.json | 7 + .../resources/process_instance_event.json | 1 + .../META-INF/hotrod-client.properties | 16 ++ .../kogito/index/model/ProcessDefinition.java | 120 ++++++++++++++ .../kogito/index/model/ProcessInstance.java | 10 ++ .../kie/kogito/index/storage/Constants.java | 1 + .../storage/DataIndexStorageService.java | 3 + .../storage/DataIndexStorageServiceImpl.java | 7 + .../org/kie/kogito/index/test/TestUtils.java | 14 +- .../AbstractProcessDefinitionQueryIT.java | 70 ++++++++ .../query/AbstractProcessInstanceQueryIT.java | 2 +- .../infinispan/InfinispanCacheStartup.java | 3 +- .../ProcessDefinitionMarshaller.java | 74 +++++++++ .../protostream/ProtostreamProducer.java | 5 + .../ProcessDefinitionMarshallerTest.java | 97 +++++++++++ .../model/ProcessDefinitionEntity.java | 133 ++++++++++++++++ .../model/ProcessDefinitionEntityMapper.java | 73 +++++++++ .../storage/MongoModelServiceImpl.java | 5 + .../ProcessDefinitionEntityMapperTest.java | 89 +++++++++++ .../query/ProcessDefinitionQueryIT.java | 55 +++++++ .../storage/MongoModelServiceImplIT.java | 6 + .../storage/ProcessDefinitionStorageIT.java | 68 ++++++++ .../mapper/ProcessDefinitionEntityMapper.java | 32 ++++ .../oracle/model/ProcessDefinitionEntity.java | 150 ++++++++++++++++++ .../model/ProcessDefinitionEntityId.java | 84 ++++++++++ .../ProcessDefinitionEntityRepository.java | 26 +++ .../index/oracle/storage/AbstractStorage.java | 11 +- .../oracle/storage/JobEntityStorage.java | 3 +- .../oracle/storage/OracleStorageService.java | 7 + .../ProcessDefinitionEntityStorage.java | 79 +++++++++ .../storage/ProcessInstanceEntityStorage.java | 3 +- .../UserTaskInstanceEntityStorage.java | 3 +- .../V1.43.0__data_index_definitions.sql | 37 +++++ .../ProcessDefinitionEntityMapperIT.java | 75 +++++++++ .../query/ProcessDefinitionEntityQueryIT.java | 42 +++++ .../oracle/schema/DDLSchemaExporter.java | 4 +- .../storage/ProcessDefinitionStorageIT.java | 69 ++++++++ .../mapper/ProcessDefinitionEntityMapper.java | 32 ++++ .../model/ProcessDefinitionEntity.java | 150 ++++++++++++++++++ .../model/ProcessDefinitionEntityId.java | 84 ++++++++++ .../ProcessDefinitionEntityRepository.java | 26 +++ .../postgresql/storage/AbstractStorage.java | 10 +- .../postgresql/storage/JobEntityStorage.java | 3 +- .../postgresql/storage/PostgreSqlQuery.java | 6 +- .../storage/PostgreSqlStorageService.java | 9 +- .../ProcessDefinitionEntityStorage.java | 79 +++++++++ .../storage/ProcessInstanceEntityStorage.java | 3 +- .../UserTaskInstanceEntityStorage.java | 3 +- .../V1.43.0__data_index_definitions.sql | 41 +++++ .../ProcessDefinitionEntityMapperIT.java | 75 +++++++++ .../query/ProcessDefinitionEntityQueryIT.java | 46 ++++++ .../postgresql/schema/DDLSchemaExporter.java | 2 + .../storage/ProcessDefinitionStorageIT.java | 69 ++++++++ .../resources/META-INF/kogito-index.proto | 18 +++ .../org/kie/kogito/index/test/TestUtils.java | 1 + ...KogitoAddonsQuarkusDataIndexProcessor.java | 2 + .../api/KogitoAddonRuntimeClientImpl.java | 10 +- .../GraphQLAddonSchemaManagerImpl.java | 9 +- .../it/InfinispanQuarkusAddonDataIndexIT.java | 13 ++ .../it/InfinispanQuarkusAddonDataIndexIT.java | 5 + .../META-INF/hotrod-client.properties | 16 ++ .../it/InMemoryQuarkusAddonDataIndexIT.java | 13 ++ .../it/InMemoryQuarkusAddonDataIndexIT.java | 13 ++ .../deployment/MongoDataIndexProcessor.java | 2 + .../it/MongoQuarkusAddonDataIndexIT.java | 13 ++ .../it/MongoQuarkusAddonDataIndexIT.java | 13 ++ .../it/PostgreSQLQuarkusAddonDataIndexIT.java | 13 ++ .../it/PostgreSQLQuarkusAddonDataIndexIT.java | 13 ++ 87 files changed, 2430 insertions(+), 51 deletions(-) create mode 100644 data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java create mode 100644 data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessDefinitionQueryIT.java create mode 100644 data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java create mode 100644 data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshallerTest.java create mode 100644 data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java create mode 100644 data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapper.java create mode 100644 data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapperTest.java create mode 100644 data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/query/ProcessDefinitionQueryIT.java create mode 100644 data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/ProcessDefinitionStorageIT.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapper.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntity.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityId.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityRepository.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionEntityStorage.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapperIT.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/query/ProcessDefinitionEntityQueryIT.java create mode 100644 data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionStorageIT.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapper.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntity.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityId.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityRepository.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionEntityStorage.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapperIT.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/query/ProcessDefinitionEntityQueryIT.java create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionStorageIT.java diff --git a/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-common/src/test/java/org/kie/kogito/index/AbstractProcessDataIndexIT.java b/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-common/src/test/java/org/kie/kogito/index/AbstractProcessDataIndexIT.java index 5bba0b2c78..1e20eccb9a 100644 --- a/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-common/src/test/java/org/kie/kogito/index/AbstractProcessDataIndexIT.java +++ b/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-common/src/test/java/org/kie/kogito/index/AbstractProcessDataIndexIT.java @@ -155,6 +155,17 @@ public void testProcessInstanceEvents() throws IOException { .body("data.ProcessInstances[0].processId", is("approvals")) .body("data.ProcessInstances[0].state", is("ACTIVE"))); + await() + .atMost(TIMEOUT) + .untilAsserted(() -> given().spec(dataIndexSpec()).contentType(ContentType.JSON) + .body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("approvals")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("approvals"))); + await() .atMost(TIMEOUT) .untilAsserted(() -> given().spec(dataIndexSpec()).contentType(ContentType.JSON) diff --git a/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-quarkus-devservice/src/test/java/org/kie/kogito/index/inmemory/KogitoDevServiceTest.java b/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-quarkus-devservice/src/test/java/org/kie/kogito/index/inmemory/KogitoDevServiceTest.java index 2888c3e786..4b4acb5492 100644 --- a/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-quarkus-devservice/src/test/java/org/kie/kogito/index/inmemory/KogitoDevServiceTest.java +++ b/apps-integration-tests/integration-tests-data-index-service/integration-tests-data-index-service-quarkus-devservice/src/test/java/org/kie/kogito/index/inmemory/KogitoDevServiceTest.java @@ -95,6 +95,16 @@ public void testDataIndexDevService() { .body("data.ProcessInstances[0].id", is(processId)) .body("data.ProcessInstances[0].processId", is("greet")) .body("data.ProcessInstances[0].processName", is("Greeting workflow"))); + + given().contentType(ContentType.JSON) + .baseUri("http://localhost:" + dataIndexHttpPort) + .body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("greet")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("Greeting workflow")); } private static String getApplicationPropertiesContent() { diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java index 3264246a2b..40d02f690c 100644 --- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java +++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java @@ -37,9 +37,9 @@ public interface KogitoRuntimeClient { CompletableFuture getProcessInstanceDiagram(String serviceURL, ProcessInstance processInstance); - CompletableFuture getProcessInstanceSourceFileContent(String serviceURL, ProcessInstance processInstance); + CompletableFuture getProcessDefinitionSourceFileContent(String serviceURL, String processId); - CompletableFuture> getProcessInstanceNodeDefinitions(String serviceURL, ProcessInstance processInstance); + CompletableFuture> getProcessDefinitionNodes(String serviceURL, String processId); CompletableFuture triggerNodeInstance(String serviceURL, ProcessInstance processInstance, String nodeDefinitionId); diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/ProcessInstanceEventMapper.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/ProcessInstanceEventMapper.java index 2239b4746c..45bc13f684 100644 --- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/ProcessInstanceEventMapper.java +++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/ProcessInstanceEventMapper.java @@ -24,6 +24,7 @@ import org.kie.kogito.event.process.ProcessInstanceDataEvent; import org.kie.kogito.index.model.Milestone; import org.kie.kogito.index.model.NodeInstance; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.ProcessInstanceError; @@ -61,9 +62,24 @@ public ProcessInstance apply(ProcessInstanceDataEvent event) { pi.setAddons(isNullOrEmpty(event.getKogitoAddons()) ? null : Set.of(event.getKogitoAddons().split(","))); pi.setEndpoint(event.getSource() == null ? null : event.getSource().toString()); pi.setLastUpdate(toZonedDateTime(event.getTime())); + pi.setDefinition(definitions().apply(event)); return pi; } + private Function definitions() { + return event -> { + ProcessDefinition pd = new ProcessDefinition(); + pd.setId(event.getData().getProcessId()); + pd.setName(event.getData().getProcessName()); + pd.setVersion(event.getData().getVersion()); + pd.setAddons(isNullOrEmpty(event.getKogitoAddons()) ? null : Set.of(event.getKogitoAddons().split(","))); + pd.setRoles(event.getData().getRoles()); + pd.setType(event.getKogitoProcessType()); + pd.setEndpoint(event.getSource() == null ? null : event.getSource().toString()); + return pd; + }; + } + private Function nodeInstance() { return nib -> { NodeInstance ni = new NodeInstance(); diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/IndexingService.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/IndexingService.java index cd27e6f65d..a696309be9 100644 --- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/IndexingService.java +++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/IndexingService.java @@ -22,6 +22,7 @@ import org.kie.kogito.index.model.Job; import org.kie.kogito.index.model.NodeInstance; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.storage.DataIndexStorageService; @@ -56,6 +57,8 @@ public void indexProcessInstance(ProcessInstance pi) { List nodes = previousPI.getNodes().stream().filter(n -> !pi.getNodes().contains(n)).collect(toList()); pi.getNodes().addAll(nodes); } + ProcessDefinition definition = pi.getDefinition(); + manager.getProcessDefinitionsCache().put(definition.getKey(), definition); manager.getProcessInstancesCache().put(pi.getId(), pi); } diff --git a/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java b/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java index 412f35bd64..6d50e6b2e2 100644 --- a/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java +++ b/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java @@ -33,6 +33,7 @@ import org.kie.kogito.index.graphql.query.GraphQLQueryParserRegistry; import org.kie.kogito.index.model.Job; import org.kie.kogito.index.model.Node; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.storage.DataIndexStorageService; @@ -71,6 +72,7 @@ public abstract class AbstractGraphQLSchemaManager implements GraphQLSchemaManag public void setup() { schema = createSchema(); GraphQLQueryParserRegistry.get().registerParsers( + (GraphQLInputObjectType) schema.getType("ProcessDefinitionArgument"), (GraphQLInputObjectType) schema.getType("ProcessInstanceArgument"), (GraphQLInputObjectType) schema.getType("UserTaskInstanceArgument"), (GraphQLInputObjectType) schema.getType("JobArgument")); @@ -104,6 +106,14 @@ public void setDataIndexApiExecutor(KogitoRuntimeClient dataIndexApiExecutor) { this.dataIndexApiExecutor = dataIndexApiExecutor; } + public String getProcessDefinitionServiceUrl(DataFetchingEnvironment env) { + ProcessDefinition source = env.getSource(); + if (source == null || source.getEndpoint() == null || source.getId() == null) { + return null; + } + return getServiceUrl(source.getEndpoint(), source.getId()); + } + public String getProcessInstanceServiceUrl(DataFetchingEnvironment env) { ProcessInstance source = env.getSource(); if (source == null || source.getEndpoint() == null || source.getProcessId() == null) { @@ -149,6 +159,10 @@ protected ProcessInstance getParentProcessInstanceValue(DataFetchingEnvironment return !execute.isEmpty() ? execute.get(0) : null; } + protected Collection getProcessDefinitionsValues(DataFetchingEnvironment env) { + return executeAdvancedQueryForCache(cacheService.getProcessDefinitionsCache(), env); + } + protected Collection getProcessInstancesValues(DataFetchingEnvironment env) { return executeAdvancedQueryForCache(cacheService.getProcessInstancesCache(), env); } @@ -195,13 +209,23 @@ public CompletableFuture getProcessInstanceDiagram(DataFetchingEnvironme } public CompletableFuture getProcessInstanceSourceFileContent(DataFetchingEnvironment env) { - ProcessInstance processInstance = env.getSource(); - return dataIndexApiExecutor.getProcessInstanceSourceFileContent(getServiceUrl(processInstance.getEndpoint(), processInstance.getProcessId()), processInstance); + ProcessInstance pi = env.getSource(); + return dataIndexApiExecutor.getProcessDefinitionSourceFileContent(getServiceUrl(pi.getEndpoint(), pi.getProcessId()), pi.getProcessId()); } - public CompletableFuture> getProcessNodes(DataFetchingEnvironment env) { - ProcessInstance processInstance = env.getSource(); - return dataIndexApiExecutor.getProcessInstanceNodeDefinitions(getServiceUrl(processInstance.getEndpoint(), processInstance.getProcessId()), processInstance); + public CompletableFuture> getProcessInstanceNodes(DataFetchingEnvironment env) { + ProcessInstance pi = env.getSource(); + return dataIndexApiExecutor.getProcessDefinitionNodes(getServiceUrl(pi.getEndpoint(), pi.getProcessId()), pi.getProcessId()); + } + + public CompletableFuture getProcessDefinitionSourceFileContent(DataFetchingEnvironment env) { + ProcessDefinition pd = env.getSource(); + return dataIndexApiExecutor.getProcessDefinitionSourceFileContent(getServiceUrl(pd.getEndpoint(), pd.getId()), pd.getId()); + } + + public CompletableFuture> getProcessDefinitionNodes(DataFetchingEnvironment env) { + ProcessDefinition pd = env.getSource(); + return dataIndexApiExecutor.getProcessDefinitionNodes(getServiceUrl(pd.getEndpoint(), pd.getId()), pd.getId()); } @Override diff --git a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls index 8c7f07a197..58e538707e 100644 --- a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls +++ b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls @@ -8,11 +8,40 @@ schema { } type Query { + ProcessDefinitions(where: ProcessDefinitionArgument, orderBy: ProcessDefinitionOrderBy, pagination: Pagination): [ProcessDefinition] ProcessInstances(where: ProcessInstanceArgument, orderBy: ProcessInstanceOrderBy, pagination: Pagination): [ProcessInstance] UserTaskInstances(where: UserTaskInstanceArgument, orderBy: UserTaskInstanceOrderBy, pagination: Pagination): [UserTaskInstance] Jobs(where: JobArgument, orderBy: JobOrderBy, pagination: Pagination): [Job] } +type ProcessDefinition { + id: String! + name: String + version: String + nodes: [Node!] + source: String + addons: [String!] + roles: [String!] + type: String + endpoint: String! + serviceUrl: String +} + +input ProcessDefinitionOrderBy { + id: OrderBy + name: OrderBy + version: OrderBy +} + +input ProcessDefinitionArgument { + and: [ProcessDefinitionArgument!] + or: [ProcessDefinitionArgument!] + not: ProcessDefinitionArgument + id: StringArgument + name: StringArgument + version: StringArgument +} + type ProcessInstance { id: String! processId: String! diff --git a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java index 3c74b1e286..4ac42ab22c 100644 --- a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java +++ b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java @@ -144,16 +144,16 @@ public CompletableFuture getProcessInstanceDiagram(String serviceURL, Pr } @Override - public CompletableFuture getProcessInstanceSourceFileContent(String serviceURL, ProcessInstance processInstance) { - String requestURI = format(GET_PROCESS_INSTANCE_SOURCE_PATH, processInstance.getProcessId()); + public CompletableFuture getProcessDefinitionSourceFileContent(String serviceURL, String processId) { + String requestURI = format(GET_PROCESS_INSTANCE_SOURCE_PATH, processId); return sendGetClientRequest(getWebClient(serviceURL), requestURI, "Get Process Instance source file with processId: " + - processInstance.getProcessId(), null); + processId, null); } @Override - public CompletableFuture> getProcessInstanceNodeDefinitions(String serviceURL, ProcessInstance processInstance) { - String requestURI = format(GET_PROCESS_INSTANCE_NODE_DEFINITIONS_PATH, processInstance.getProcessId()); - return sendGetClientRequest(getWebClient(serviceURL), requestURI, "Get Process Instance available nodes with id: " + processInstance.getId(), List.class); + public CompletableFuture> getProcessDefinitionNodes(String serviceURL, String processId) { + String requestURI = format(GET_PROCESS_INSTANCE_NODE_DEFINITIONS_PATH, processId); + return sendGetClientRequest(getWebClient(serviceURL), requestURI, "Get Process available nodes with id: " + processId, List.class); } @Override diff --git a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java index 36f9298739..61bd69f6b5 100644 --- a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java +++ b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java @@ -87,6 +87,7 @@ public GraphQLSchema createSchema() { RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring() .type("Query", builder -> { + builder.dataFetcher("ProcessDefinitions", this::getProcessDefinitionsValues); builder.dataFetcher("ProcessInstances", this::getProcessInstancesValues); builder.dataFetcher("UserTaskInstances", this::getUserTaskInstancesValues); builder.dataFetcher("Jobs", this::getJobsValues); @@ -111,13 +112,19 @@ public GraphQLSchema createSchema() { builder.dataFetcher("UserTaskInstanceAttachmentDelete", this::deleteUserTaskAttachment); return builder; }) + .type("ProcessDefinition", builder -> { + builder.dataFetcher("source", this::getProcessDefinitionSourceFileContent); + builder.dataFetcher("nodes", this::getProcessDefinitionNodes); + builder.dataFetcher("serviceUrl", this::getProcessDefinitionServiceUrl); + return builder; + }) .type("ProcessInstance", builder -> { builder.dataFetcher("parentProcessInstance", this::getParentProcessInstanceValue); builder.dataFetcher("childProcessInstances", this::getChildProcessInstancesValues); builder.dataFetcher("serviceUrl", this::getProcessInstanceServiceUrl); builder.dataFetcher("diagram", this::getProcessInstanceDiagram); builder.dataFetcher("source", this::getProcessInstanceSourceFileContent); - builder.dataFetcher("nodeDefinitions", this::getProcessNodes); + builder.dataFetcher("nodeDefinitions", this::getProcessInstanceNodes); return builder; }) .type("UserTaskInstance", builder -> { diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/AbstractIndexingServiceIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/AbstractIndexingServiceIT.java index 9128d8050c..5e2aaf58b2 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/AbstractIndexingServiceIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/AbstractIndexingServiceIT.java @@ -57,6 +57,7 @@ import static org.kie.kogito.index.model.ProcessInstanceState.COMPLETED; import static org.kie.kogito.index.model.ProcessInstanceState.ERROR; import static org.kie.kogito.index.service.GraphQLUtils.getJobById; +import static org.kie.kogito.index.service.GraphQLUtils.getProcessDefinitionByIdAndVersion; import static org.kie.kogito.index.service.GraphQLUtils.getProcessInstanceByBusinessKey; import static org.kie.kogito.index.service.GraphQLUtils.getProcessInstanceById; import static org.kie.kogito.index.service.GraphQLUtils.getProcessInstanceByIdAndAddon; @@ -104,6 +105,7 @@ static void setup() { @Transactional void tearDown() { cacheService.getJobsCache().clear(); + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); cacheService.getUserTaskInstancesCache().clear(); } @@ -111,6 +113,10 @@ void tearDown() { @Test //Reproducer for KOGITO-334 void testDefaultGraphqlTypes() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().log().ifValidationFails().statusCode(200).body("data.ProcessDefinitions", isA(Collection.class)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().log().ifValidationFails().statusCode(200).body("data.ProcessInstances", isA(Collection.class)); @@ -124,6 +130,21 @@ void testDefaultGraphqlTypes() { .then().log().ifValidationFails().statusCode(200).body("data.Jobs", isA(Collection.class)); } + protected void validateProcessDefinition(String query, ProcessInstanceDataEvent event) { + LOGGER.debug("GraphQL query: {}", query); + await() + .atMost(timeout) + .untilAsserted(() -> given().contentType(ContentType.JSON).body(query) + .when().post("/graphql") + .then().log().ifValidationFails().statusCode(200) + .body("data.ProcessDefinitions[0].id", is(event.getData().getProcessId())) + .body("data.ProcessDefinitions[0].name", is(event.getData().getProcessName())) + .body("data.ProcessDefinitions[0].version", is(event.getData().getVersion())) + .body("data.ProcessDefinitions[0].type", is(event.getData().getProcessType())) + .body("data.ProcessDefinitions[0].addons", event.getKogitoAddons() == null ? is(nullValue()) : hasItems(event.getKogitoAddons().split(","))) + .body("data.ProcessDefinitions[0].roles", event.getData().getRoles() == null ? is(nullValue()) : hasItems(event.getData().getRoles().toArray()))); + } + protected void validateProcessInstance(String query, ProcessInstanceDataEvent event, String childProcessInstanceId) { LOGGER.debug("GraphQL query: {}", query); await() @@ -272,6 +293,7 @@ void testProcessInstanceIndex() throws Exception { ProcessInstanceDataEvent startEvent = getProcessCloudEvent(processId, processInstanceId, ACTIVE, null, null, null); indexProcessCloudEvent(startEvent); + validateProcessDefinition(getProcessDefinitionByIdAndVersion(startEvent.getKogitoProcessId(), startEvent.getData().getVersion()), startEvent); validateProcessInstance(getProcessInstanceById(processInstanceId), startEvent); validateProcessInstance(getProcessInstanceByIdAndState(processInstanceId, ACTIVE), startEvent); validateProcessInstance(getProcessInstanceByIdAndProcessId(processInstanceId, processId), startEvent); diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/GraphQLUtils.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/GraphQLUtils.java index 6026abaf57..99c322de0a 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/GraphQLUtils.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/GraphQLUtils.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.reflect.FieldUtils; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.ProcessInstanceState; import org.kie.kogito.index.model.UserTaskInstance; @@ -52,8 +53,9 @@ public class GraphQLUtils { private static final Map QUERIES = new HashMap<>(); static { + QUERY_FIELDS.put(ProcessDefinition.class, getAllFieldsList(ProcessDefinition.class).map(getFieldName()).collect(joining(", "))); QUERY_FIELDS.put(UserTaskInstance.class, getAllFieldsList(UserTaskInstance.class).map(getFieldName()).collect(joining(", "))); - QUERY_FIELDS.put(ProcessInstance.class, getAllFieldsList(ProcessInstance.class).map(getFieldName()).collect(joining(", "))); + QUERY_FIELDS.put(ProcessInstance.class, getAllFieldsList(ProcessInstance.class).filter(field -> !field.getName().equals("definition")).map(getFieldName()).collect(joining(", "))); QUERY_FIELDS.put(Job.class, getAllFieldsList(Job.class).map(getFieldName()).collect(joining(", "))); QUERY_FIELDS.computeIfPresent(ProcessInstance.class, (k, v) -> v + ", serviceUrl"); QUERY_FIELDS.computeIfPresent(ProcessInstance.class, (k, v) -> v + ", childProcessInstances { id, processName }"); @@ -71,6 +73,10 @@ public class GraphQLUtils { } } + public static String getProcessDefinitionByIdAndVersion(String id, String version) { + return getProcessDefinitionQuery("ProcessDefinitionByIdAndVersion", id, version); + } + public static String getProcessInstanceById(String id) { return getProcessInstanceQuery("ProcessInstanceById", id); } @@ -207,6 +213,10 @@ private static String getProcessInstanceQuery(String name, String... args) { return getQuery(name, ProcessInstance.class, args); } + private static String getProcessDefinitionQuery(String name, String... args) { + return getQuery(name, ProcessDefinition.class, args); + } + private static String getUserTaskInstanceQuery(String name, String... args) { return getQuery(name, UserTaskInstance.class, args); } diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/api/KogitoRuntimeClientTest.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/api/KogitoRuntimeClientTest.java index 565d9b6dfc..8510d63950 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/api/KogitoRuntimeClientTest.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/api/KogitoRuntimeClientTest.java @@ -285,16 +285,16 @@ public void testGetProcessInstanceDiagram() { } @Test - public void testGetProcessInstanceNodeDefinitions() { + public void testGetProcessDefinitionNodes() { setupIdentityMock(); when(webClientMock.get(anyString())).thenReturn(httpRequestMock); ProcessInstance pI = createProcessInstance(PROCESS_INSTANCE_ID, ERROR); - client.getProcessInstanceNodeDefinitions(SERVICE_URL, pI); + client.getProcessDefinitionNodes(SERVICE_URL, pI.getProcessId()); verify(client).sendGetClientRequest(webClientMock, format(GET_PROCESS_INSTANCE_NODE_DEFINITIONS_PATH, pI.getProcessId(), pI.getId()), - "Get Process Instance available nodes with id: " + pI.getId(), + "Get Process available nodes with id: " + pI.getProcessId(), List.class); ArgumentCaptor handlerCaptor = ArgumentCaptor.forClass(Handler.class); verify(httpRequestMock).send(handlerCaptor.capture()); @@ -314,13 +314,13 @@ public void testGetProcessInstanceNodeDefinitions() { } @Test - public void testGetProcessInstanceSource() { + public void testGetProcessDefinitionSource() { setupIdentityMock(); when(webClientMock.get(anyString())).thenReturn(httpRequestMock); ProcessInstance pI = createProcessInstance(PROCESS_INSTANCE_ID, ERROR); - client.getProcessInstanceSourceFileContent(SERVICE_URL, pI); + client.getProcessDefinitionSourceFileContent(SERVICE_URL, pI.getProcessId()); verify(client).sendGetClientRequest(webClientMock, format(GET_PROCESS_INSTANCE_SOURCE_PATH, pI.getProcessId()), "Get Process Instance source file with processId: " + pI.getProcessId(), diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractQueryIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractQueryIT.java index 7c093ac1f7..563ed1b6fd 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractQueryIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractQueryIT.java @@ -54,11 +54,13 @@ public abstract class AbstractQueryIT { @BeforeEach void setup() { + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); } @AfterEach void tearDown() { + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); } diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractStorageIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractStorageIT.java index 4dc6710ae0..482a87f692 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractStorageIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/cache/AbstractStorageIT.java @@ -82,6 +82,7 @@ void testObjectRemovedListener() throws Exception { @AfterEach void tearDown() { + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); } } diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/AbstractWebSocketSubscriptionIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/AbstractWebSocketSubscriptionIT.java index b267c85d6d..0f2bf8b604 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/AbstractWebSocketSubscriptionIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/AbstractWebSocketSubscriptionIT.java @@ -83,6 +83,7 @@ void setup() { void tearDown() { httpClient.close(); cacheService.getJobsCache().clear(); + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); cacheService.getUserTaskInstancesCache().clear(); if (cacheService.getDomainModelCache("travels") != null) { diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/query/AbstractGraphQLRuntimesQueriesIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/query/AbstractGraphQLRuntimesQueriesIT.java index ad05ddf7af..3d7a4823aa 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/query/AbstractGraphQLRuntimesQueriesIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/graphql/query/AbstractGraphQLRuntimesQueriesIT.java @@ -126,14 +126,13 @@ void testProcessInstanceUpdateVariables() { } @Test - void testProcessInstanceNodeDefinitions() { + void testProcessDefinitionNodes() { String processInstanceId = UUID.randomUUID().toString(); ProcessInstanceDataEvent startEvent = getProcessCloudEvent(processId, processInstanceId, ACTIVE, null, null, null); indexProcessCloudEvent(startEvent); checkOkResponse("{ \"query\" : \"query { ProcessInstances (where: { id: {equal: \\\"" + processInstanceId + "\\\"}}) { nodeDefinitions { id }} }\" }"); - verify(dataIndexApiClient).getProcessInstanceNodeDefinitions(eq("http://localhost:8080"), - eq(getProcessInstance(processId, processInstanceId, 1, null, null))); + verify(dataIndexApiClient).getProcessDefinitionNodes(eq("http://localhost:8080"), eq(processId)); } @Test @@ -149,15 +148,14 @@ void testProcessInstanceDiagram() { } @Test - void testProcessInstanceSource() { + void testProcessDefinitionSource() { String processInstanceId = UUID.randomUUID().toString(); ProcessInstanceDataEvent startEvent = getProcessCloudEvent(processId, processInstanceId, ACTIVE, null, null, null); indexProcessCloudEvent(startEvent); checkOkResponse("{ \"query\" : \"query { ProcessInstances (where: { id: {equal: \\\"" + processInstanceId + "\\\"}}) {source} }\" }"); - verify(dataIndexApiClient).getProcessInstanceSourceFileContent(eq("http://localhost:8080"), - eq(getProcessInstance(processId, processInstanceId, 1, null, null))); + verify(dataIndexApiClient).getProcessDefinitionSourceFileContent(eq("http://localhost:8080"), eq(processId)); } @Test diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractDomainMessagingConsumerIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractDomainMessagingConsumerIT.java index 370e154793..62d5e7816c 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractDomainMessagingConsumerIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractDomainMessagingConsumerIT.java @@ -47,6 +47,7 @@ public abstract class AbstractDomainMessagingConsumerIT { @BeforeEach void setup() throws Exception { protobufService.registerProtoBufferType(getTestProtobufFileContent()); + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); cacheService.getUserTaskInstancesCache().clear(); if (cacheService.getDomainModelCache("travels") != null) { @@ -56,6 +57,7 @@ void setup() throws Exception { @AfterEach void close() { + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); cacheService.getUserTaskInstancesCache().clear(); if (cacheService.getDomainModelCache("travels") != null) { diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingConsumerIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingConsumerIT.java index 8045921328..d9a6e57619 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingConsumerIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingConsumerIT.java @@ -41,6 +41,7 @@ public abstract class AbstractMessagingConsumerIT { @BeforeEach void setup() { cacheService.getJobsCache().clear(); + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); cacheService.getUserTaskInstancesCache().clear(); } @@ -48,6 +49,7 @@ void setup() { @AfterEach void close() { cacheService.getJobsCache().clear(); + cacheService.getProcessDefinitionsCache().clear(); cacheService.getProcessInstancesCache().clear(); cacheService.getUserTaskInstancesCache().clear(); } diff --git a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingLoadKafkaIT.java b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingLoadKafkaIT.java index c567bc0a5c..34b83ea61e 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingLoadKafkaIT.java +++ b/data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/messaging/AbstractMessagingLoadKafkaIT.java @@ -47,6 +47,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static org.kie.kogito.index.model.ProcessInstanceState.ACTIVE; import static org.kie.kogito.index.model.ProcessInstanceState.COMPLETED; +import static org.kie.kogito.index.service.GraphQLUtils.getProcessDefinitionByIdAndVersion; import static org.kie.kogito.index.service.GraphQLUtils.getProcessInstanceById; import static org.kie.kogito.index.service.GraphQLUtils.getTravelsByProcessInstanceId; import static org.kie.kogito.index.service.GraphQLUtils.getTravelsByUserTaskId; @@ -127,9 +128,23 @@ void testMessagingEvents() { }).forEach(pId -> { validateUserTaskInstance(pId, "Completed"); validateProcessInstance(pId, COMPLETED); + validateProcessDefinition(processId, "1.0"); }); } + private void validateProcessDefinition(String processId, String version) { + await() + .atMost(timeout) + .untilAsserted(() -> { + given().contentType(ContentType.JSON).body(getProcessDefinitionByIdAndVersion(processId, version)) + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is(processId)) + .body("data.ProcessDefinitions[0].version", is(version)); + }); + } + private void validateProcessInstance(String processInstanceId, ProcessInstanceState state) { await() .atMost(timeout) diff --git a/data-index/data-index-service/data-index-service-common/src/test/resources/graphql_queries.json b/data-index/data-index-service/data-index-service-common/src/test/resources/graphql_queries.json index 6f0f723967..8da0f683d7 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/resources/graphql_queries.json +++ b/data-index/data-index-service/data-index-service-common/src/test/resources/graphql_queries.json @@ -1,4 +1,11 @@ { + "ProcessDefinitionByIdAndVersion": { + "query": "query ($id: String, $version: String) { ProcessDefinitions( where: { id: { equal : $id }, version: { equal : $version } }, orderBy: { version: ASC }, pagination : { limit: 10, offset: 0 } ){ %s } }", + "variables": { + "id": "%s", + "version": "%s" + } + }, "ProcessInstanceById": { "query": "query ($id: String) { ProcessInstances( where: { id: { equal : $id } }, orderBy: { lastUpdate: ASC }, pagination : { limit: 10, offset: 0 } ){ %s } }", "variables": { diff --git a/data-index/data-index-service/data-index-service-common/src/test/resources/process_instance_event.json b/data-index/data-index-service/data-index-service-common/src/test/resources/process_instance_event.json index dd271aee40..daf703b4f9 100644 --- a/data-index/data-index-service/data-index-service-common/src/test/resources/process_instance_event.json +++ b/data-index/data-index-service/data-index-service-common/src/test/resources/process_instance_event.json @@ -8,6 +8,7 @@ "parentInstanceId": "", "rootInstanceId": "", "processId": "travels", + "version": "1.0", "rootProcessId": "", "processName": "travels", "startDate": "2022-03-18T15:32:21.887+10:00", diff --git a/data-index/data-index-service/data-index-service-infinispan/src/main/resources/META-INF/hotrod-client.properties b/data-index/data-index-service/data-index-service-infinispan/src/main/resources/META-INF/hotrod-client.properties index e7b113add2..ed23c02c1a 100644 --- a/data-index/data-index-service/data-index-service-infinispan/src/main/resources/META-INF/hotrod-client.properties +++ b/data-index/data-index-service/data-index-service-infinispan/src/main/resources/META-INF/hotrod-client.properties @@ -28,6 +28,22 @@ infinispan.client.hotrod.cache.jobs.configuration=\ \ +infinispan.client.hotrod.cache.processdefinitions.configuration=\ + \ + \ + \ + \ + \ + org.kie.kogito.index.model.ProcessDefinition \ + \ + \ + \ + \ + \ + \ + \ + + infinispan.client.hotrod.cache.processinstances.configuration=\ \ \ diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java new file mode 100644 index 0000000000..79d2c2918d --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java @@ -0,0 +1,120 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.kie.kogito.index.model; + +import java.util.Objects; +import java.util.Set; + +public class ProcessDefinition { + + private String id; + private String name; + private String version; + private String type; + private Set roles; + private Set addons; + + private String endpoint; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public Set getRoles() { + return roles; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public void setAddons(Set addons) { + this.addons = addons; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public Set getAddons() { + return addons; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + public String getKey() { + return String.format("%s-%s", id, version); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ProcessDefinition that = (ProcessDefinition) o; + return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(id, version); + } + + @Override + public String toString() { + return "ProcessDefinition{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", version='" + version + '\'' + + ", type='" + type + '\'' + + ", roles=" + roles + + ", addons=" + addons + + ", endpoint='" + endpoint + '\'' + + '}'; + } + +} diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstance.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstance.java index 6561766efd..a70e7335af 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstance.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstance.java @@ -30,6 +30,7 @@ public class ProcessInstance extends ProcessInstanceMeta { private Set addons; private ProcessInstanceError error; + private ProcessDefinition definition; public ObjectNode getVariables() { return variables; @@ -71,12 +72,21 @@ public void setMilestones(List milestones) { this.milestones = milestones; } + public ProcessDefinition getDefinition() { + return definition; + } + + public void setDefinition(ProcessDefinition definition) { + this.definition = definition; + } + @Override public String toString() { return "ProcessInstance{" + "variables=" + variables + ", nodes=" + nodes + ", milestones=" + milestones + + ", definition=" + definition + ", addons=" + addons + ", error=" + error + "} " + super.toString(); diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/Constants.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/Constants.java index 82011328c8..9c6bd7340e 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/Constants.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/Constants.java @@ -28,6 +28,7 @@ private Constants() { public static final String PROCESS_NAME = "processName"; public static final String ID = "id"; + public static final String PROCESS_DEFINITIONS_STORAGE = "processdefinitions"; public static final String PROCESS_INSTANCES_STORAGE = "processinstances"; public static final String USER_TASK_INSTANCES_STORAGE = "usertaskinstances"; public static final String JOBS_STORAGE = "jobs"; diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageService.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageService.java index 1396df4059..2bc18a3db3 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageService.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageService.java @@ -17,6 +17,7 @@ package org.kie.kogito.index.storage; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.persistence.api.Storage; @@ -25,6 +26,8 @@ public interface DataIndexStorageService { + Storage getProcessDefinitionsCache(); + Storage getProcessInstancesCache(); Storage getUserTaskInstancesCache(); diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageServiceImpl.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageServiceImpl.java index cf1f6ace6d..c661a01e79 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageServiceImpl.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageServiceImpl.java @@ -20,6 +20,7 @@ import javax.inject.Inject; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.persistence.api.Storage; @@ -28,6 +29,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import static org.kie.kogito.index.storage.Constants.JOBS_STORAGE; +import static org.kie.kogito.index.storage.Constants.PROCESS_DEFINITIONS_STORAGE; import static org.kie.kogito.index.storage.Constants.PROCESS_ID_MODEL_STORAGE; import static org.kie.kogito.index.storage.Constants.PROCESS_INSTANCES_STORAGE; import static org.kie.kogito.index.storage.Constants.USER_TASK_INSTANCES_STORAGE; @@ -38,6 +40,11 @@ public class DataIndexStorageServiceImpl implements DataIndexStorageService { @Inject StorageService cacheService; + @Override + public Storage getProcessDefinitionsCache() { + return cacheService.getCache(PROCESS_DEFINITIONS_STORAGE, ProcessDefinition.class); + } + @Override public Storage getProcessInstancesCache() { return cacheService.getCache(PROCESS_INSTANCES_STORAGE, ProcessInstance.class); diff --git a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java index 001c75b73c..27ac6990b8 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java +++ b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import org.apache.commons.lang3.RandomStringUtils; @@ -32,6 +33,7 @@ import org.kie.kogito.index.model.Milestone; import org.kie.kogito.index.model.MilestoneStatus; import org.kie.kogito.index.model.NodeInstance; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.ProcessInstanceError; import org.kie.kogito.index.model.ProcessInstanceState; @@ -45,7 +47,17 @@ public class TestUtils { - private static ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = new ObjectMapper(); + + public static ProcessDefinition createProcessDefinition(String processId, String version, Set roles) { + ProcessDefinition pd = new ProcessDefinition(); + pd.setId(processId); + pd.setName(RandomStringUtils.randomAlphabetic(10)); + pd.setVersion(version); + pd.setAddons(singleton("kogito-events")); + pd.setRoles(roles); + return pd; + } public static ProcessInstance createProcessInstance(String processInstanceId, String processId, diff --git a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessDefinitionQueryIT.java b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessDefinitionQueryIT.java new file mode 100644 index 0000000000..d7d9fa55fa --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessDefinitionQueryIT.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.test.query; + +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; + +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.test.QueryTestBase; +import org.kie.kogito.index.test.TestUtils; +import org.kie.kogito.persistence.api.Storage; +import org.kie.kogito.persistence.api.query.SortDirection; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.contains; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.containsAll; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.containsAny; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.equalTo; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.in; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.isNull; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.notNull; +import static org.kie.kogito.persistence.api.query.QueryFilterFactory.orderBy; + +public abstract class AbstractProcessDefinitionQueryIT extends QueryTestBase { + + @Test + void testProcessDefinitionQuery() { + String processId = "travels"; + ProcessDefinition pdv1 = TestUtils.createProcessDefinition(processId, "1.0", Set.of("admin", "kogito")); + Storage storage = getStorage(); + storage.put(pdv1.getKey(), pdv1); + ProcessDefinition pdv2 = TestUtils.createProcessDefinition(processId, "2.0", Set.of("kogito")); + storage.put(pdv2.getKey(), pdv2); + + queryAndAssert(assertWithKey(), storage, singletonList(isNull("type")), null, null, null, pdv1.getKey(), pdv2.getKey()); + queryAndAssert(assertWithKey(), storage, singletonList(notNull("version")), null, null, null, pdv1.getKey(), pdv2.getKey()); + queryAndAssert(assertWithKey(), storage, singletonList(equalTo("version", pdv1.getVersion())), null, null, null, pdv1.getKey()); + queryAndAssert(assertWithKey(), storage, singletonList(contains("roles", "admin")), null, null, null, pdv1.getKey()); + queryAndAssert(assertWithKey(), storage, singletonList(containsAny("roles", asList("admin", "kogito"))), null, null, null, pdv1.getKey(), pdv2.getKey()); + queryAndAssert(assertWithKey(), storage, singletonList(containsAll("roles", asList("admin", "kogito"))), null, null, null, pdv1.getKey()); + queryAndAssert(assertWithKey(), storage, asList(in("id", asList(pdv1.getId(), pdv2.getId())), + in("version", asList(pdv1.getVersion(), pdv2.getVersion()))), + singletonList(orderBy("version", SortDirection.ASC)), 1, 1, pdv2.getKey()); + queryAndAssert(assertWithKey(), storage, null, singletonList(orderBy("version", SortDirection.DESC)), null, + null, pdv2.getKey(), pdv1.getKey()); + } + + public static BiConsumer, String[]> assertWithKey() { + return (instances, ids) -> assertThat(instances).hasSize(ids == null ? 0 : ids.length).extracting("key").containsExactly(ids); + } + +} diff --git a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java index aa7dd1e7d5..35f37cf72c 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java +++ b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java @@ -47,7 +47,7 @@ import static org.kie.kogito.persistence.api.query.QueryFilterFactory.notNull; import static org.kie.kogito.persistence.api.query.QueryFilterFactory.orderBy; -public abstract class AbstractProcessInstanceQueryIT extends QueryTestBase { +public abstract class AbstractProcessInstanceQueryIT extends QueryTestBase { @Test void testProcessInstanceQuery() { diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/InfinispanCacheStartup.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/InfinispanCacheStartup.java index 282bb6569d..c190c73533 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/InfinispanCacheStartup.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/InfinispanCacheStartup.java @@ -32,7 +32,8 @@ public class InfinispanCacheStartup { @PostConstruct public void init() { - //Force caches to be initialized at start up + //Force caches to be initialized at start up + storageService.getProcessDefinitionsCache(); storageService.getProcessInstancesCache(); storageService.getUserTaskInstancesCache(); storageService.getJobsCache(); diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java new file mode 100644 index 0000000000..da5df1fb3b --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java @@ -0,0 +1,74 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.kie.kogito.index.infinispan.protostream; + +import java.io.IOException; +import java.util.HashSet; + +import org.infinispan.protostream.MessageMarshaller; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.persistence.infinispan.protostream.AbstractMarshaller; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ProcessDefinitionMarshaller extends AbstractMarshaller implements MessageMarshaller { + + protected static final String ID = "id"; + protected static final String VERSION = "version"; + protected static final String NAME = "name"; + protected static final String ROLES = "roles"; + protected static final String ADDONS = "addons"; + protected static final String TYPE = "type"; + protected static final String ENDPOINT = "endpoint"; + + public ProcessDefinitionMarshaller(ObjectMapper mapper) { + super(mapper); + } + + @Override + public ProcessDefinition readFrom(ProtoStreamReader reader) throws IOException { + ProcessDefinition pd = new ProcessDefinition(); + pd.setId(reader.readString(ID)); + pd.setVersion(reader.readString(VERSION)); + pd.setName(reader.readString(NAME)); + pd.setRoles(reader.readCollection(ROLES, new HashSet<>(), String.class)); + pd.setAddons(reader.readCollection(ADDONS, new HashSet<>(), String.class)); + pd.setType(reader.readString(TYPE)); + pd.setEndpoint(reader.readString(ENDPOINT)); + return pd; + } + + @Override + public void writeTo(ProtoStreamWriter writer, ProcessDefinition pd) throws IOException { + writer.writeString(ID, pd.getId()); + writer.writeString(VERSION, pd.getVersion()); + writer.writeString(NAME, pd.getName()); + writer.writeCollection(ROLES, pd.getRoles(), String.class); + writer.writeCollection(ADDONS, pd.getAddons(), String.class); + writer.writeString(TYPE, pd.getType()); + writer.writeString(ENDPOINT, pd.getEndpoint()); + } + + @Override + public Class getJavaClass() { + return ProcessDefinition.class; + } + + @Override + public String getTypeName() { + return getJavaClass().getName(); + } +} diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProtostreamProducer.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProtostreamProducer.java index 67a7587325..03f7693c76 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProtostreamProducer.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProtostreamProducer.java @@ -39,6 +39,11 @@ MessageMarshaller processInstanceMarshaller() { return new ProcessInstanceMarshaller(mapper); } + @Produces + MessageMarshaller processDefinitionMarshaller() { + return new ProcessDefinitionMarshaller(mapper); + } + @Produces MessageMarshaller nodeInstanceMarshaller() { return new NodeInstanceMarshaller(mapper); diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshallerTest.java b/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshallerTest.java new file mode 100644 index 0000000000..0bdb6be50f --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshallerTest.java @@ -0,0 +1,97 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.infinispan.protostream; + +import java.io.IOException; +import java.util.HashSet; + +import org.infinispan.protostream.MessageMarshaller; +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.mockito.InOrder; + +import static java.util.Collections.singleton; +import static org.assertj.core.api.Assertions.assertThat; +import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.ADDONS; +import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.ID; +import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.NAME; +import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.ROLES; +import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.TYPE; +import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.VERSION; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class ProcessDefinitionMarshallerTest { + + @Test + void testReadFrom() throws IOException { + MessageMarshaller.ProtoStreamReader reader = mock(MessageMarshaller.ProtoStreamReader.class); + when(reader.readString(ID)).thenReturn("processId"); + when(reader.readString(VERSION)).thenReturn("1.0"); + when(reader.readString(NAME)).thenReturn("processName"); + when(reader.readCollection(eq(ROLES), any(), eq(String.class))).thenReturn(new HashSet<>(singleton("admin"))); + when(reader.readCollection(eq(ADDONS), any(), eq(String.class))).thenReturn(new HashSet<>(singleton("process-management"))); + when(reader.readString(TYPE)).thenReturn("processType"); + + ProcessDefinitionMarshaller marshaller = new ProcessDefinitionMarshaller(null); + ProcessDefinition pd = marshaller.readFrom(reader); + + assertThat(pd) + .isNotNull() + .hasFieldOrPropertyWithValue(ID, "processId") + .hasFieldOrPropertyWithValue(VERSION, "1.0") + .hasFieldOrPropertyWithValue(NAME, "processName") + .hasFieldOrPropertyWithValue(ROLES, singleton("admin")) + .hasFieldOrPropertyWithValue(ADDONS, singleton("process-management")) + .hasFieldOrPropertyWithValue(TYPE, "processType"); + + InOrder inOrder = inOrder(reader); + inOrder.verify(reader).readString(ID); + inOrder.verify(reader).readString(VERSION); + inOrder.verify(reader).readString(NAME); + inOrder.verify(reader).readCollection(ROLES, new HashSet<>(), String.class); + inOrder.verify(reader).readCollection(ADDONS, new HashSet<>(), String.class); + inOrder.verify(reader).readString(TYPE); + } + + @Test + void testWriteTo() throws IOException { + ProcessDefinition pd = new ProcessDefinition(); + pd.setId("processId"); + pd.setVersion("1.0"); + pd.setName("processName"); + pd.setRoles(singleton("admin")); + pd.setAddons(singleton("process-management")); + pd.setType("processType"); + + MessageMarshaller.ProtoStreamWriter writer = mock(MessageMarshaller.ProtoStreamWriter.class); + + ProcessDefinitionMarshaller marshaller = new ProcessDefinitionMarshaller(null); + marshaller.writeTo(writer, pd); + + InOrder inOrder = inOrder(writer); + inOrder.verify(writer).writeString(ID, pd.getId()); + inOrder.verify(writer).writeString(VERSION, pd.getVersion()); + inOrder.verify(writer).writeString(NAME, pd.getName()); + inOrder.verify(writer).writeCollection(ROLES, pd.getRoles(), String.class); + inOrder.verify(writer).writeCollection(ADDONS, pd.getAddons(), String.class); + inOrder.verify(writer).writeString(TYPE, pd.getType()); + } +} diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java new file mode 100644 index 0000000000..ad1135dbfd --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java @@ -0,0 +1,133 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.mongodb.model; + +import java.util.Objects; +import java.util.Set; + +import org.bson.codecs.pojo.annotations.BsonId; + +public class ProcessDefinitionEntity { + + @BsonId + private String key; + + private String id; + + private String version; + private String name; + private String type; + + private Set roles; + + private Set addons; + + private String endpoint; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setVersion(String version) { + this.version = version; + } + + public void setName(String name) { + this.name = name; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public void setAddons(Set addons) { + this.addons = addons; + } + + public String getVersion() { + return version; + } + + public String getName() { + return name; + } + + public Set getRoles() { + return roles; + } + + public Set getAddons() { + return addons; + } + + public void setType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ProcessDefinitionEntity that = (ProcessDefinitionEntity) o; + return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(id, version); + } + + @Override + public String toString() { + return "ProcessDefinitionEntity{" + + "key='" + key + '\'' + + ", id='" + id + '\'' + + ", version='" + version + '\'' + + ", name='" + name + '\'' + + ", type='" + type + '\'' + + ", roles=" + roles + + ", addons=" + addons + + ", endpoint='" + endpoint + '\'' + + '}'; + } +} diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapper.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapper.java new file mode 100644 index 0000000000..fd47ddec81 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapper.java @@ -0,0 +1,73 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.mongodb.model; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.persistence.mongodb.model.MongoEntityMapper; + +public class ProcessDefinitionEntityMapper implements MongoEntityMapper { + + @Override + public Class getEntityClass() { + return ProcessDefinitionEntity.class; + } + + @Override + public ProcessDefinitionEntity mapToEntity(String key, ProcessDefinition pd) { + if (pd == null) { + return null; + } + + ProcessDefinitionEntity entity = new ProcessDefinitionEntity(); + entity.setKey(pd.getKey()); + entity.setId(pd.getId()); + entity.setVersion(pd.getVersion()); + entity.setName(pd.getName()); + entity.setRoles(pd.getRoles()); + entity.setAddons(pd.getAddons()); + entity.setType(pd.getType()); + entity.setEndpoint(pd.getEndpoint()); + return entity; + } + + @Override + public ProcessDefinition mapToModel(ProcessDefinitionEntity entity) { + if (entity == null) { + return null; + } + + ProcessDefinition pd = new ProcessDefinition(); + pd.setId(entity.getId()); + pd.setVersion(entity.getVersion()); + pd.setName(entity.getName()); + pd.setRoles(entity.getRoles()); + pd.setAddons(entity.getAddons()); + pd.setType(entity.getType()); + pd.setEndpoint(entity.getEndpoint()); + return pd; + } + + @Override + public String convertToMongoAttribute(String attribute) { + return attribute; + } + + @Override + public String convertToModelAttribute(String attribute) { + return attribute; + } +} \ No newline at end of file diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImpl.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImpl.java index 3927afb46e..aab322ab85 100644 --- a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImpl.java +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImpl.java @@ -26,10 +26,12 @@ import javax.inject.Inject; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.mongodb.model.DomainEntityMapper; import org.kie.kogito.index.mongodb.model.JobEntityMapper; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntityMapper; import org.kie.kogito.index.mongodb.model.ProcessIdEntityMapper; import org.kie.kogito.index.mongodb.model.ProcessInstanceEntityMapper; import org.kie.kogito.index.mongodb.model.UserTaskInstanceEntityMapper; @@ -39,6 +41,7 @@ import static org.kie.kogito.index.mongodb.Constants.isDomainCollection; import static org.kie.kogito.index.storage.Constants.JOBS_STORAGE; +import static org.kie.kogito.index.storage.Constants.PROCESS_DEFINITIONS_STORAGE; import static org.kie.kogito.index.storage.Constants.PROCESS_ID_MODEL_STORAGE; import static org.kie.kogito.index.storage.Constants.PROCESS_INSTANCES_STORAGE; import static org.kie.kogito.index.storage.Constants.USER_TASK_INSTANCES_STORAGE; @@ -51,12 +54,14 @@ public class MongoModelServiceImpl implements MongoModelService { static final Map>> ENTITY_MAPPER_MAP = Map.of( JOBS_STORAGE, JobEntityMapper::new, + PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntityMapper::new, PROCESS_INSTANCES_STORAGE, ProcessInstanceEntityMapper::new, USER_TASK_INSTANCES_STORAGE, UserTaskInstanceEntityMapper::new, PROCESS_ID_MODEL_STORAGE, ProcessIdEntityMapper::new); @PostConstruct void init() { + indexCreateOrUpdateEvent.fire(new IndexCreateOrUpdateEvent(PROCESS_DEFINITIONS_STORAGE, ProcessDefinition.class.getName())); indexCreateOrUpdateEvent.fire(new IndexCreateOrUpdateEvent(PROCESS_INSTANCES_STORAGE, ProcessInstance.class.getName())); indexCreateOrUpdateEvent.fire(new IndexCreateOrUpdateEvent(USER_TASK_INSTANCES_STORAGE, UserTaskInstance.class.getName())); indexCreateOrUpdateEvent.fire(new IndexCreateOrUpdateEvent(JOBS_STORAGE, Job.class.getName())); diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapperTest.java b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapperTest.java new file mode 100644 index 0000000000..999bf6ac0e --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntityMapperTest.java @@ -0,0 +1,89 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.mongodb.model; + +import java.util.Set; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.persistence.mongodb.model.ModelUtils; + +import static java.util.Collections.singleton; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.kie.kogito.persistence.mongodb.model.ModelUtils.MONGO_ID; + +class ProcessDefinitionEntityMapperTest { + + ProcessDefinitionEntityMapper mapper = new ProcessDefinitionEntityMapper(); + + ProcessDefinition pd = new ProcessDefinition(); + + ProcessDefinitionEntity entity = new ProcessDefinitionEntity(); + + @BeforeEach + void setup() { + String version = "1.0"; + String processId = "testProcessId"; + Set roles = singleton("testRoles"); + String type = "testType"; + Set addons = singleton("testAddons"); + + pd.setId(processId); + pd.setVersion(version); + pd.setRoles(roles); + pd.setAddons(addons); + pd.setType(type); + + entity.setId(processId); + entity.setVersion(version); + entity.setRoles(roles); + entity.setAddons(addons); + entity.setType(type); + } + + @Test + void testGetEntityClass() { + assertEquals(ProcessDefinitionEntity.class, mapper.getEntityClass()); + } + + @Test + void testMapToEntity() { + ProcessDefinitionEntity result = mapper.mapToEntity(pd.getId(), pd); + assertEquals(entity, result); + } + + @Test + void testMapToModel() { + ProcessDefinition result = mapper.mapToModel(entity); + assertEquals(pd, result); + } + + @Test + void testConvertToMongoAttribute() { + assertEquals(MONGO_ID, mapper.convertToMongoAttribute(MONGO_ID)); + String testAttribute = "testAttribute"; + assertEquals(testAttribute, mapper.convertToMongoAttribute(testAttribute)); + } + + @Test + void testConvertToModelAttribute() { + assertEquals(ModelUtils.ID, mapper.convertToModelAttribute(ModelUtils.ID)); + String testAttribute = "test.attribute.go"; + assertEquals(testAttribute, mapper.convertToModelAttribute(testAttribute)); + } +} diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/query/ProcessDefinitionQueryIT.java b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/query/ProcessDefinitionQueryIT.java new file mode 100644 index 0000000000..739e57746f --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/query/ProcessDefinitionQueryIT.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.mongodb.query; + +import javax.inject.Inject; + +import org.junit.jupiter.api.BeforeEach; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntity; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntityMapper; +import org.kie.kogito.index.test.query.AbstractProcessDefinitionQueryIT; +import org.kie.kogito.persistence.api.Storage; +import org.kie.kogito.persistence.mongodb.client.MongoClientManager; +import org.kie.kogito.persistence.mongodb.storage.MongoStorage; +import org.kie.kogito.testcontainers.quarkus.MongoDBQuarkusTestResource; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +import static org.kie.kogito.index.storage.Constants.PROCESS_DEFINITIONS_STORAGE; + +@QuarkusTest +@QuarkusTestResource(MongoDBQuarkusTestResource.class) +class ProcessDefinitionQueryIT extends AbstractProcessDefinitionQueryIT { + + @Inject + MongoClientManager mongoClientManager; + + Storage storage; + + @BeforeEach + void setUp() { + this.storage = new MongoStorage<>(mongoClientManager.getCollection(PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntity.class), + ProcessDefinition.class.getName(), new ProcessDefinitionEntityMapper()); + } + + @Override + public Storage getStorage() { + return storage; + } +} diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImplIT.java b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImplIT.java index a57d2bf2ee..b0f15736b6 100644 --- a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImplIT.java +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/MongoModelServiceImplIT.java @@ -23,12 +23,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.mongodb.mock.MockIndexCreateOrUpdateEventListener; import org.kie.kogito.index.mongodb.model.DomainEntityMapper; import org.kie.kogito.index.mongodb.model.JobEntity; import org.kie.kogito.index.mongodb.model.JobEntityMapper; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntity; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntityMapper; import org.kie.kogito.index.mongodb.model.ProcessIdEntity; import org.kie.kogito.index.mongodb.model.ProcessIdEntityMapper; import org.kie.kogito.index.mongodb.model.ProcessInstanceEntity; @@ -45,6 +48,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.kie.kogito.index.storage.Constants.JOBS_STORAGE; +import static org.kie.kogito.index.storage.Constants.PROCESS_DEFINITIONS_STORAGE; import static org.kie.kogito.index.storage.Constants.PROCESS_ID_MODEL_STORAGE; import static org.kie.kogito.index.storage.Constants.PROCESS_INSTANCES_STORAGE; import static org.kie.kogito.index.storage.Constants.USER_TASK_INSTANCES_STORAGE; @@ -75,6 +79,7 @@ void tearDown() { void testInit() { mongoModelServiceImpl.init(); + mockIndexCreateOrUpdateEventListener.assertFire(PROCESS_DEFINITIONS_STORAGE, ProcessDefinition.class.getName()); mockIndexCreateOrUpdateEventListener.assertFire(PROCESS_INSTANCES_STORAGE, ProcessInstance.class.getName()); mockIndexCreateOrUpdateEventListener.assertFire(USER_TASK_INSTANCES_STORAGE, UserTaskInstance.class.getName()); mockIndexCreateOrUpdateEventListener.assertFire(JOBS_STORAGE, Job.class.getName()); @@ -83,6 +88,7 @@ void testInit() { @Test void testGetEntityMapper() { assertTrue(mongoModelServiceImpl. getEntityMapper(JOBS_STORAGE) instanceof JobEntityMapper); + assertTrue(mongoModelServiceImpl. getEntityMapper(PROCESS_DEFINITIONS_STORAGE) instanceof ProcessDefinitionEntityMapper); assertTrue(mongoModelServiceImpl. getEntityMapper(PROCESS_INSTANCES_STORAGE) instanceof ProcessInstanceEntityMapper); assertTrue(mongoModelServiceImpl. getEntityMapper(USER_TASK_INSTANCES_STORAGE) instanceof UserTaskInstanceEntityMapper); assertTrue(mongoModelServiceImpl. getEntityMapper(PROCESS_ID_MODEL_STORAGE) instanceof ProcessIdEntityMapper); diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/ProcessDefinitionStorageIT.java b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/ProcessDefinitionStorageIT.java new file mode 100644 index 0000000000..bdd558f29c --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/ProcessDefinitionStorageIT.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.mongodb.storage; + +import java.util.Set; + +import javax.inject.Inject; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntity; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntityMapper; +import org.kie.kogito.index.test.TestUtils; +import org.kie.kogito.persistence.api.Storage; +import org.kie.kogito.persistence.mongodb.client.MongoClientManager; +import org.kie.kogito.persistence.mongodb.storage.MongoStorage; +import org.kie.kogito.testcontainers.quarkus.MongoDBQuarkusTestResource; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +import static org.kie.kogito.index.storage.Constants.PROCESS_DEFINITIONS_STORAGE; + +@QuarkusTest +@QuarkusTestResource(MongoDBQuarkusTestResource.class) +class ProcessDefinitionStorageIT extends StorageTestBase { + + @Inject + MongoClientManager mongoClientManager; + + Storage storage; + + @BeforeEach + void setUp() { + this.storage = new MongoStorage<>(mongoClientManager.getCollection(PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntity.class), + ProcessDefinition.class.getName(), new ProcessDefinitionEntityMapper()); + } + + @AfterEach + void tearDown() { + storage.clear(); + } + + @Test + void testCache() { + String processId = "travels"; + String version = "1.0"; + ProcessDefinition pdv1 = TestUtils.createProcessDefinition(processId, version, Set.of("admin", "kogito")); + ProcessDefinition pdv2 = TestUtils.createProcessDefinition(processId, version, Set.of("kogito")); + testStorage(storage, pdv1.getKey(), pdv1, pdv2); + } +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapper.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapper.java new file mode 100644 index 0000000000..0243d9c301 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.mapper; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntity; +import org.mapstruct.InheritInverseConfiguration; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "cdi") +public interface ProcessDefinitionEntityMapper { + + ProcessDefinitionEntity mapToEntity(ProcessDefinition pd); + + @InheritInverseConfiguration + ProcessDefinition mapToModel(ProcessDefinitionEntity pd); + +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntity.java new file mode 100644 index 0000000000..839dcbb3b5 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntity.java @@ -0,0 +1,150 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.model; + +import java.util.Objects; +import java.util.Set; + +import javax.persistence.CollectionTable; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.ForeignKey; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.JoinColumn; +import javax.persistence.Table; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +@Entity(name = "definitions") +@Table(name = "definitions") +@IdClass(ProcessDefinitionEntityId.class) +public class ProcessDefinitionEntity extends AbstractEntity { + + @Id + private String id; + + @Id + private String version; + private String name; + private String type; + + private String endpoint; + + @ElementCollection + @JoinColumn(name = "id") + @CollectionTable(name = "definitions_roles", joinColumns = { @JoinColumn(name = "process_id"), + @JoinColumn(name = "process_version") }, foreignKey = @ForeignKey(name = "fk_definitions_roles_definitions")) + @OnDelete(action = OnDeleteAction.CASCADE) + @Column(name = "role", nullable = false) + private Set roles; + + @ElementCollection + @JoinColumn(name = "id") + @CollectionTable(name = "definitions_addons", joinColumns = { @JoinColumn(name = "process_id"), + @JoinColumn(name = "process_version") }, foreignKey = @ForeignKey(name = "fk_definitions_addons_definitions")) + @OnDelete(action = OnDeleteAction.CASCADE) + @Column(name = "addon", nullable = false) + private Set addons; + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setVersion(String version) { + this.version = version; + } + + public void setName(String name) { + this.name = name; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public void setAddons(Set addons) { + this.addons = addons; + } + + public String getVersion() { + return version; + } + + public String getName() { + return name; + } + + public Set getRoles() { + return roles; + } + + public Set getAddons() { + return addons; + } + + public void setType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ProcessDefinitionEntity that = (ProcessDefinitionEntity) o; + return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(id, version); + } + + @Override + public String toString() { + return "ProcessDefinitionEntity{" + + "id='" + id + '\'' + + ", version='" + version + '\'' + + ", name='" + name + '\'' + + ", type='" + type + '\'' + + ", endpoint='" + endpoint + '\'' + + ", roles=" + roles + + ", addons=" + addons + + '}'; + } +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityId.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityId.java new file mode 100644 index 0000000000..d8150f3a49 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityId.java @@ -0,0 +1,84 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.model; + +import java.io.Serializable; +import java.util.Objects; + +public class ProcessDefinitionEntityId implements Serializable { + + private String id; + + private String version; + + public ProcessDefinitionEntityId() { + } + + public ProcessDefinitionEntityId(String key) { + String[] split = key.split("-"); + this.id = split[0]; + this.version = split[1]; + } + + public ProcessDefinitionEntityId(String id, String version) { + this.id = id; + this.version = version; + } + + public String getKey() { + return String.format("%s-%s", id, version); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ProcessDefinitionEntityId that = (ProcessDefinitionEntityId) o; + return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(id, version); + } + + @Override + public String toString() { + return "ProcessDefinitionEntityId{" + + "id='" + id + '\'' + + ", version='" + version + '\'' + + '}'; + } +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityRepository.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityRepository.java new file mode 100644 index 0000000000..88be8193c3 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/model/ProcessDefinitionEntityRepository.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.model; + +import javax.enterprise.context.ApplicationScoped; + +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; + +@ApplicationScoped +public class ProcessDefinitionEntityRepository implements PanacheRepositoryBase { + +} \ No newline at end of file diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/AbstractStorage.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/AbstractStorage.java index a82cea497d..d365088eb6 100644 --- a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/AbstractStorage.java +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/AbstractStorage.java @@ -40,16 +40,19 @@ public abstract class AbstractStorage implements St private Function mapToModel; private Function mapToEntity; + private Function mapEntityToKey; + protected AbstractStorage() { } protected AbstractStorage(PanacheRepositoryBase repository, Class modelClass, Class entityClass, Function mapToModel, - Function mapToEntity) { + Function mapToEntity, Function mapEntityToKey) { this.repository = repository; this.modelClass = modelClass; this.mapToModel = mapToModel; this.mapToEntity = mapToEntity; this.entityClass = entityClass; + this.mapEntityToKey = mapEntityToKey; } @Override @@ -103,7 +106,7 @@ public boolean containsKey(String key) { @Override public Map entries() { - return repository.streamAll().collect(toMap(AbstractEntity::getId, mapToModel)); + return repository.streamAll().collect(toMap(mapEntityToKey, mapToModel)); } @Override @@ -116,4 +119,8 @@ public void clear() { public String getRootType() { return modelClass.getCanonicalName(); } + + protected PanacheRepositoryBase getRepository() { + return repository; + } } diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/JobEntityStorage.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/JobEntityStorage.java index 0ba57a8415..c6e1f20bbe 100644 --- a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/JobEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/JobEntityStorage.java @@ -21,6 +21,7 @@ import org.kie.kogito.index.model.Job; import org.kie.kogito.index.oracle.mapper.JobEntityMapper; +import org.kie.kogito.index.oracle.model.AbstractEntity; import org.kie.kogito.index.oracle.model.JobEntity; import org.kie.kogito.index.oracle.model.JobEntityRepository; @@ -32,6 +33,6 @@ public JobEntityStorage() { @Inject public JobEntityStorage(JobEntityRepository repository, JobEntityMapper mapper) { - super(repository, Job.class, JobEntity.class, e -> mapper.mapToModel(e), m -> mapper.mapToEntity(m)); + super(repository, Job.class, JobEntity.class, mapper::mapToModel, mapper::mapToEntity, AbstractEntity::getId); } } diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/OracleStorageService.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/OracleStorageService.java index 5a3cdeec90..3af6c90b3a 100644 --- a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/OracleStorageService.java +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/OracleStorageService.java @@ -19,6 +19,7 @@ import javax.inject.Inject; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.persistence.api.Storage; @@ -36,6 +37,9 @@ @IfBuildProperty(name = PERSISTENCE_TYPE_PROPERTY, stringValue = ORACLE_STORAGE) public class OracleStorageService implements StorageService { + @Inject + ProcessDefinitionEntityStorage definitionStorage; + @Inject ProcessInstanceEntityStorage processStorage; @@ -55,6 +59,9 @@ public Storage getCache(String name, Class type) { if (type == ProcessInstance.class) { return (Storage) processStorage; } + if (type == ProcessDefinition.class) { + return (Storage) definitionStorage; + } if (type == Job.class) { return (Storage) jobStorage; } diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionEntityStorage.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionEntityStorage.java new file mode 100644 index 0000000000..8904791889 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionEntityStorage.java @@ -0,0 +1,79 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.storage; + +import java.util.Optional; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.persistence.EntityManager; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.oracle.mapper.ProcessDefinitionEntityMapper; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntity; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntityId; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntityRepository; + +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; + +@ApplicationScoped +public class ProcessDefinitionEntityStorage extends AbstractStorage { + + public ProcessDefinitionEntityStorage() { + } + + @Inject + public ProcessDefinitionEntityStorage(ProcessDefinitionEntityRepository repository, ProcessDefinitionEntityMapper mapper) { + super(new RepositoryAdapter(repository), ProcessDefinition.class, ProcessDefinitionEntity.class, mapper::mapToModel, mapper::mapToEntity, e -> new ProcessDefinitionEntityId(e.getId(), + e.getVersion()).getKey()); + } + + @Override + public boolean containsKey(String key) { + ProcessDefinitionEntityId id = new ProcessDefinitionEntityId(key); + return getRepository().count("id = ?1 and version = ?2", id.getId(), id.getVersion()) == 1; + } + + static class RepositoryAdapter implements PanacheRepositoryBase { + + ProcessDefinitionEntityRepository repository; + + public RepositoryAdapter(ProcessDefinitionEntityRepository repository) { + this.repository = repository; + } + + @Override + public boolean deleteById(String key) { + return repository.deleteById(new ProcessDefinitionEntityId(key)); + } + + @Override + public Optional findByIdOptional(String key) { + return repository.findByIdOptional(new ProcessDefinitionEntityId(key)); + } + + @Override + public void persist(ProcessDefinitionEntity entity) { + repository.persist(entity); + } + + @Override + public EntityManager getEntityManager() { + return repository.getEntityManager(); + } + } +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessInstanceEntityStorage.java index 46e84b7159..eafdce9429 100644 --- a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/ProcessInstanceEntityStorage.java @@ -21,6 +21,7 @@ import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.oracle.mapper.ProcessInstanceEntityMapper; +import org.kie.kogito.index.oracle.model.AbstractEntity; import org.kie.kogito.index.oracle.model.ProcessInstanceEntity; import org.kie.kogito.index.oracle.model.ProcessInstanceEntityRepository; @@ -32,6 +33,6 @@ public ProcessInstanceEntityStorage() { @Inject public ProcessInstanceEntityStorage(ProcessInstanceEntityRepository repository, ProcessInstanceEntityMapper mapper) { - super(repository, ProcessInstance.class, ProcessInstanceEntity.class, e -> mapper.mapToModel(e), m -> mapper.mapToEntity(m)); + super(repository, ProcessInstance.class, ProcessInstanceEntity.class, mapper::mapToModel, mapper::mapToEntity, AbstractEntity::getId); } } diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/UserTaskInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/UserTaskInstanceEntityStorage.java index 7335a17c94..9cc2f50775 100644 --- a/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/UserTaskInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/java/org/kie/kogito/index/oracle/storage/UserTaskInstanceEntityStorage.java @@ -21,6 +21,7 @@ import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.oracle.mapper.UserTaskInstanceEntityMapper; +import org.kie.kogito.index.oracle.model.AbstractEntity; import org.kie.kogito.index.oracle.model.UserTaskInstanceEntity; import org.kie.kogito.index.oracle.model.UserTaskInstanceEntityRepository; @@ -32,6 +33,6 @@ public UserTaskInstanceEntityStorage() { @Inject public UserTaskInstanceEntityStorage(UserTaskInstanceEntityRepository repository, UserTaskInstanceEntityMapper mapper) { - super(repository, UserTaskInstance.class, UserTaskInstanceEntity.class, e -> mapper.mapToModel(e), m -> mapper.mapToEntity(m)); + super(repository, UserTaskInstance.class, UserTaskInstanceEntity.class, mapper::mapToModel, mapper::mapToEntity, AbstractEntity::getId); } } diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql b/data-index/data-index-storage/data-index-storage-oracle/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql new file mode 100644 index 0000000000..fec8ae8896 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql @@ -0,0 +1,37 @@ +create table definitions +( + id varchar2(255 char) not null, + version varchar2(255 char) not null, + name varchar2(255 char), + type varchar2(255 char), + endpoint varchar2(255 char), + primary key (id, version) +); + +create table definitions_addons +( + process_id varchar2(255 char) not null, + process_version varchar2(255 char) not null, + addon varchar2(255 char) not null, + primary key (process_id, process_version, addon) +); + +create table definitions_roles +( + process_id varchar2(255 char) not null, + process_version varchar2(255 char) not null, + role varchar2(255 char) not null, + primary key (process_id, process_version, role) +); + +alter table definitions_addons + add constraint fk_definitions_addons_definitions + foreign key (process_id, process_version) + references definitions + on delete cascade; + +alter table definitions_roles + add constraint fk_definitions_roles_definitions + foreign key (process_id, process_version) + references definitions + on delete cascade; \ No newline at end of file diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapperIT.java b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapperIT.java new file mode 100644 index 0000000000..21ace047c6 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/mapper/ProcessDefinitionEntityMapperIT.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.mapper; + +import java.util.Set; + +import javax.inject.Inject; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntity; + +import io.quarkus.test.junit.QuarkusTest; + +import static java.util.Collections.singleton; +import static org.assertj.core.api.Assertions.assertThat; + +@QuarkusTest +class ProcessDefinitionEntityMapperIT { + + ProcessDefinition processDefinition = new ProcessDefinition(); + ProcessDefinitionEntity processDefinitionEntity = new ProcessDefinitionEntity(); + + @Inject + ProcessDefinitionEntityMapper mapper; + + @BeforeEach + void setup() { + String version = "1.0"; + String processId = "testProcessId"; + Set roles = singleton("testRoles"); + String type = "testType"; + Set addons = singleton("testAddons"); + + processDefinition.setId(processId); + processDefinition.setVersion(version); + processDefinition.setRoles(roles); + processDefinition.setAddons(addons); + processDefinition.setType(type); + + processDefinitionEntity.setId(processId); + processDefinitionEntity.setVersion(version); + processDefinitionEntity.setRoles(roles); + processDefinitionEntity.setAddons(addons); + processDefinitionEntity.setType(type); + } + + @Test + void testMapToEntity() { + ProcessDefinitionEntity result = mapper.mapToEntity(processDefinition); + assertThat(result).usingRecursiveComparison().ignoringFieldsMatchingRegexes(".*\\$\\$_hibernate_tracker").isEqualTo(processDefinitionEntity); + } + + @Test + void testMapToModel() { + ProcessDefinition result = mapper.mapToModel(processDefinitionEntity); + assertThat(result).usingRecursiveComparison().isEqualTo(processDefinition); + } + +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/query/ProcessDefinitionEntityQueryIT.java b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/query/ProcessDefinitionEntityQueryIT.java new file mode 100644 index 0000000000..5829e42603 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/query/ProcessDefinitionEntityQueryIT.java @@ -0,0 +1,42 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.query; + +import javax.inject.Inject; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.oracle.storage.ProcessDefinitionEntityStorage; +import org.kie.kogito.index.test.query.AbstractProcessDefinitionQueryIT; +import org.kie.kogito.persistence.api.Storage; +import org.kie.kogito.testcontainers.quarkus.OracleSqlQuarkusTestResource; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +@QuarkusTestResource(OracleSqlQuarkusTestResource.class) +class ProcessDefinitionEntityQueryIT extends AbstractProcessDefinitionQueryIT { + + @Inject + ProcessDefinitionEntityStorage storage; + + @Override + public Storage getStorage() { + return storage; + } + +} diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/schema/DDLSchemaExporter.java b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/schema/DDLSchemaExporter.java index c2fe8a6a8d..7f2bf10f9e 100644 --- a/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/schema/DDLSchemaExporter.java +++ b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/schema/DDLSchemaExporter.java @@ -32,17 +32,16 @@ import org.kie.kogito.index.oracle.model.JobEntity; import org.kie.kogito.index.oracle.model.MilestoneEntity; import org.kie.kogito.index.oracle.model.NodeInstanceEntity; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntity; import org.kie.kogito.index.oracle.model.ProcessInstanceEntity; import org.kie.kogito.index.oracle.model.ProcessInstanceErrorEntity; import org.kie.kogito.index.oracle.model.UserTaskInstanceEntity; import org.kie.kogito.testcontainers.KogitoOracleSqlContainer; -import org.testcontainers.containers.wait.strategy.Wait; public class DDLSchemaExporter { public static void main(String[] args) { try (KogitoOracleSqlContainer oracleSql = new KogitoOracleSqlContainer()) { - oracleSql.waitingFor(Wait.forListeningPort()); oracleSql.start(); Map settings = new HashMap<>(); settings.put(Environment.URL, oracleSql.getJdbcUrl()); @@ -53,6 +52,7 @@ public static void main(String[] args) { StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(settings).build(); MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(ProcessDefinitionEntity.class); metadataSources.addAnnotatedClass(JobEntity.class); metadataSources.addAnnotatedClass(MilestoneEntity.class); metadataSources.addAnnotatedClass(NodeInstanceEntity.class); diff --git a/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionStorageIT.java b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionStorageIT.java new file mode 100644 index 0000000000..da331e67c2 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-oracle/src/test/java/org/kie/kogito/index/oracle/storage/ProcessDefinitionStorageIT.java @@ -0,0 +1,69 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.oracle.storage; + +import java.util.Set; + +import javax.inject.Inject; +import javax.transaction.Transactional; + +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntity; +import org.kie.kogito.index.oracle.model.ProcessDefinitionEntityRepository; +import org.kie.kogito.index.test.TestUtils; +import org.kie.kogito.persistence.api.StorageService; +import org.kie.kogito.testcontainers.quarkus.OracleSqlQuarkusTestResource; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +@QuarkusTestResource(OracleSqlQuarkusTestResource.class) +class ProcessDefinitionStorageIT extends AbstractStorageIT { + + @Inject + ProcessDefinitionEntityRepository repository; + + @Inject + StorageService storage; + + public ProcessDefinitionStorageIT() { + super(ProcessDefinition.class); + } + + @Override + public ProcessDefinitionEntityStorage.RepositoryAdapter getRepository() { + return new ProcessDefinitionEntityStorage.RepositoryAdapter(repository); + } + + @Override + public StorageService getStorage() { + return storage; + } + + @Test + @Transactional + void testProcessInstanceEntity() { + String processId = "travels"; + String version = "1.0"; + ProcessDefinition pdv1 = TestUtils.createProcessDefinition(processId, version, Set.of("admin", "kogito")); + ProcessDefinition pdv2 = TestUtils.createProcessDefinition(processId, version, Set.of("kogito")); + testStorage(pdv1.getKey(), pdv1, pdv2); + } + +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapper.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapper.java new file mode 100644 index 0000000000..1423160198 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.mapper; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntity; +import org.mapstruct.InheritInverseConfiguration; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "cdi") +public interface ProcessDefinitionEntityMapper { + + ProcessDefinitionEntity mapToEntity(ProcessDefinition pd); + + @InheritInverseConfiguration + ProcessDefinition mapToModel(ProcessDefinitionEntity pd); + +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntity.java new file mode 100644 index 0000000000..e94e2ec0ff --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntity.java @@ -0,0 +1,150 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.model; + +import java.util.Objects; +import java.util.Set; + +import javax.persistence.CollectionTable; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.ForeignKey; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.JoinColumn; +import javax.persistence.Table; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +@Entity(name = "definitions") +@Table(name = "definitions") +@IdClass(ProcessDefinitionEntityId.class) +public class ProcessDefinitionEntity extends AbstractEntity { + + @Id + private String id; + + @Id + private String version; + private String name; + private String type; + + @ElementCollection + @JoinColumn(name = "id") + @CollectionTable(name = "definitions_roles", joinColumns = { @JoinColumn(name = "process_id"), + @JoinColumn(name = "process_version") }, foreignKey = @ForeignKey(name = "fk_definitions_roles_definitions")) + @OnDelete(action = OnDeleteAction.CASCADE) + @Column(name = "role", nullable = false) + private Set roles; + + @ElementCollection + @JoinColumn(name = "id") + @CollectionTable(name = "definitions_addons", joinColumns = { @JoinColumn(name = "process_id"), + @JoinColumn(name = "process_version") }, foreignKey = @ForeignKey(name = "fk_definitions_addons_definitions")) + @OnDelete(action = OnDeleteAction.CASCADE) + @Column(name = "addon", nullable = false) + private Set addons; + + private String endpoint; + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setVersion(String version) { + this.version = version; + } + + public void setName(String name) { + this.name = name; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public void setAddons(Set addons) { + this.addons = addons; + } + + public String getVersion() { + return version; + } + + public String getName() { + return name; + } + + public Set getRoles() { + return roles; + } + + public Set getAddons() { + return addons; + } + + public void setType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ProcessDefinitionEntity that = (ProcessDefinitionEntity) o; + return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(id, version); + } + + @Override + public String toString() { + return "ProcessDefinitionEntity{" + + "id='" + id + '\'' + + ", version='" + version + '\'' + + ", name='" + name + '\'' + + ", type='" + type + '\'' + + ", roles=" + roles + + ", addons=" + addons + + ", endpoint='" + endpoint + '\'' + + '}'; + } +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityId.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityId.java new file mode 100644 index 0000000000..0aba5ca672 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityId.java @@ -0,0 +1,84 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.model; + +import java.io.Serializable; +import java.util.Objects; + +public class ProcessDefinitionEntityId implements Serializable { + + private String id; + + private String version; + + public ProcessDefinitionEntityId() { + } + + public ProcessDefinitionEntityId(String key) { + String[] split = key.split("-"); + this.id = split[0]; + this.version = split[1]; + } + + public ProcessDefinitionEntityId(String id, String version) { + this.id = id; + this.version = version; + } + + public String getKey() { + return String.format("%s-%s", id, version); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ProcessDefinitionEntityId that = (ProcessDefinitionEntityId) o; + return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(id, version); + } + + @Override + public String toString() { + return "ProcessDefinitionEntityId{" + + "id='" + id + '\'' + + ", version='" + version + '\'' + + '}'; + } +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityRepository.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityRepository.java new file mode 100644 index 0000000000..198cd99b21 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/model/ProcessDefinitionEntityRepository.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.model; + +import javax.enterprise.context.ApplicationScoped; + +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; + +@ApplicationScoped +public class ProcessDefinitionEntityRepository implements PanacheRepositoryBase { + +} \ No newline at end of file diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/AbstractStorage.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/AbstractStorage.java index f0ea0ec5be..2118fa991d 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/AbstractStorage.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/AbstractStorage.java @@ -39,17 +39,19 @@ public abstract class AbstractStorage implements St private Class entityClass; private Function mapToModel; private Function mapToEntity; + private Function mapEntityToKey; protected AbstractStorage() { } protected AbstractStorage(PanacheRepositoryBase repository, Class modelClass, Class entityClass, Function mapToModel, - Function mapToEntity) { + Function mapToEntity, Function mapEntityToKey) { this.repository = repository; this.modelClass = modelClass; this.mapToModel = mapToModel; this.mapToEntity = mapToEntity; this.entityClass = entityClass; + this.mapEntityToKey = mapEntityToKey; } @Override @@ -103,7 +105,7 @@ public boolean containsKey(String key) { @Override public Map entries() { - return repository.streamAll().collect(toMap(AbstractEntity::getId, mapToModel)); + return repository.streamAll().collect(toMap(mapEntityToKey, mapToModel)); } @Override @@ -116,4 +118,8 @@ public void clear() { public String getRootType() { return modelClass.getCanonicalName(); } + + protected PanacheRepositoryBase getRepository() { + return repository; + } } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/JobEntityStorage.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/JobEntityStorage.java index f7bec0e6c6..6e5f96f492 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/JobEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/JobEntityStorage.java @@ -21,6 +21,7 @@ import org.kie.kogito.index.model.Job; import org.kie.kogito.index.postgresql.mapper.JobEntityMapper; +import org.kie.kogito.index.postgresql.model.AbstractEntity; import org.kie.kogito.index.postgresql.model.JobEntity; import org.kie.kogito.index.postgresql.model.JobEntityRepository; @@ -32,6 +33,6 @@ public JobEntityStorage() { @Inject public JobEntityStorage(JobEntityRepository repository, JobEntityMapper mapper) { - super(repository, Job.class, JobEntity.class, e -> mapper.mapToModel(e), m -> mapper.mapToEntity(m)); + super(repository, Job.class, JobEntity.class, mapper::mapToModel, mapper::mapToEntity, AbstractEntity::getId); } } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlQuery.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlQuery.java index 8216e99396..3e6ce9e28d 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlQuery.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlQuery.java @@ -38,9 +38,9 @@ import static java.util.stream.Collectors.toList; -public class PostgreSqlQuery implements Query { +public class PostgreSqlQuery implements Query { - private PanacheRepositoryBase repository; + private PanacheRepositoryBase repository; private Integer limit; private Integer offset; private List> filters; @@ -48,7 +48,7 @@ public class PostgreSqlQuery implements Query { private Class entityClass; private Function mapper; - public PostgreSqlQuery(PanacheRepositoryBase repository, Function mapper, Class entityClass) { + public PostgreSqlQuery(PanacheRepositoryBase repository, Function mapper, Class entityClass) { this.repository = repository; this.mapper = mapper; this.entityClass = entityClass; diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlStorageService.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlStorageService.java index b1176c1c09..05fed40714 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlStorageService.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/PostgreSqlStorageService.java @@ -19,6 +19,7 @@ import javax.inject.Inject; import org.kie.kogito.index.model.Job; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.persistence.api.Storage; @@ -36,6 +37,7 @@ @IfBuildProperty(name = PERSISTENCE_TYPE_PROPERTY, stringValue = POSTGRESQL_STORAGE) public class PostgreSqlStorageService implements StorageService { + private ProcessDefinitionEntityStorage definitionStorage; private ProcessInstanceEntityStorage processStorage; private JobEntityStorage jobStorage; private UserTaskInstanceEntityStorage taskStorage; @@ -45,9 +47,11 @@ protected PostgreSqlStorageService() { } @Inject - public PostgreSqlStorageService(final ProcessInstanceEntityStorage processStorage, + public PostgreSqlStorageService(final ProcessDefinitionEntityStorage definitionStorage, + final ProcessInstanceEntityStorage processStorage, final JobEntityStorage jobStorage, final UserTaskInstanceEntityStorage taskStorage) { + this.definitionStorage = definitionStorage; this.processStorage = processStorage; this.jobStorage = jobStorage; this.taskStorage = taskStorage; @@ -63,6 +67,9 @@ public Storage getCache(String name, Class type) { if (type == ProcessInstance.class) { return (Storage) processStorage; } + if (type == ProcessDefinition.class) { + return (Storage) definitionStorage; + } if (type == Job.class) { return (Storage) jobStorage; } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionEntityStorage.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionEntityStorage.java new file mode 100644 index 0000000000..2e5eef7588 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionEntityStorage.java @@ -0,0 +1,79 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.storage; + +import java.util.Optional; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.persistence.EntityManager; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.postgresql.mapper.ProcessDefinitionEntityMapper; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntity; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntityId; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntityRepository; + +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; + +@ApplicationScoped +public class ProcessDefinitionEntityStorage extends AbstractStorage { + + public ProcessDefinitionEntityStorage() { + } + + @Inject + public ProcessDefinitionEntityStorage(ProcessDefinitionEntityRepository repository, ProcessDefinitionEntityMapper mapper) { + super(new RepositoryAdapter(repository), ProcessDefinition.class, ProcessDefinitionEntity.class, mapper::mapToModel, mapper::mapToEntity, e -> new ProcessDefinitionEntityId(e.getId(), + e.getVersion()).getKey()); + } + + @Override + public boolean containsKey(String key) { + ProcessDefinitionEntityId id = new ProcessDefinitionEntityId(key); + return getRepository().count("id = ?1 and version = ?2", id.getId(), id.getVersion()) == 1; + } + + public static class RepositoryAdapter implements PanacheRepositoryBase { + + ProcessDefinitionEntityRepository repository; + + public RepositoryAdapter(ProcessDefinitionEntityRepository repository) { + this.repository = repository; + } + + @Override + public boolean deleteById(String key) { + return repository.deleteById(new ProcessDefinitionEntityId(key)); + } + + @Override + public Optional findByIdOptional(String key) { + return repository.findByIdOptional(new ProcessDefinitionEntityId(key)); + } + + @Override + public void persist(ProcessDefinitionEntity entity) { + repository.persist(entity); + } + + @Override + public EntityManager getEntityManager() { + return repository.getEntityManager(); + } + } +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessInstanceEntityStorage.java index 090d68464f..5b6313f03d 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/ProcessInstanceEntityStorage.java @@ -21,6 +21,7 @@ import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.postgresql.mapper.ProcessInstanceEntityMapper; +import org.kie.kogito.index.postgresql.model.AbstractEntity; import org.kie.kogito.index.postgresql.model.ProcessInstanceEntity; import org.kie.kogito.index.postgresql.model.ProcessInstanceEntityRepository; @@ -32,6 +33,6 @@ public ProcessInstanceEntityStorage() { @Inject public ProcessInstanceEntityStorage(ProcessInstanceEntityRepository repository, ProcessInstanceEntityMapper mapper) { - super(repository, ProcessInstance.class, ProcessInstanceEntity.class, e -> mapper.mapToModel(e), m -> mapper.mapToEntity(m)); + super(repository, ProcessInstance.class, ProcessInstanceEntity.class, mapper::mapToModel, mapper::mapToEntity, AbstractEntity::getId); } } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/UserTaskInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/UserTaskInstanceEntityStorage.java index 62dc7e993e..cc1ba8aebf 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/UserTaskInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/storage/UserTaskInstanceEntityStorage.java @@ -21,6 +21,7 @@ import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.postgresql.mapper.UserTaskInstanceEntityMapper; +import org.kie.kogito.index.postgresql.model.AbstractEntity; import org.kie.kogito.index.postgresql.model.UserTaskInstanceEntity; import org.kie.kogito.index.postgresql.model.UserTaskInstanceEntityRepository; @@ -32,6 +33,6 @@ public UserTaskInstanceEntityStorage() { @Inject public UserTaskInstanceEntityStorage(UserTaskInstanceEntityRepository repository, UserTaskInstanceEntityMapper mapper) { - super(repository, UserTaskInstance.class, UserTaskInstanceEntity.class, e -> mapper.mapToModel(e), m -> mapper.mapToEntity(m)); + super(repository, UserTaskInstance.class, UserTaskInstanceEntity.class, mapper::mapToModel, mapper::mapToEntity, AbstractEntity::getId); } } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql new file mode 100644 index 0000000000..759df2227c --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/db/migration/V1.43.0__data_index_definitions.sql @@ -0,0 +1,41 @@ +create table definitions +( + id varchar(255) not null, + version varchar(255) not null, + name varchar(255), + type varchar(255), + endpoint varchar(255), + primary key (id, version) +); + +create table definitions_addons +( + process_id varchar(255) not null, + process_version varchar(255) not null, + addon varchar(255) not null, + primary key (process_id, process_version, addon) +); + +create table definitions_roles +( + process_id varchar(255) not null, + process_version varchar(255) not null, + role varchar(255) not null, + primary key (process_id, process_version, role) +); + +alter table if exists definitions_addons + add constraint fk_definitions_addons_definitions + foreign key (process_id, process_version) + references definitions + on +delete +cascade; + +alter table if exists definitions_roles + add constraint fk_definitions_roles_definitions + foreign key (process_id, process_version) + references definitions + on +delete +cascade; diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapperIT.java b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapperIT.java new file mode 100644 index 0000000000..37bdc834da --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/mapper/ProcessDefinitionEntityMapperIT.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.mapper; + +import java.util.Set; + +import javax.inject.Inject; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntity; + +import io.quarkus.test.junit.QuarkusTest; + +import static java.util.Collections.singleton; +import static org.assertj.core.api.Assertions.assertThat; + +@QuarkusTest +class ProcessDefinitionEntityMapperIT { + + ProcessDefinition pd = new ProcessDefinition(); + ProcessDefinitionEntity entity = new ProcessDefinitionEntity(); + + @Inject + ProcessDefinitionEntityMapper mapper; + + @BeforeEach + void setup() { + String version = "1.0"; + String processId = "testProcessId"; + Set roles = singleton("testRoles"); + String type = "testType"; + Set addons = singleton("testAddons"); + + pd.setId(processId); + pd.setVersion(version); + pd.setRoles(roles); + pd.setAddons(addons); + pd.setType(type); + + entity.setId(processId); + entity.setVersion(version); + entity.setRoles(roles); + entity.setAddons(addons); + entity.setType(type); + } + + @Test + void testMapToEntity() { + ProcessDefinitionEntity result = mapper.mapToEntity(pd); + assertThat(result).usingRecursiveComparison().ignoringFieldsMatchingRegexes(".*\\$\\$_hibernate_tracker").isEqualTo(entity); + } + + @Test + void testMapToModel() { + ProcessDefinition result = mapper.mapToModel(entity); + assertThat(result).usingRecursiveComparison().isEqualTo(pd); + } + +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/query/ProcessDefinitionEntityQueryIT.java b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/query/ProcessDefinitionEntityQueryIT.java new file mode 100644 index 0000000000..a7fd475db0 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/query/ProcessDefinitionEntityQueryIT.java @@ -0,0 +1,46 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.query; + +import javax.inject.Inject; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.postgresql.storage.ProcessDefinitionEntityStorage; +import org.kie.kogito.index.test.query.AbstractProcessDefinitionQueryIT; +import org.kie.kogito.persistence.api.Storage; +import org.kie.kogito.testcontainers.quarkus.PostgreSqlQuarkusTestResource; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +@QuarkusTestResource(PostgreSqlQuarkusTestResource.class) +class ProcessDefinitionEntityQueryIT extends AbstractProcessDefinitionQueryIT { + + @Inject + ProcessDefinitionEntityStorage storage; + + @Override + public Storage getStorage() { + return storage; + } + + @Override + protected Boolean isDateTimeAsLong() { + return false; + } +} diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/schema/DDLSchemaExporter.java b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/schema/DDLSchemaExporter.java index 485218875f..4f0d95a712 100644 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/schema/DDLSchemaExporter.java +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/schema/DDLSchemaExporter.java @@ -32,6 +32,7 @@ import org.kie.kogito.index.postgresql.model.JobEntity; import org.kie.kogito.index.postgresql.model.MilestoneEntity; import org.kie.kogito.index.postgresql.model.NodeInstanceEntity; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntity; import org.kie.kogito.index.postgresql.model.ProcessInstanceEntity; import org.kie.kogito.index.postgresql.model.ProcessInstanceErrorEntity; import org.kie.kogito.index.postgresql.model.UserTaskInstanceEntity; @@ -53,6 +54,7 @@ public static void main(String[] args) { StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(settings).build(); MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(ProcessDefinitionEntity.class); metadataSources.addAnnotatedClass(JobEntity.class); metadataSources.addAnnotatedClass(MilestoneEntity.class); metadataSources.addAnnotatedClass(NodeInstanceEntity.class); diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionStorageIT.java b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionStorageIT.java new file mode 100644 index 0000000000..a928c69ae5 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/test/java/org/kie/kogito/index/postgresql/storage/ProcessDefinitionStorageIT.java @@ -0,0 +1,69 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kie.kogito.index.postgresql.storage; + +import java.util.Set; + +import javax.inject.Inject; +import javax.transaction.Transactional; + +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntity; +import org.kie.kogito.index.postgresql.model.ProcessDefinitionEntityRepository; +import org.kie.kogito.index.test.TestUtils; +import org.kie.kogito.persistence.api.StorageService; +import org.kie.kogito.testcontainers.quarkus.PostgreSqlQuarkusTestResource; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +@QuarkusTestResource(PostgreSqlQuarkusTestResource.class) +class ProcessDefinitionStorageIT extends AbstractStorageIT { + + @Inject + ProcessDefinitionEntityRepository repository; + + @Inject + StorageService storage; + + public ProcessDefinitionStorageIT() { + super(ProcessDefinition.class); + } + + @Override + public ProcessDefinitionEntityStorage.RepositoryAdapter getRepository() { + return new ProcessDefinitionEntityStorage.RepositoryAdapter(repository); + } + + @Override + public StorageService getStorage() { + return storage; + } + + @Test + @Transactional + void testProcessInstanceEntity() { + String processId = "travels"; + String version = "1.0"; + ProcessDefinition pdv1 = TestUtils.createProcessDefinition(processId, version, Set.of("admin", "kogito")); + ProcessDefinition pdv2 = TestUtils.createProcessDefinition(processId, version, Set.of("kogito")); + testStorage(pdv1.getKey(), pdv1, pdv2); + } + +} diff --git a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto index f8b0199f1f..bfa5114034 100644 --- a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto +++ b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto @@ -38,6 +38,24 @@ message ProcessInstanceMeta { optional string businessKey = 13; } +/* @Indexed */ +message ProcessDefinition { + /* @Field(store = Store.YES) */ + optional string id = 1; + /* @Field(store = Store.YES) @SortableField */ + optional string version = 2; + /* @Field(store = Store.YES) @SortableField */ + optional string name = 3; + /* @Field(store = Store.YES) */ + repeated string roles = 4; + /* @Field(store = Store.YES) */ + repeated string addons = 5; + /* @Field(store = Store.YES) @SortableField */ + optional string type = 6; + /* @Field(store = Store.YES) */ + optional string endpoint = 7; +} + /* @Indexed */ message ProcessInstance { /* @Field(store = Store.YES) */ diff --git a/data-index/data-index-test-utils/src/main/java/org/kie/kogito/index/test/TestUtils.java b/data-index/data-index-test-utils/src/main/java/org/kie/kogito/index/test/TestUtils.java index 7a4733ea32..53accf842e 100644 --- a/data-index/data-index-test-utils/src/main/java/org/kie/kogito/index/test/TestUtils.java +++ b/data-index/data-index-test-utils/src/main/java/org/kie/kogito/index/test/TestUtils.java @@ -102,6 +102,7 @@ public static ProcessInstanceDataEvent getProcessCloudEvent(String processId, St .parentInstanceId(parentProcessInstanceId) .rootInstanceId(rootProcessInstanceId) .processId(processId) + .version("1.0") .rootProcessId(rootProcessId) .processName(RandomStringUtils.randomAlphabetic(10)) .startDate(new Date()) diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/AbstractKogitoAddonsQuarkusDataIndexProcessor.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/AbstractKogitoAddonsQuarkusDataIndexProcessor.java index f30611e909..0b64eb50e0 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/AbstractKogitoAddonsQuarkusDataIndexProcessor.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/AbstractKogitoAddonsQuarkusDataIndexProcessor.java @@ -19,6 +19,7 @@ import org.jboss.jandex.DotName; import org.jboss.jandex.Type; import org.kie.kogito.index.addon.vertx.VertxGraphiQLSetup; +import org.kie.kogito.index.model.ProcessDefinition; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.quarkus.addons.common.deployment.KogitoCapability; @@ -49,6 +50,7 @@ public void nativeResources(BuildProducer resource BuildProducer reflectiveHierarchyClass) { resource.produce(new NativeImageResourceBuildItem("basic.schema.graphqls")); resource.produce(new NativeImageResourceBuildItem("io/vertx/ext/web/handler/graphiql/index.html")); + reflectiveHierarchy(ProcessDefinition.class, reflectiveHierarchyClass); reflectiveHierarchy(ProcessInstance.class, reflectiveHierarchyClass); reflectiveHierarchy(UserTaskInstance.class, reflectiveHierarchyClass); } diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java index 4508553b7a..182b021053 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java @@ -98,8 +98,8 @@ public CompletableFuture getProcessInstanceDiagram(String serviceURL, Pr } @Override - public CompletableFuture getProcessInstanceSourceFileContent(String serviceURL, ProcessInstance processInstance) { - return CompletableFuture.supplyAsync(() -> sourceFilesProvider.getProcessSourceFile(processInstance.getProcessId()) + public CompletableFuture getProcessDefinitionSourceFileContent(String serviceURL, String processId) { + return CompletableFuture.supplyAsync(() -> sourceFilesProvider.getProcessSourceFile(processId) .map(sourceFile -> { try { return sourceFile.readContents(); @@ -108,12 +108,12 @@ public CompletableFuture getProcessInstanceSourceFileContent(String serv } }) .map(String::new) - .orElseThrow(() -> new DataIndexServiceException("Source file not found for the specified process ID: " + processInstance.getProcessId())), managedExecutor); + .orElseThrow(() -> new DataIndexServiceException("Source file not found for the specified process ID: " + processId)), managedExecutor); } @Override - public CompletableFuture> getProcessInstanceNodeDefinitions(String serviceURL, ProcessInstance processInstance) { - Process process = processes != null ? processes.processById(processInstance.getProcessId()) : null; + public CompletableFuture> getProcessDefinitionNodes(String serviceURL, String processId) { + Process process = processes != null ? processes.processById(processId) : null; if (process == null) { return CompletableFuture.completedFuture(null); } else { diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java index e5146a109b..101ddf0bb5 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java @@ -35,18 +35,25 @@ public GraphQLSchema createSchema() { RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring() .type("Query", builder -> { + builder.dataFetcher("ProcessDefinitions", this::getProcessDefinitionsValues); builder.dataFetcher("ProcessInstances", this::getProcessInstancesValues); builder.dataFetcher("UserTaskInstances", this::getUserTaskInstancesValues); builder.dataFetcher("Jobs", this::getJobsValues); return builder; }) + .type("ProcessDefinition", builder -> { + builder.dataFetcher("source", this::getProcessDefinitionSourceFileContent); + builder.dataFetcher("nodes", this::getProcessDefinitionNodes); + builder.dataFetcher("serviceUrl", this::getProcessDefinitionServiceUrl); + return builder; + }) .type("ProcessInstance", builder -> { builder.dataFetcher("parentProcessInstance", this::getParentProcessInstanceValue); builder.dataFetcher("childProcessInstances", this::getChildProcessInstancesValues); builder.dataFetcher("serviceUrl", this::getProcessInstanceServiceUrl); builder.dataFetcher("diagram", this::getProcessInstanceDiagram); builder.dataFetcher("source", this::getProcessInstanceSourceFileContent); - builder.dataFetcher("nodeDefinitions", this::getProcessNodes); + builder.dataFetcher("nodeDefinitions", this::getProcessInstanceNodes); return builder; }) .type("ProcessInstanceState", builder -> { diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java index fcef753f74..a484aca386 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java @@ -35,6 +35,11 @@ class InfinispanQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -58,6 +63,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(notNullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(2)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("hello")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("hello")); } @Test diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java index e438eb4843..3c12c7b882 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InfinispanQuarkusAddonDataIndexIT.java @@ -36,6 +36,11 @@ class InfinispanQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/runtime/src/main/resources/META-INF/hotrod-client.properties b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/runtime/src/main/resources/META-INF/hotrod-client.properties index e7b113add2..ed23c02c1a 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/runtime/src/main/resources/META-INF/hotrod-client.properties +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-infinispan/runtime/src/main/resources/META-INF/hotrod-client.properties @@ -28,6 +28,22 @@ infinispan.client.hotrod.cache.jobs.configuration=\ \ +infinispan.client.hotrod.cache.processdefinitions.configuration=\ + \ + \ + \ + \ + \ + org.kie.kogito.index.model.ProcessDefinition \ + \ + \ + \ + \ + \ + \ + \ + + infinispan.client.hotrod.cache.processinstances.configuration=\ \ \ diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java index 6e737994ef..41b2051d41 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java @@ -35,6 +35,11 @@ class InMemoryQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -58,6 +63,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(notNullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(2)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("hello")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("hello")); } @Test diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java index 76e962a79b..9966c02c64 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-inmemory/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/InMemoryQuarkusAddonDataIndexIT.java @@ -36,6 +36,11 @@ class InMemoryQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -60,6 +65,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(nullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(12)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("greet")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("Greeting workflow")); } @Test diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/MongoDataIndexProcessor.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/MongoDataIndexProcessor.java index 2a4d268825..b0616cae30 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/MongoDataIndexProcessor.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/deployment/src/main/java/org/kie/kogito/addons/quarkus/data/index/deployment/MongoDataIndexProcessor.java @@ -16,6 +16,7 @@ package org.kie.kogito.addons.quarkus.data.index.deployment; +import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntity; import org.kie.kogito.index.mongodb.model.ProcessInstanceEntity; import org.kie.kogito.index.mongodb.model.UserTaskInstanceEntity; @@ -36,6 +37,7 @@ public FeatureBuildItem feature() { @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) public void mongoNativeResources(BuildProducer reflectiveHierarchyClass) { + reflectiveHierarchy(ProcessDefinitionEntity.class, reflectiveHierarchyClass); reflectiveHierarchy(ProcessInstanceEntity.class, reflectiveHierarchyClass); reflectiveHierarchy(UserTaskInstanceEntity.class, reflectiveHierarchyClass); } diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java index ad93365b56..46ee42edd3 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java @@ -35,6 +35,11 @@ class MongoQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -58,6 +63,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(notNullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(2)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("hello")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("hello")); } @Test diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java index 2b30191cda..79281d1338 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-mongodb/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/MongoQuarkusAddonDataIndexIT.java @@ -36,6 +36,11 @@ class MongoQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -60,6 +65,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(nullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(12)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("greet")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("Greeting workflow")); } @Test diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java index 1ff945d238..80629054e1 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-process/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java @@ -36,6 +36,11 @@ class PostgreSQLQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -60,6 +65,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(notNullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(2)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("hello")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("hello")); } @Test diff --git a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java index 6a6a24aebd..e64402747a 100644 --- a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java +++ b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-postgresql/integration-tests-sw/src/test/java/org/kie/kogito/addons/quarkus/data/index/it/PostgreSQLQuarkusAddonDataIndexIT.java @@ -37,6 +37,11 @@ class PostgreSQLQuarkusAddonDataIndexIT { @Test void testDataIndexAddon() { + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(0)); + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessInstances{ id } }\" }") .when().post("/graphql") .then().statusCode(200) @@ -62,6 +67,14 @@ void testDataIndexAddon() { .body("data.ProcessInstances[0].diagram", is(nullValue())) .body("data.ProcessInstances[0].source", is(notNullValue())) .body("data.ProcessInstances[0].nodeDefinitions.size()", is(12)); + + given().contentType(ContentType.JSON).body("{ \"query\" : \"{ProcessDefinitions{ id, version, name } }\" }") + .when().post("/graphql") + .then().statusCode(200) + .body("data.ProcessDefinitions.size()", is(1)) + .body("data.ProcessDefinitions[0].id", is("greet")) + .body("data.ProcessDefinitions[0].version", is("1.0")) + .body("data.ProcessDefinitions[0].name", is("Greeting workflow")); } @Test