From 389bfe64166609312fa7999003a82ee7b6c0c03d Mon Sep 17 00:00:00 2001 From: Francisco Javier Tirado Sarti Date: Fri, 9 Feb 2024 13:08:50 +0100 Subject: [PATCH] [Fix_1983] Handling null version Rather than composing string for postgres, we pass composite key from businnes layer --- .../kogito/index/service/IndexingService.java | 7 +- .../graphql/AbstractGraphQLSchemaManager.java | 9 ++- .../kogito/index/model/ProcessDefinition.java | 15 ---- .../index/model/ProcessDefinitionKey.java} | 59 +++++---------- .../storage/DataIndexStorageService.java | 3 +- .../kie/kogito/index/test/QueryTestBase.java | 4 +- .../AbstractProcessDefinitionQueryIT.java | 35 +++++---- .../storage/ModelDataIndexStorageService.java | 5 +- .../ModelProcessDefinitionStorage.java | 73 +++++++++++++++++++ .../storage/ModelProcessInstanceStorage.java | 20 ++++- .../index/storage/ModelStorageFetcher.java | 39 ++++++++-- .../storage/ModelUserTaskInstanceStorage.java | 20 ++++- .../ModelDataIndexStorageServiceTest.java | 36 +++++++++ .../jpa/model/ProcessDefinitionEntity.java | 4 +- .../ProcessDefinitionEntityRepository.java | 4 +- .../storage/AbstractJPAStorageFetcher.java | 10 +-- .../index/jpa/storage/AbstractStorage.java | 18 ++--- .../storage/JPADataIndexStorageService.java | 22 +++--- .../index/jpa/storage/JPAStorageService.java | 73 ------------------- .../index/jpa/storage/JobEntityStorage.java | 2 +- .../ProcessDefinitionEntityStorage.java | 27 ++++--- .../storage/ProcessInstanceEntityStorage.java | 2 +- .../UserTaskInstanceEntityStorage.java | 2 +- ...bstractProcessDefinitionEntityQueryIT.java | 3 +- .../jpa/storage/AbstractJobStorageIT.java | 18 +---- .../AbstractProcessDefinitionStorageIT.java | 20 ++--- .../index/jpa/storage/AbstractStorageIT.java | 13 +--- .../jdbc/JdbcStorageServiceProducer.java | 49 ------------- .../model/ProcessDefinitionEntityMapper.java | 2 +- .../query/ProcessDefinitionQueryIT.java | 10 ++- .../storage/ProcessDefinitionStorageIT.java | 12 +-- .../PostgreSqlStorageServiceProducer.java | 50 ------------- .../addon/ProcessDefinitionRegister.java | 3 +- 33 files changed, 313 insertions(+), 356 deletions(-) rename data-index/data-index-storage/{data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityId.java => data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinitionKey.java} (52%) create mode 100644 data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessDefinitionStorage.java create mode 100644 data-index/data-index-storage/data-index-storage-common/src/test/java/org/kie/kogito/index/storage/ModelDataIndexStorageServiceTest.java delete mode 100644 data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPAStorageService.java delete mode 100644 data-index/data-index-storage/data-index-storage-jpa/src/main/java/org/kie/kogito/index/jdbc/JdbcStorageServiceProducer.java delete mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/PostgreSqlStorageServiceProducer.java 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 4e9c733f3e..2802fe8f94 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 @@ -41,7 +41,7 @@ import org.kie.kogito.event.usertask.UserTaskInstanceStateDataEvent; import org.kie.kogito.event.usertask.UserTaskInstanceVariableDataEvent; import org.kie.kogito.index.model.Job; -import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.storage.DataIndexStorageService; import org.kie.kogito.index.storage.ProcessInstanceStorage; import org.kie.kogito.index.storage.UserTaskInstanceStorage; @@ -92,9 +92,8 @@ public void indexProcessInstanceEvent(ProcessInstanceDataEvent event) { //retry in case of rare but possible race condition during the insert for the first registry @Retry(maxRetries = 3, delay = 300, jitter = 100, retryOn = ConcurrentModificationException.class) public void indexProcessDefinition(ProcessDefinitionDataEvent definitionDataEvent) { - ProcessDefinition definition = ProcessDefinitionHelper - .merge(manager.getProcessDefinitionStorage().get(ProcessDefinition.toKey(definitionDataEvent.getKogitoProcessId(), definitionDataEvent.getData().getVersion())), definitionDataEvent); - manager.getProcessDefinitionStorage().put(definition.getKey(), definition); + ProcessDefinitionKey key = new ProcessDefinitionKey(definitionDataEvent.getKogitoProcessId(), definitionDataEvent.getData().getVersion()); + manager.getProcessDefinitionStorage().put(key, ProcessDefinitionHelper.merge(manager.getProcessDefinitionStorage().get(key), definitionDataEvent)); } //retry in case of rare but possible race condition during the insert for the first registry 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 bcb759c63e..6dd81262b1 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 @@ -34,6 +34,7 @@ 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.ProcessDefinitionKey; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.index.service.DataIndexServiceException; @@ -137,7 +138,7 @@ public String getProcessInstanceServiceUrl(DataFetchingEnvironment env) { public ProcessDefinition getProcessDefinition(DataFetchingEnvironment env) { ProcessInstance source = env.getSource(); - return cacheService.getProcessDefinitionStorage().get(ProcessDefinition.toKey(source.getProcessId(), source.getVersion())); + return cacheService.getProcessDefinitionStorage().get(new ProcessDefinitionKey(source.getProcessId(), source.getVersion())); } protected String getServiceUrl(String endpoint, String processId) { @@ -188,7 +189,7 @@ protected Collection getProcessInstancesValues(DataFetchingEnvi return executeAdvancedQueryForCache(cacheService.getProcessInstanceStorage(), env); } - protected List executeAdvancedQueryForCache(StorageFetcher cache, DataFetchingEnvironment env) { + protected List executeAdvancedQueryForCache(StorageFetcher cache, DataFetchingEnvironment env) { Objects.requireNonNull(cache, "Cache not found"); String inputTypeName = ((GraphQLNamedType) env.getFieldDefinition().getArgument("where").getType()).getName(); @@ -231,7 +232,7 @@ public CompletableFuture getProcessInstanceDiagram(DataFetchingEnvironme public CompletableFuture getProcessInstanceSource(DataFetchingEnvironment env) { ProcessInstance pi = env.getSource(); - ProcessDefinition pd = cacheService.getProcessDefinitionStorage().get(ProcessDefinition.toKey(pi.getProcessId(), pi.getVersion())); + ProcessDefinition pd = cacheService.getProcessDefinitionStorage().get(new ProcessDefinitionKey(pi.getProcessId(), pi.getVersion())); if (pd == null) { return dataIndexApiExecutor.getProcessDefinitionSourceFileContent(getServiceUrl(pi.getEndpoint(), pi.getProcessId()), pi.getProcessId()); } else { @@ -241,7 +242,7 @@ public CompletableFuture getProcessInstanceSource(DataFetchingEnvironmen public CompletableFuture> getProcessInstanceNodes(DataFetchingEnvironment env) { ProcessInstance pi = env.getSource(); - ProcessDefinition pd = cacheService.getProcessDefinitionStorage().get(ProcessDefinition.toKey(pi.getProcessId(), pi.getVersion())); + ProcessDefinition pd = cacheService.getProcessDefinitionStorage().get(new ProcessDefinitionKey(pi.getProcessId(), pi.getVersion())); if (pd == null) { return dataIndexApiExecutor.getProcessDefinitionNodes(getServiceUrl(pi.getEndpoint(), pi.getProcessId()), pi.getProcessId()); } else { 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 index 200d4347f8..e6e2450ea0 100644 --- 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 @@ -21,9 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; -import java.util.regex.Pattern; public class ProcessDefinition { @@ -112,18 +110,6 @@ public void setNodes(List nodes) { this.nodes = nodes; } - public String getKey() { - return toKey(id, version); - } - - public static String toKey(String processId, String version) { - return processId + "$v:" + version; - } - - public static String[] fromKey(String key) { - return Optional.ofNullable(key).map(k -> k.split(Pattern.quote("$v:"))).orElse(new String[0]); - } - public String getDescription() { return description; } @@ -176,5 +162,4 @@ public String toString() { ", nodes='" + nodes + '\'' + '}'; } - } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityId.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinitionKey.java similarity index 52% rename from data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityId.java rename to data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinitionKey.java index 28f61990f5..a850f9efd8 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityId.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinitionKey.java @@ -16,74 +16,53 @@ * specific language governing permissions and limitations * under the License. */ -package org.kie.kogito.index.jpa.model; +package org.kie.kogito.index.model; -import java.io.Serializable; import java.util.Objects; -import static org.kie.kogito.index.model.ProcessDefinition.fromKey; -import static org.kie.kogito.index.model.ProcessDefinition.toKey; - -public class ProcessDefinitionEntityId implements Serializable { +public class ProcessDefinitionKey { private String id; - private String version; - public ProcessDefinitionEntityId() { - } - - public ProcessDefinitionEntityId(String key) { - String[] fromKey = fromKey(key); - this.id = fromKey[0]; - this.version = fromKey[1]; - } - - public ProcessDefinitionEntityId(String id, String version) { + public ProcessDefinitionKey(String id, String version) { this.id = id; this.version = version; } - public String getKey() { - return toKey(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 int hashCode() { + return Objects.hash(id, version); } @Override - public boolean equals(Object o) { - if (this == o) + public boolean equals(Object obj) { + if (this == obj) { return true; - if (o == null || getClass() != o.getClass()) + } + if (!(obj instanceof ProcessDefinitionKey)) { return false; - ProcessDefinitionEntityId that = (ProcessDefinitionEntityId) o; - return Objects.equals(id, that.id) && Objects.equals(version, that.version); + } + ProcessDefinitionKey other = (ProcessDefinitionKey) obj; + return Objects.equals(id, other.id) && Objects.equals(version, other.version); } @Override - public int hashCode() { - return Objects.hash(id, version); + public String toString() { + return "ProcessDefinitionKey [id=" + id + ", version=" + version + "]"; } - @Override - public String toString() { - return "ProcessDefinitionEntityId{" + - "id='" + id + '\'' + - ", version='" + version + '\'' + - '}'; + @SuppressWarnings("unused") + private ProcessDefinitionKey() { + // needed by external tools } + } 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 5e8995d08c..43c951fd83 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 @@ -20,13 +20,14 @@ import org.kie.kogito.index.model.Job; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.persistence.api.Storage; import com.fasterxml.jackson.databind.node.ObjectNode; public interface DataIndexStorageService { - Storage getProcessDefinitionStorage(); + Storage getProcessDefinitionStorage(); ProcessInstanceStorage getProcessInstanceStorage(); diff --git a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/QueryTestBase.java b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/QueryTestBase.java index c2a654df8e..5e25817c65 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/QueryTestBase.java +++ b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/QueryTestBase.java @@ -34,8 +34,8 @@ protected Boolean isDateTimeAsLong() { return true; } - public void queryAndAssert(BiConsumer, String[]> assertConsumer, StorageFetcher storage, List> filters, List sort, Integer offset, Integer limit, - String... ids) { + public void queryAndAssert(BiConsumer, K[]> assertConsumer, StorageFetcher storage, List> filters, List sort, Integer offset, Integer limit, + K... ids) { assertConsumer.accept(storage.query().filter(filters).sort(sort).offset(offset).limit(limit).execute(), ids); } 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 index dc0bd2de9a..a6e61fc01f 100644 --- 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 @@ -22,8 +22,10 @@ import java.util.Set; import java.util.function.BiConsumer; +import org.assertj.core.groups.Tuple; import org.junit.jupiter.api.Test; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.test.QueryTestBase; import org.kie.kogito.index.test.TestUtils; import org.kie.kogito.persistence.api.Storage; @@ -41,34 +43,37 @@ 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 { +public abstract class AbstractProcessDefinitionQueryIT extends QueryTestBase { - public abstract Storage getStorage(); + public abstract Storage getStorage(); @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); + Storage storage = getStorage(); + ProcessDefinitionKey pdv1Key = new ProcessDefinitionKey(pdv1.getId(), pdv1.getVersion()); + storage.put(pdv1Key, pdv1); ProcessDefinition pdv2 = TestUtils.createProcessDefinition(processId, "2.0", Set.of("kogito")); - storage.put(pdv2.getKey(), pdv2); + ProcessDefinitionKey pdv2Key = new ProcessDefinitionKey(pdv2.getId(), pdv2.getVersion()); + storage.put(pdv2Key, 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, singletonList(isNull("type")), null, null, null, pdv1Key, pdv2Key); + queryAndAssert(assertWithKey(), storage, singletonList(notNull("version")), null, null, null, pdv1Key, pdv2Key); + queryAndAssert(assertWithKey(), storage, singletonList(equalTo("version", pdv1.getVersion())), null, null, null, pdv1Key); + queryAndAssert(assertWithKey(), storage, singletonList(contains("roles", "admin")), null, null, null, pdv1Key); + queryAndAssert(assertWithKey(), storage, singletonList(containsAny("roles", asList("admin", "kogito"))), null, null, null, pdv1Key, pdv2Key); + queryAndAssert(assertWithKey(), storage, singletonList(containsAll("roles", asList("admin", "kogito"))), null, null, null, pdv1Key); 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()); + singletonList(orderBy("version", SortDirection.ASC)), 1, 1, pdv2Key); queryAndAssert(assertWithKey(), storage, null, singletonList(orderBy("version", SortDirection.DESC)), null, - null, pdv2.getKey(), pdv1.getKey()); + null, pdv2Key, pdv1Key); } - public static BiConsumer, String[]> assertWithKey() { - return (instances, ids) -> assertThat(instances).hasSize(ids == null ? 0 : ids.length).extracting("key").containsExactly(ids); + public static BiConsumer, ProcessDefinitionKey[]> assertWithKey() { + return (instances, ids) -> assertThat(instances).hasSize(ids == null ? 0 : ids.length).extracting("id", "version").map(Tuple::toArray) + .map(objs -> new ProcessDefinitionKey((String) objs[0], (String) objs[1])).containsExactly(ids); } } diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelDataIndexStorageService.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelDataIndexStorageService.java index 007ecb51c0..693928d991 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelDataIndexStorageService.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelDataIndexStorageService.java @@ -20,6 +20,7 @@ import org.kie.kogito.index.model.Job; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.UserTaskInstance; import org.kie.kogito.persistence.api.Storage; @@ -43,8 +44,8 @@ public class ModelDataIndexStorageService implements DataIndexStorageService { StorageService storageService; @Override - public Storage getProcessDefinitionStorage() { - return storageService.getCache(PROCESS_DEFINITIONS_STORAGE, ProcessDefinition.class); + public Storage getProcessDefinitionStorage() { + return new ModelProcessDefinitionStorage(storageService.getCache(PROCESS_DEFINITIONS_STORAGE, ProcessDefinition.class)); } @Override diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessDefinitionStorage.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessDefinitionStorage.java new file mode 100644 index 0000000000..5462c4df08 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessDefinitionStorage.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.storage; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; +import org.kie.kogito.persistence.api.Storage; + +public class ModelProcessDefinitionStorage extends ModelStorageFetcher implements Storage { + + private static final String VERSION_SEPARATOR = "$v:"; + + static ProcessDefinitionKey fromString(String key) { + int indexOf = key.indexOf(VERSION_SEPARATOR); + return indexOf == -1 ? new ProcessDefinitionKey(key, null) + : new ProcessDefinitionKey(key.substring(0, indexOf), key.substring(indexOf + VERSION_SEPARATOR.length())); + } + + static String toString(ProcessDefinitionKey key) { + String id = key.getId(); + String version = key.getVersion(); + return version == null ? id : id + VERSION_SEPARATOR + version; + } + + public ModelProcessDefinitionStorage(Storage storage) { + super(storage, ModelProcessDefinitionStorage::toString, ModelProcessDefinitionStorage::fromString); + } + + @Override + public ProcessDefinition put(ProcessDefinitionKey key, ProcessDefinition value) { + return storage.put(toString(key), value); + } + + @Override + public ProcessDefinition remove(ProcessDefinitionKey key) { + return storage.remove(toString(key)); + } + + @Override + public boolean containsKey(ProcessDefinitionKey key) { + return storage.containsKey(toString(key)); + } + + @Override + public Map entries() { + return storage.entries().entrySet().stream().collect(Collectors.toMap(e -> fromString(e.getKey()), Entry::getValue)); + } + + @Override + public String getRootType() { + return ProcessDefinition.class.getName(); + } +} diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessInstanceStorage.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessInstanceStorage.java index 52c8b56892..9f21497fc2 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessInstanceStorage.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelProcessInstanceStorage.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.storage; import org.kie.kogito.event.process.ProcessInstanceDataEvent; @@ -15,7 +33,7 @@ import org.kie.kogito.index.storage.merger.ProcessInstanceVariableDataEventMerger; import org.kie.kogito.persistence.api.Storage; -public class ModelProcessInstanceStorage extends ModelStorageFetcher implements ProcessInstanceStorage { +public class ModelProcessInstanceStorage extends ModelStorageFetcher implements ProcessInstanceStorage { private final ProcessInstanceErrorDataEventMerger errorMerger = new ProcessInstanceErrorDataEventMerger(); private final ProcessInstanceNodeDataEventMerger nodeMerger = new ProcessInstanceNodeDataEventMerger(); private final ProcessInstanceSLADataEventMerger slaMerger = new ProcessInstanceSLADataEventMerger(); diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelStorageFetcher.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelStorageFetcher.java index cbadc33c59..8ea6b833d4 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelStorageFetcher.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelStorageFetcher.java @@ -1,17 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.storage; +import java.util.function.Function; + import org.kie.kogito.persistence.api.Storage; import org.kie.kogito.persistence.api.StorageFetcher; import org.kie.kogito.persistence.api.query.Query; import io.smallrye.mutiny.Multi; -public abstract class ModelStorageFetcher implements StorageFetcher { +public abstract class ModelStorageFetcher implements StorageFetcher { protected final Storage storage; + private final Function toString; + private final Function fromString; + public ModelStorageFetcher(Storage storage) { + this(storage, Object::toString, s -> (K) s); + } + + public ModelStorageFetcher(Storage storage, Function toString, Function fromString) { this.storage = storage; + this.toString = toString; + this.fromString = fromString; } @Override @@ -25,8 +54,8 @@ public Multi objectUpdatedListener() { } @Override - public Multi objectRemovedListener() { - return storage.objectRemovedListener(); + public Multi objectRemovedListener() { + return storage.objectRemovedListener().map(fromString); } @Override @@ -35,8 +64,8 @@ public Query query() { } @Override - public V get(String key) { - return storage.get(key); + public V get(K key) { + return storage.get(toString.apply(key)); } @Override diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelUserTaskInstanceStorage.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelUserTaskInstanceStorage.java index d5a46917a7..20f98a396c 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelUserTaskInstanceStorage.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/ModelUserTaskInstanceStorage.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.storage; import java.util.ArrayList; @@ -19,7 +37,7 @@ import org.kie.kogito.index.storage.merger.UserTaskInstanceVariableDataEventMerger; import org.kie.kogito.persistence.api.Storage; -public class ModelUserTaskInstanceStorage extends ModelStorageFetcher implements UserTaskInstanceStorage { +public class ModelUserTaskInstanceStorage extends ModelStorageFetcher implements UserTaskInstanceStorage { private final UserTaskInstanceAssignmentDataEventMerger assignmentMerger = new UserTaskInstanceAssignmentDataEventMerger(); private final UserTaskInstanceAttachmentDataEventMerger attachmentMerger = new UserTaskInstanceAttachmentDataEventMerger(); diff --git a/data-index/data-index-storage/data-index-storage-common/src/test/java/org/kie/kogito/index/storage/ModelDataIndexStorageServiceTest.java b/data-index/data-index-storage/data-index-storage-common/src/test/java/org/kie/kogito/index/storage/ModelDataIndexStorageServiceTest.java new file mode 100644 index 0000000000..64ab4b0d74 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-common/src/test/java/org/kie/kogito/index/storage/ModelDataIndexStorageServiceTest.java @@ -0,0 +1,36 @@ +package org.kie.kogito.index.storage; + +import java.util.HashSet; +import java.util.Set; + +import org.junit.jupiter.api.Test; +import org.kie.kogito.index.model.ProcessDefinitionKey; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ModelDataIndexStorageServiceTest { + + @Test + void testIdAndVersion() { + assertKeyConversion(new ProcessDefinitionKey("Javierito", "1_0")); + } + + @Test + void testIdEmptyVersion() { + assertKeyConversion(new ProcessDefinitionKey("Javierito", "")); + } + + @Test + void testIdNullVersion() { + assertKeyConversion(new ProcessDefinitionKey("Javierito", null)); + } + + private void assertKeyConversion(ProcessDefinitionKey key) { + Set set = new HashSet<>(); + set.add(key); + ProcessDefinitionKey deserializedKey = ModelProcessDefinitionStorage.fromString(ModelProcessDefinitionStorage.toString(key)); + set.add(deserializedKey); + assertThat(deserializedKey).isEqualTo(key); + assertThat(set).hasSize(1); + } +} diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java index 5ffdec6e26..dd2db761a6 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java @@ -23,6 +23,8 @@ import java.util.Objects; import java.util.Set; +import org.kie.kogito.index.model.ProcessDefinitionKey; + import jakarta.persistence.CascadeType; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; @@ -38,7 +40,7 @@ @Entity(name = "definitions") @Table(name = "definitions") -@IdClass(ProcessDefinitionEntityId.class) +@IdClass(ProcessDefinitionKey.class) public class ProcessDefinitionEntity extends AbstractEntity { @Id diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityRepository.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityRepository.java index a17d92a5fd..c055cba6b5 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityRepository.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntityRepository.java @@ -18,11 +18,13 @@ */ package org.kie.kogito.index.jpa.model; +import org.kie.kogito.index.model.ProcessDefinitionKey; + import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped -public class ProcessDefinitionEntityRepository implements PanacheRepositoryBase { +public class ProcessDefinitionEntityRepository implements PanacheRepositoryBase { } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractJPAStorageFetcher.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractJPAStorageFetcher.java index a87c7f8eb1..c8ab20c38f 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractJPAStorageFetcher.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractJPAStorageFetcher.java @@ -29,18 +29,18 @@ import jakarta.transaction.Transactional; -public class AbstractJPAStorageFetcher implements StorageFetcher { +public class AbstractJPAStorageFetcher implements StorageFetcher { private static final String LISTENER_NOT_AVAILABLE_IN_JPA = "Listener not available in JPA database"; - protected PanacheRepositoryBase repository; + protected PanacheRepositoryBase repository; protected Class entityClass; protected Function mapToModel; protected AbstractJPAStorageFetcher() { } - protected AbstractJPAStorageFetcher(PanacheRepositoryBase repository, Class entityClass, Function mapToModel) { + protected AbstractJPAStorageFetcher(PanacheRepositoryBase repository, Class entityClass, Function mapToModel) { this.repository = repository; this.entityClass = entityClass; this.mapToModel = mapToModel; @@ -57,7 +57,7 @@ public Multi objectUpdatedListener() { } @Override - public Multi objectRemovedListener() { + public Multi objectRemovedListener() { throw new UnsupportedOperationException(LISTENER_NOT_AVAILABLE_IN_JPA); } @@ -68,7 +68,7 @@ public Query query() { @Override @Transactional - public V get(String key) { + public V get(K key) { return repository.findByIdOptional(key).map(mapToModel).orElse(null); } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractStorage.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractStorage.java index abae372ebe..4d339888e3 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractStorage.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/AbstractStorage.java @@ -33,18 +33,18 @@ import static java.util.stream.Collectors.toMap; -public abstract class AbstractStorage extends AbstractJPAStorageFetcher implements Storage { +public abstract class AbstractStorage extends AbstractJPAStorageFetcher implements Storage { private Class modelClass; private Function mapToEntity; - private Function mapEntityToKey; + private Function mapEntityToKey; protected AbstractStorage() { } - protected AbstractStorage(PanacheRepositoryBase repository, Class modelClass, Class entityClass, Function mapToModel, - Function mapToEntity, Function mapEntityToKey) { + protected AbstractStorage(PanacheRepositoryBase repository, Class modelClass, Class entityClass, Function mapToModel, + Function mapToEntity, Function mapEntityToKey) { super(repository, entityClass, mapToModel); this.modelClass = modelClass; this.mapToEntity = mapToEntity; @@ -53,7 +53,7 @@ protected AbstractStorage(PanacheRepositoryBase repository, Class @Override @Transactional - public V put(String key, V value) { + public V put(K key, V value) { //Pessimistic lock is used to lock the row to handle concurrency with an exiting registry E persistedEntity = repository.findById(key, LockModeType.PESSIMISTIC_WRITE); E newEntity = mapToEntity.apply(value); @@ -72,7 +72,7 @@ public V put(String key, V value) { @Override @Transactional - public V remove(String key) { + public V remove(K key) { V value = get(key); if (value != null) { repository.deleteById(key); @@ -82,12 +82,12 @@ public V remove(String key) { @Transactional @Override - public boolean containsKey(String key) { + public boolean containsKey(K key) { return repository.count("id = ?1", key) == 1; } @Override - public Map entries() { + public Map entries() { return repository.streamAll().collect(toMap(mapEntityToKey, mapToModel)); } @@ -102,7 +102,7 @@ public String getRootType() { return modelClass.getCanonicalName(); } - protected PanacheRepositoryBase getRepository() { + protected PanacheRepositoryBase getRepository() { return repository; } } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPADataIndexStorageService.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPADataIndexStorageService.java index 9a726a3a6e..99bbccf0c3 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPADataIndexStorageService.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPADataIndexStorageService.java @@ -20,26 +20,25 @@ import org.kie.kogito.index.model.Job; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.storage.DataIndexStorageService; import org.kie.kogito.index.storage.ProcessInstanceStorage; import org.kie.kogito.index.storage.UserTaskInstanceStorage; import org.kie.kogito.persistence.api.Storage; -import org.kie.kogito.persistence.api.StorageService; import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -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; - @ApplicationScoped public class JPADataIndexStorageService implements DataIndexStorageService { @Inject - StorageService storageService; + ProcessDefinitionEntityStorage definitionStorage; + + @Inject + JobEntityStorage jobsStorage; @Inject ProcessInstanceStorage processInstanceStorage; @@ -48,8 +47,8 @@ public class JPADataIndexStorageService implements DataIndexStorageService { UserTaskInstanceStorage userTaskInstanceStorage; @Override - public Storage getProcessDefinitionStorage() { - return storageService.getCache(PROCESS_DEFINITIONS_STORAGE, ProcessDefinition.class); + public Storage getProcessDefinitionStorage() { + return definitionStorage; } @Override @@ -64,13 +63,12 @@ public UserTaskInstanceStorage getUserTaskInstanceStorage() { @Override public Storage getJobsStorage() { - return storageService.getCache(JOBS_STORAGE, Job.class); + return jobsStorage; } @Override public Storage getDomainModelCache(String processId) { - String rootType = getProcessIdModelCache().get(processId); - return rootType == null ? null : storageService.getCache(getDomainModelCacheName(processId), ObjectNode.class, rootType); + throw new UnsupportedOperationException("Generic custom type cache not available in JPA"); } @Override @@ -80,6 +78,6 @@ public String getDomainModelCacheName(String processId) { @Override public Storage getProcessIdModelCache() { - return storageService.getCache(PROCESS_ID_MODEL_STORAGE); + throw new UnsupportedOperationException("Generic String cache not available in JPA"); } } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPAStorageService.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPAStorageService.java deleted file mode 100644 index 89446436fa..0000000000 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPAStorageService.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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.jpa.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; -import org.kie.kogito.persistence.api.StorageService; - -import static java.lang.String.format; - -public class JPAStorageService implements StorageService { - - private ProcessDefinitionEntityStorage definitionStorage; - private ProcessInstanceEntityStorage processStorage; - private JobEntityStorage jobStorage; - private UserTaskInstanceEntityStorage taskStorage; - - public JPAStorageService(final ProcessDefinitionEntityStorage definitionStorage, - final ProcessInstanceEntityStorage processStorage, - final JobEntityStorage jobStorage, - final UserTaskInstanceEntityStorage taskStorage) { - this.definitionStorage = definitionStorage; - this.processStorage = processStorage; - this.jobStorage = jobStorage; - this.taskStorage = taskStorage; - } - - @Override - public Storage getCache(String name) { - throw new UnsupportedOperationException("Generic String cache not available in PostgresSQL"); - } - - @Override - 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; - } - if (type == UserTaskInstance.class) { - return (Storage) taskStorage; - } - throw new UnsupportedOperationException(format("Unknown class type: %s, cache not available", type.getCanonicalName())); - } - - @Override - public Storage getCache(String name, Class type, String rootType) { - throw new UnsupportedOperationException("Generic custom type cache not available in PostgresSQL"); - } -} diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JobEntityStorage.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JobEntityStorage.java index 697ed00c33..f5b9c270dd 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JobEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JobEntityStorage.java @@ -28,7 +28,7 @@ import jakarta.inject.Inject; @ApplicationScoped -public class JobEntityStorage extends AbstractStorage { +public class JobEntityStorage extends AbstractStorage { protected JobEntityStorage() { } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessDefinitionEntityStorage.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessDefinitionEntityStorage.java index 1bbe7d546c..db641e4de5 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessDefinitionEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessDefinitionEntityStorage.java @@ -22,9 +22,9 @@ import org.kie.kogito.index.jpa.mapper.ProcessDefinitionEntityMapper; import org.kie.kogito.index.jpa.model.ProcessDefinitionEntity; -import org.kie.kogito.index.jpa.model.ProcessDefinitionEntityId; import org.kie.kogito.index.jpa.model.ProcessDefinitionEntityRepository; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; @@ -35,25 +35,24 @@ import jakarta.transaction.Transactional; @ApplicationScoped -public class ProcessDefinitionEntityStorage extends AbstractStorage { +public class ProcessDefinitionEntityStorage extends AbstractStorage { protected 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()); + super(new RepositoryAdapter(repository), ProcessDefinition.class, ProcessDefinitionEntity.class, mapper::mapToModel, mapper::mapToEntity, e -> new ProcessDefinitionKey(e.getId(), + e.getVersion())); } @Transactional @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 boolean containsKey(ProcessDefinitionKey key) { + return getRepository().count("id = ?1 and version = ?2", key.getId(), key.getVersion()) == 1; } - public static class RepositoryAdapter implements PanacheRepositoryBase { + public static class RepositoryAdapter implements PanacheRepositoryBase { ProcessDefinitionEntityRepository repository; @@ -62,18 +61,18 @@ public RepositoryAdapter(ProcessDefinitionEntityRepository repository) { } @Override - public boolean deleteById(String key) { - return repository.deleteById(new ProcessDefinitionEntityId(key)); + public boolean deleteById(ProcessDefinitionKey key) { + return repository.deleteById(key); } @Override - public Optional findByIdOptional(String key) { - return repository.findByIdOptional(new ProcessDefinitionEntityId(key)); + public Optional findByIdOptional(ProcessDefinitionKey key) { + return repository.findByIdOptional(key); } @Override - public ProcessDefinitionEntity findById(String s, LockModeType lockModeType) { - return repository.findById(new ProcessDefinitionEntityId(s), lockModeType); + public ProcessDefinitionEntity findById(ProcessDefinitionKey s, LockModeType lockModeType) { + return repository.findById(s, lockModeType); } @Override diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java index f86570fbd4..ffd900462b 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java @@ -55,7 +55,7 @@ import static org.kie.kogito.index.DateTimeUtils.toZonedDateTime; @ApplicationScoped -public class ProcessInstanceEntityStorage extends AbstractJPAStorageFetcher implements ProcessInstanceStorage { +public class ProcessInstanceEntityStorage extends AbstractJPAStorageFetcher implements ProcessInstanceStorage { protected ProcessInstanceEntityStorage() { } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java index 4d5cc47003..1e2c127a36 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java @@ -56,7 +56,7 @@ import static org.kie.kogito.index.DateTimeUtils.toZonedDateTime; @ApplicationScoped -public class UserTaskInstanceEntityStorage extends AbstractJPAStorageFetcher implements UserTaskInstanceStorage { +public class UserTaskInstanceEntityStorage extends AbstractJPAStorageFetcher implements UserTaskInstanceStorage { protected UserTaskInstanceEntityStorage() { } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/query/AbstractProcessDefinitionEntityQueryIT.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/query/AbstractProcessDefinitionEntityQueryIT.java index 0eab6d2d8f..1c9a84d667 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/query/AbstractProcessDefinitionEntityQueryIT.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/query/AbstractProcessDefinitionEntityQueryIT.java @@ -20,6 +20,7 @@ import org.kie.kogito.index.jpa.storage.ProcessDefinitionEntityStorage; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.test.query.AbstractProcessDefinitionQueryIT; import org.kie.kogito.persistence.api.Storage; @@ -31,7 +32,7 @@ public abstract class AbstractProcessDefinitionEntityQueryIT extends AbstractPro ProcessDefinitionEntityStorage storage; @Override - public Storage getStorage() { + public Storage getStorage() { return storage; } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractJobStorageIT.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractJobStorageIT.java index 75ea7aeb08..2510619cc4 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractJobStorageIT.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractJobStorageIT.java @@ -23,32 +23,23 @@ import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.Test; import org.kie.kogito.index.jpa.model.JobEntity; -import org.kie.kogito.index.jpa.model.JobEntityRepository; import org.kie.kogito.index.model.Job; import org.kie.kogito.index.test.TestUtils; -import org.kie.kogito.persistence.api.StorageService; +import org.kie.kogito.persistence.api.Storage; import jakarta.inject.Inject; -public abstract class AbstractJobStorageIT extends AbstractStorageIT { +public abstract class AbstractJobStorageIT extends AbstractStorageIT { @Inject - JobEntityRepository repository; - - @Inject - StorageService storage; + JobEntityStorage storage; public AbstractJobStorageIT() { super(Job.class); } @Override - public JobEntityRepository getRepository() { - return repository; - } - - @Override - public StorageService getStorage() { + public Storage getStorage() { return storage; } @@ -65,5 +56,4 @@ public void testJobEntity() { RandomStringUtils.randomAlphabetic(10), "SCHEDULED", 1000L); testStorage(jobId, job1, job2); } - } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessDefinitionStorageIT.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessDefinitionStorageIT.java index 5cbd6db8cc..bba2ee7e7c 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessDefinitionStorageIT.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessDefinitionStorageIT.java @@ -23,32 +23,24 @@ import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.Test; import org.kie.kogito.index.jpa.model.ProcessDefinitionEntity; -import org.kie.kogito.index.jpa.model.ProcessDefinitionEntityRepository; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.test.TestUtils; -import org.kie.kogito.persistence.api.StorageService; +import org.kie.kogito.persistence.api.Storage; import jakarta.inject.Inject; -public abstract class AbstractProcessDefinitionStorageIT extends AbstractStorageIT { +public abstract class AbstractProcessDefinitionStorageIT extends AbstractStorageIT { @Inject - ProcessDefinitionEntityRepository repository; - - @Inject - StorageService storage; + ProcessDefinitionEntityStorage storage; public AbstractProcessDefinitionStorageIT() { super(ProcessDefinition.class); } @Override - public ProcessDefinitionEntityStorage.RepositoryAdapter getRepository() { - return new ProcessDefinitionEntityStorage.RepositoryAdapter(repository); - } - - @Override - public StorageService getStorage() { + public Storage getStorage() { return storage; } @@ -58,7 +50,7 @@ void testProcessDefinitionEntity() { 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); + testStorage(new ProcessDefinitionKey(pdv1.getId(), pdv1.getVersion()), pdv1, pdv2); } } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractStorageIT.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractStorageIT.java index b8d11a0392..165ce328dd 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractStorageIT.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractStorageIT.java @@ -20,13 +20,10 @@ import org.kie.kogito.index.jpa.model.AbstractEntity; import org.kie.kogito.persistence.api.Storage; -import org.kie.kogito.persistence.api.StorageService; - -import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; import static org.assertj.core.api.Assertions.assertThat; -public abstract class AbstractStorageIT { +public abstract class AbstractStorageIT { Class type; @@ -34,12 +31,10 @@ public AbstractStorageIT(Class type) { this.type = type; } - abstract StorageService getStorage(); - - abstract PanacheRepositoryBase getRepository(); + abstract Storage getStorage(); - void testStorage(String key, T value1, T value2) { - Storage cache = getStorage().getCache("cache", type); + void testStorage(K key, T value1, T value2) { + Storage cache = getStorage(); assertThat(cache.get(key)).isNull(); assertThat(cache.containsKey(key)).isFalse(); diff --git a/data-index/data-index-storage/data-index-storage-jpa/src/main/java/org/kie/kogito/index/jdbc/JdbcStorageServiceProducer.java b/data-index/data-index-storage/data-index-storage-jpa/src/main/java/org/kie/kogito/index/jdbc/JdbcStorageServiceProducer.java deleted file mode 100644 index a5de13fbcf..0000000000 --- a/data-index/data-index-storage/data-index-storage-jpa/src/main/java/org/kie/kogito/index/jdbc/JdbcStorageServiceProducer.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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.jdbc; - -import org.kie.kogito.index.jpa.storage.JPAStorageService; -import org.kie.kogito.index.jpa.storage.JobEntityStorage; -import org.kie.kogito.index.jpa.storage.ProcessDefinitionEntityStorage; -import org.kie.kogito.index.jpa.storage.ProcessInstanceEntityStorage; -import org.kie.kogito.index.jpa.storage.UserTaskInstanceEntityStorage; -import org.kie.kogito.persistence.api.StorageService; - -import io.quarkus.arc.properties.IfBuildProperty; - -import jakarta.annotation.Priority; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Alternative; -import jakarta.enterprise.inject.Produces; - -import static org.kie.kogito.persistence.api.factory.Constants.PERSISTENCE_TYPE_PROPERTY; - -public class JdbcStorageServiceProducer { - @Produces - @Alternative - @Priority(1) - @ApplicationScoped - @IfBuildProperty(name = PERSISTENCE_TYPE_PROPERTY, stringValue = "jdbc") - StorageService PostgreSqlStorageService(final ProcessDefinitionEntityStorage definitionStorage, - final ProcessInstanceEntityStorage processStorage, - final JobEntityStorage jobStorage, - final UserTaskInstanceEntityStorage taskStorage) { - return new JPAStorageService(definitionStorage, processStorage, jobStorage, taskStorage); - } -} 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 index 6dfc5573db..ea91176fbd 100644 --- 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 @@ -40,7 +40,7 @@ public ProcessDefinitionEntity mapToEntity(String key, ProcessDefinition pd) { } ProcessDefinitionEntity entity = new ProcessDefinitionEntity(); - entity.setKey(pd.getKey()); + entity.setKey(key); entity.setId(pd.getId()); entity.setVersion(pd.getVersion()); entity.setName(pd.getName()); 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 index b2d18d3928..1f126d801d 100644 --- 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 @@ -20,8 +20,10 @@ import org.junit.jupiter.api.BeforeEach; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntity; import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntityMapper; +import org.kie.kogito.index.storage.ModelProcessDefinitionStorage; import org.kie.kogito.index.test.query.AbstractProcessDefinitionQueryIT; import org.kie.kogito.persistence.api.Storage; import org.kie.kogito.persistence.mongodb.client.MongoClientManager; @@ -42,16 +44,16 @@ class ProcessDefinitionQueryIT extends AbstractProcessDefinitionQueryIT { @Inject MongoClientManager mongoClientManager; - Storage storage; + Storage storage; @BeforeEach void setUp() { - this.storage = new MongoStorage<>(mongoClientManager.getCollection(PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntity.class), - ProcessDefinition.class.getName(), new ProcessDefinitionEntityMapper()); + this.storage = new ModelProcessDefinitionStorage(new MongoStorage<>(mongoClientManager.getCollection(PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntity.class), + ProcessDefinition.class.getName(), new ProcessDefinitionEntityMapper())); } @Override - public Storage getStorage() { + 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/ProcessDefinitionStorageIT.java b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/storage/ProcessDefinitionStorageIT.java index ec88ef525f..4aec97a2c5 100644 --- 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 @@ -25,8 +25,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntity; import org.kie.kogito.index.mongodb.model.ProcessDefinitionEntityMapper; +import org.kie.kogito.index.storage.ModelProcessDefinitionStorage; import org.kie.kogito.index.test.TestUtils; import org.kie.kogito.persistence.api.Storage; import org.kie.kogito.persistence.mongodb.client.MongoClientManager; @@ -42,17 +44,17 @@ @QuarkusTest @QuarkusTestResource(MongoDBQuarkusTestResource.class) -class ProcessDefinitionStorageIT extends StorageTestBase { +class ProcessDefinitionStorageIT extends StorageTestBase { @Inject MongoClientManager mongoClientManager; - Storage storage; + Storage storage; @BeforeEach void setUp() { - this.storage = new MongoStorage<>(mongoClientManager.getCollection(PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntity.class), - ProcessDefinition.class.getName(), new ProcessDefinitionEntityMapper()); + this.storage = new ModelProcessDefinitionStorage(new MongoStorage<>(mongoClientManager.getCollection(PROCESS_DEFINITIONS_STORAGE, ProcessDefinitionEntity.class), + ProcessDefinition.class.getName(), new ProcessDefinitionEntityMapper())); } @AfterEach @@ -66,6 +68,6 @@ void testCache() { 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); + testStorage(storage, new ProcessDefinitionKey(processId, version), pdv1, pdv2); } } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/PostgreSqlStorageServiceProducer.java b/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/PostgreSqlStorageServiceProducer.java deleted file mode 100644 index 4e495f1071..0000000000 --- a/data-index/data-index-storage/data-index-storage-postgresql/src/main/java/org/kie/kogito/index/postgresql/PostgreSqlStorageServiceProducer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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; - -import org.kie.kogito.index.jpa.storage.JPAStorageService; -import org.kie.kogito.index.jpa.storage.JobEntityStorage; -import org.kie.kogito.index.jpa.storage.ProcessDefinitionEntityStorage; -import org.kie.kogito.index.jpa.storage.ProcessInstanceEntityStorage; -import org.kie.kogito.index.jpa.storage.UserTaskInstanceEntityStorage; -import org.kie.kogito.persistence.api.StorageService; - -import io.quarkus.arc.properties.IfBuildProperty; - -import jakarta.annotation.Priority; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Alternative; -import jakarta.enterprise.inject.Produces; - -import static org.kie.kogito.persistence.api.factory.Constants.PERSISTENCE_TYPE_PROPERTY; -import static org.kie.kogito.persistence.postgresql.Constants.POSTGRESQL_STORAGE; - -public class PostgreSqlStorageServiceProducer { - @Produces - @Alternative - @Priority(1) - @ApplicationScoped - @IfBuildProperty(name = PERSISTENCE_TYPE_PROPERTY, stringValue = POSTGRESQL_STORAGE) - StorageService PostgreSqlStorageService(final ProcessDefinitionEntityStorage definitionStorage, - final ProcessInstanceEntityStorage processStorage, - final JobEntityStorage jobStorage, - final UserTaskInstanceEntityStorage taskStorage) { - return new JPAStorageService(definitionStorage, processStorage, jobStorage, taskStorage); - } -} diff --git a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/ProcessDefinitionRegister.java b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/ProcessDefinitionRegister.java index d3f34c8c23..b291feb5dc 100644 --- a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/ProcessDefinitionRegister.java +++ b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/ProcessDefinitionRegister.java @@ -26,6 +26,7 @@ import org.kie.kogito.Application; import org.kie.kogito.index.api.KogitoRuntimeClient; import org.kie.kogito.index.model.ProcessDefinition; +import org.kie.kogito.index.model.ProcessDefinitionKey; import org.kie.kogito.index.service.DataIndexServiceException; import org.kie.kogito.index.storage.DataIndexStorageService; import org.kie.kogito.process.Process; @@ -57,7 +58,7 @@ void startup(@Observes StartupEvent event, Instance processesInstance .map(mapProcessDefinition(app.config().addons().availableAddons(), kogitoServiceUrl.orElse(null), client)) .forEach(process -> { LOGGER.debug("Registering process definition with id: {}", process.getId()); - storage.getProcessDefinitionStorage().put(process.getKey(), process); + storage.getProcessDefinitionStorage().put(new ProcessDefinitionKey(process.getId(), process.getVersion()), process); }); } else { LOGGER.info("No process definitions to register.");