diff --git a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/pom.xml b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/pom.xml
index 7d7849257..62201b56d 100644
--- a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/pom.xml
+++ b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/pom.xml
@@ -19,8 +19,11 @@
org.eclipse.digitaltwin.basyx
basyx.aasdiscoveryservice-backend
-
-
+
+
+ org.eclipse.digitaltwin.basyx
+ basyx.backend.inmemory.core
+
org.eclipse.digitaltwin.basyx
basyx.aasdiscoveryservice-core
diff --git a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryBackendProvider.java b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryBackendProvider.java
index 46971ba9c..21720e822 100644
--- a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryBackendProvider.java
+++ b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryBackendProvider.java
@@ -27,6 +27,7 @@
import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.backend.AasDiscoveryBackendProvider;
import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.backend.AasDiscoveryDocument;
+import org.eclipse.digitaltwin.basyx.common.backend.inmemory.core.InMemoryCrudRepository;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
@@ -41,7 +42,7 @@
@Component
public class AasDiscoveryInMemoryBackendProvider implements AasDiscoveryBackendProvider {
- private AasDiscoveryInMemoryCrudRepository repository = new AasDiscoveryInMemoryCrudRepository();
+ private CrudRepository repository = new InMemoryCrudRepository(AasDiscoveryDocument::getShellIdentifier);
@Override
public CrudRepository getCrudRepository() {
diff --git a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryCrudRepository.java b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryCrudRepository.java
deleted file mode 100644
index 7fdf732c7..000000000
--- a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/backend/inmemory/AasDiscoveryInMemoryCrudRepository.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2024 the Eclipse BaSyx Authors
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- ******************************************************************************/
-
-package org.eclipse.digitaltwin.basyx.aasdiscoveryservice.backend.inmemory;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.StreamSupport;
-
-import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId;
-import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.backend.AasDiscoveryDocument;
-import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.core.model.AssetLink;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.lang.NonNull;
-
-/**
- * In-memory implementation of the {@link CrudRepository} for the AAS Discovery
- *
- * @author zielstor, fried, mateusmolina
- */
-public class AasDiscoveryInMemoryCrudRepository implements CrudRepository {
-
- private final ConcurrentMap> assetLinks = new ConcurrentHashMap<>();
- private final ConcurrentMap> assetIds = new ConcurrentHashMap<>();
-
- @Override
- public synchronized @NonNull S save(@NonNull S entity) {
- String shellId = entity.getShellIdentifier();
-
- this.assetLinks.put(shellId, entity.getAssetLinks());
- this.assetIds.put(shellId, entity.getSpecificAssetIds());
-
- return entity;
- }
-
- @Override
- public @NonNull Iterable saveAll(@NonNull Iterable entities) {
- entities.forEach(this::save);
- return entities;
- }
-
- @Override
- public @NonNull Optional findById(@NonNull String id) {
- return Optional.ofNullable(buildAasDiscoveryDocument(id));
- }
-
- @Override
- public boolean existsById(@NonNull String id) {
- return this.assetLinks.containsKey(id);
- }
-
- @Override
- public @NonNull Iterable findAll() {
- return assetLinks.keySet().stream().map(this::buildAasDiscoveryDocument).toList();
- }
-
- @Override
- public @NonNull Iterable findAllById(@NonNull Iterable ids) {
- return StreamSupport.stream(ids.spliterator(), false).map(this::buildAasDiscoveryDocument).toList();
- }
-
- @Override
- public long count() {
- return this.assetLinks.size();
- }
-
- @Override
- public synchronized void deleteById(@NonNull String id) {
- this.assetLinks.remove(id);
- this.assetIds.remove(id);
- }
-
- @Override
- public void delete(@NonNull AasDiscoveryDocument entity) {
- this.deleteById(entity.getShellIdentifier());
- }
-
- @Override
- public void deleteAllById(@NonNull Iterable extends String> ids) {
- for (String id : ids) {
- this.deleteById(id);
- }
- }
-
- @Override
- public void deleteAll(@NonNull Iterable extends AasDiscoveryDocument> entities) {
- for (AasDiscoveryDocument entity : entities) {
- this.deleteById(entity.getShellIdentifier());
- }
- }
-
- @Override
- public synchronized void deleteAll() {
- this.assetLinks.clear();
- this.assetIds.clear();
- }
-
- private synchronized AasDiscoveryDocument buildAasDiscoveryDocument(String shellId) {
- Set assetLinksSet = assetLinks.get(shellId);
- List assetIdsList = assetIds.get(shellId);
-
- if (assetIdsList == null)
- assetIdsList = new ArrayList<>();
-
- if (assetLinksSet == null)
- assetLinksSet = new HashSet<>();
-
- return new AasDiscoveryDocument(shellId, assetLinksSet, assetIdsList);
- }
-
-}
diff --git a/basyx.aasrepository/basyx.aasrepository-backend-inmemory/pom.xml b/basyx.aasrepository/basyx.aasrepository-backend-inmemory/pom.xml
index 3f6b3a9b8..45c8dc476 100644
--- a/basyx.aasrepository/basyx.aasrepository-backend-inmemory/pom.xml
+++ b/basyx.aasrepository/basyx.aasrepository-backend-inmemory/pom.xml
@@ -22,6 +22,10 @@
org.eclipse.digitaltwin.basyx
basyx.aasrepository-backend
+
+ org.eclipse.digitaltwin.basyx
+ basyx.backend.inmemory.core
+
org.eclipse.digitaltwin.basyx
basyx.aasrepository-core
diff --git a/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackend.java b/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackend.java
deleted file mode 100644
index aeb02fd99..000000000
--- a/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackend.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2023 the Eclipse BaSyx Authors
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- ******************************************************************************/
-
-package org.eclipse.digitaltwin.basyx.aasrepository.backend.inmemory;
-
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.lang.NonNull;
-
-/**
- * InMemory implementation for the AAS backend
- *
- * @author mateusmolina
- *
- */
-public class AasInMemoryBackend implements CrudRepository {
-
- private final ConcurrentMap inMemoryStore = new ConcurrentHashMap<>();
-
- @Override
- public @NonNull S save(@NonNull S entity) {
- inMemoryStore.put(entity.getId(), entity);
-
- return entity;
- }
-
- @Override
- public @NonNull Iterable saveAll(@NonNull Iterable entities) {
- entities.forEach(this::save);
-
- return entities;
- }
-
- @Override
- public @NonNull Optional findById(@NonNull String id) {
- return Optional.ofNullable(inMemoryStore.get(id));
- }
-
- @Override
- public boolean existsById(@NonNull String id) {
- return inMemoryStore.containsKey(id);
- }
-
- @Override
- public @NonNull Iterable findAll() {
- return inMemoryStore.values();
- }
-
- @Override
- public @NonNull Iterable findAllById(@NonNull Iterable ids) {
- return StreamSupport.stream(ids.spliterator(), false).map(inMemoryStore::get).filter(Objects::nonNull).collect(Collectors.toList());
- }
-
- @Override
- public long count() {
- return inMemoryStore.size();
- }
-
- @Override
- public void deleteById(@NonNull String id) {
- inMemoryStore.remove(id);
- }
-
- @Override
- public void delete(@NonNull AssetAdministrationShell entity) {
- inMemoryStore.remove(entity.getId());
- }
-
- @Override
- public void deleteAllById(@NonNull Iterable extends String> ids) {
- for (String id : ids)
- inMemoryStore.remove(id);
- }
-
- @Override
- public void deleteAll(@NonNull Iterable extends AssetAdministrationShell> entities) {
- for (AssetAdministrationShell entity : entities)
- inMemoryStore.remove(entity.getId());
- }
-
- @Override
- public void deleteAll() {
- inMemoryStore.clear();
- }
-
-
-}
-
diff --git a/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackendProvider.java b/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackendProvider.java
index 0a8a4e788..44860711d 100644
--- a/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackendProvider.java
+++ b/basyx.aasrepository/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/backend/inmemory/AasInMemoryBackendProvider.java
@@ -27,6 +27,7 @@
import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell;
import org.eclipse.digitaltwin.basyx.aasrepository.backend.AasBackendProvider;
+import org.eclipse.digitaltwin.basyx.common.backend.inmemory.core.InMemoryCrudRepository;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
@@ -35,7 +36,7 @@
*
* InMemory backend provider for the AAS
*
- * @author mateusmolina
+ * @author mateusmolina, danish
*/
@ConditionalOnExpression("'${basyx.backend}'.equals('InMemory')")
@Component
@@ -43,7 +44,7 @@ public class AasInMemoryBackendProvider implements AasBackendProvider {
@Override
public CrudRepository getCrudRepository() {
- return new AasInMemoryBackend();
+ return new InMemoryCrudRepository(AssetAdministrationShell::getId);
}
}
diff --git a/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/pom.xml b/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/pom.xml
index 79e8704d8..f601be551 100644
--- a/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/pom.xml
+++ b/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/pom.xml
@@ -17,6 +17,10 @@
org.eclipse.digitaltwin.basyx
basyx.aasxfileserver-core
+
+ org.eclipse.digitaltwin.basyx
+ basyx.backend.inmemory.core
+
org.eclipse.digitaltwin.basyx
basyx.aasxfileserver-core
diff --git a/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryBackendProvider.java b/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryBackendProvider.java
index 68a050e98..b80b64198 100644
--- a/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryBackendProvider.java
+++ b/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryBackendProvider.java
@@ -27,6 +27,7 @@
import org.eclipse.digitaltwin.basyx.aasxfileserver.backend.AASXFileServerBackendProvider;
import org.eclipse.digitaltwin.basyx.aasxfileserver.model.Package;
+import org.eclipse.digitaltwin.basyx.common.backend.inmemory.core.InMemoryCrudRepository;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
@@ -36,7 +37,7 @@
@Component
public class AASXFileServerInMemoryBackendProvider implements AASXFileServerBackendProvider {
- private AASXFileServerInMemoryCrudRepository repository = new AASXFileServerInMemoryCrudRepository();
+ private CrudRepository repository = new InMemoryCrudRepository(Package::getPackageId);
@Override
public CrudRepository getCrudRepository() {
diff --git a/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryCrudRepository.java b/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryCrudRepository.java
deleted file mode 100644
index f1c61802a..000000000
--- a/basyx.aasxfileserver/basyx.aasxfileserver-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/AASXFileServerInMemoryCrudRepository.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
-* Copyright (C) 2024 the Eclipse BaSyx Authors
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-* SPDX-License-Identifier: MIT
-******************************************************************************/
-
-package org.eclipse.digitaltwin.basyx.aasxfileserver;
-
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-import org.eclipse.digitaltwin.basyx.aasxfileserver.model.Package;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.lang.NonNull;
-
-public class AASXFileServerInMemoryCrudRepository implements CrudRepository {
-
- private final ConcurrentMap packageMap = new ConcurrentHashMap<>();
-
- @Override
- public @NonNull S save(@NonNull S entity) {
- packageMap.put(entity.getPackageId(), entity);
-
- return entity;
- }
-
- @Override
- public @NonNull Iterable saveAll(@NonNull Iterable entities) {
- entities.forEach(this::save);
-
- return entities;
- }
-
- @Override
- public @NonNull Optional findById(@NonNull String id) {
- return Optional.ofNullable(packageMap.get(id));
- }
-
- @Override
- public boolean existsById(@NonNull String id) {
- return packageMap.containsKey(id);
- }
-
- @Override
- public @NonNull Iterable findAll() {
- return packageMap.values();
- }
-
- @Override
- public @NonNull Iterable findAllById(@NonNull Iterable ids) {
- List idList = StreamSupport.stream(ids.spliterator(), false).collect(Collectors.toList());
- return packageMap.entrySet().stream().filter(entry -> idList.contains(entry.getKey())).map(Entry::getValue).collect(Collectors.toList());
- }
-
- @Override
- public long count() {
- return packageMap.size();
- }
-
- @Override
- public void deleteById(@NonNull String id) {
- packageMap.remove(id);
- }
-
- @Override
- public void delete(@NonNull Package entity) {
- packageMap.remove(entity.getPackageId());
- }
-
- @Override
- public void deleteAllById(@NonNull Iterable extends String> ids) {
- List idList = StreamSupport.stream(ids.spliterator(), false).collect(Collectors.toList());
- packageMap.keySet().removeAll(idList);
- }
-
- @Override
- public void deleteAll(@NonNull Iterable extends Package> entities) {
- List idList = StreamSupport.stream(entities.spliterator(), false).map(Package::getPackageId).collect(Collectors.toList());
- packageMap.keySet().removeAll(idList);
- }
-
- @Override
- public void deleteAll() {
- packageMap.clear();
- }
-}
diff --git a/basyx.aasxfileserver/basyx.aasxfileserver-backend/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/backend/CrudAASXFileServer.java b/basyx.aasxfileserver/basyx.aasxfileserver-backend/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/backend/CrudAASXFileServer.java
index 599a28c7b..ce5211c52 100644
--- a/basyx.aasxfileserver/basyx.aasxfileserver-backend/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/backend/CrudAASXFileServer.java
+++ b/basyx.aasxfileserver/basyx.aasxfileserver-backend/src/main/java/org/eclipse/digitaltwin/basyx/aasxfileserver/backend/CrudAASXFileServer.java
@@ -25,7 +25,6 @@
package org.eclipse.digitaltwin.basyx.aasxfileserver.backend;
import java.io.InputStream;
-import java.util.Collection;
import java.util.List;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicInteger;
@@ -33,7 +32,6 @@
import java.util.stream.StreamSupport;
import org.eclipse.digitaltwin.aas4j.v3.model.PackageDescription;
-import org.eclipse.digitaltwin.aas4j.v3.model.Submodel;
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultPackageDescription;
import org.eclipse.digitaltwin.basyx.aasxfileserver.AASXFileServer;
import org.eclipse.digitaltwin.basyx.aasxfileserver.model.Package;
diff --git a/basyx.common/basyx.backend.inmemory.core/pom.xml b/basyx.common/basyx.backend.inmemory.core/pom.xml
new file mode 100644
index 000000000..579e9c321
--- /dev/null
+++ b/basyx.common/basyx.backend.inmemory.core/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+
+ org.eclipse.digitaltwin.basyx
+ basyx.common
+ ${revision}
+
+ basyx.backend.inmemory.core
+ BaSyx InMemory Backend core
+ BaSyx InMemory Backend core
+
+
+
+ org.eclipse.digitaltwin.basyx
+ basyx.core
+
+
+ org.springframework.data
+ spring-data-commons
+
+
+ org.eclipse.digitaltwin.aas4j
+ aas4j-dataformat-json
+
+
+
\ No newline at end of file
diff --git a/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackend.java b/basyx.common/basyx.backend.inmemory.core/src/main/java/org/eclipse/digitaltwin/basyx/common/backend/inmemory/core/InMemoryCrudRepository.java
similarity index 69%
rename from basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackend.java
rename to basyx.common/basyx.backend.inmemory.core/src/main/java/org/eclipse/digitaltwin/basyx/common/backend/inmemory/core/InMemoryCrudRepository.java
index 91afca35d..8c5267266 100644
--- a/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackend.java
+++ b/basyx.common/basyx.backend.inmemory.core/src/main/java/org/eclipse/digitaltwin/basyx/common/backend/inmemory/core/InMemoryCrudRepository.java
@@ -23,45 +23,51 @@
* SPDX-License-Identifier: MIT
******************************************************************************/
-package org.eclipse.digitaltwin.basyx.submodelrepository;
+package org.eclipse.digitaltwin.basyx.common.backend.inmemory.core;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
-import org.eclipse.digitaltwin.aas4j.v3.model.Submodel;
import org.springframework.data.repository.CrudRepository;
import org.springframework.lang.NonNull;
/**
- * InMemory implementation for the Submodel backend
- *
- * @author mateusmolina, danish
+ * CrudRepository implementation for InMemory backends
*
+ * @author danish
*/
-public class SubmodelInMemoryBackend implements CrudRepository {
-
- private final ConcurrentMap inMemoryStore = new ConcurrentHashMap<>();
+public class InMemoryCrudRepository implements CrudRepository {
+
+ private final ConcurrentMap inMemoryStore = new ConcurrentHashMap<>();
+ private Function idGetter;
+ public InMemoryCrudRepository(Function idGetter) {
+ this.idGetter = idGetter;
+ }
+
@Override
- public @NonNull S save(@NonNull S entity) {
- inMemoryStore.put(entity.getId(), entity);
+ public @NonNull S save(@NonNull S entity) {
+ String id = idGetter.apply(entity);
+
+ inMemoryStore.put(id, entity);
return entity;
}
@Override
- public @NonNull Iterable saveAll(@NonNull Iterable entities) {
+ public @NonNull Iterable saveAll(@NonNull Iterable entities) {
entities.forEach(this::save);
return entities;
}
@Override
- public @NonNull Optional findById(String id) {
+ public @NonNull Optional findById(@NonNull String id) {
return Optional.ofNullable(inMemoryStore.get(id));
}
@@ -71,12 +77,12 @@ public boolean existsById(@NonNull String id) {
}
@Override
- public @NonNull Iterable findAll() {
+ public @NonNull Iterable findAll() {
return inMemoryStore.values();
}
@Override
- public @NonNull Iterable findAllById(@NonNull Iterable ids) {
+ public @NonNull Iterable findAllById(@NonNull Iterable ids) {
return StreamSupport.stream(ids.spliterator(), false).map(inMemoryStore::get).filter(Objects::nonNull).collect(Collectors.toList());
}
@@ -91,8 +97,10 @@ public void deleteById(@NonNull String id) {
}
@Override
- public void delete(@NonNull Submodel entity) {
- inMemoryStore.remove(entity.getId());
+ public void delete(@NonNull T entity) {
+ String id = idGetter.apply(entity);
+
+ inMemoryStore.remove(id);
}
@Override
@@ -102,9 +110,10 @@ public void deleteAllById(@NonNull Iterable extends String> ids) {
}
@Override
- public void deleteAll(@NonNull Iterable extends Submodel> entities) {
- for (Submodel entity : entities)
- inMemoryStore.remove(entity.getId());
+ public void deleteAll(@NonNull Iterable extends T> entities) {
+
+ for (T entity : entities)
+ inMemoryStore.remove(idGetter.apply(entity));
}
@Override
@@ -112,5 +121,5 @@ public void deleteAll() {
inMemoryStore.clear();
}
-}
+}
diff --git a/basyx.common/pom.xml b/basyx.common/pom.xml
index 9ac32b4b3..fe6807eaa 100644
--- a/basyx.common/pom.xml
+++ b/basyx.common/pom.xml
@@ -20,6 +20,7 @@
basyx.mongocore
basyx.authorization
basyx.client
+ basyx.backend.inmemory.core
basyx.filerepository-backend
basyx.filerepository-backend-inmemory
basyx.filerepository-backend-mongodb
diff --git a/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/pom.xml b/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/pom.xml
index 3d9e795dd..12471a489 100644
--- a/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/pom.xml
+++ b/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/pom.xml
@@ -20,6 +20,10 @@
org.eclipse.digitaltwin.basyx
basyx.conceptdescriptionrepository-backend
+
+
+ org.eclipse.digitaltwin.basyx
+ basyx.backend.inmemory.core
org.eclipse.digitaltwin.basyx
diff --git a/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackend.java b/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackend.java
deleted file mode 100644
index 38d8afa27..000000000
--- a/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackend.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2024 the Eclipse BaSyx Authors
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- ******************************************************************************/
-
-package org.eclipse.digitaltwin.basyx.conceptdescriptionrepository;
-
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-import org.eclipse.digitaltwin.aas4j.v3.model.ConceptDescription;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.lang.NonNull;
-
-/**
- * InMemory implementation for the {@link ConceptDescription} backend
- *
- * @author danish, mateusmolina
- *
- */
-public class ConceptDescriptionInMemoryBackend implements CrudRepository {
-
- private final ConcurrentMap inMemoryStore = new ConcurrentHashMap<>();
-
- @Override
- public @NonNull S save(@NonNull S entity) {
- inMemoryStore.put(entity.getId(), entity);
-
- return entity;
- }
-
- @Override
- public @NonNull Iterable saveAll(@NonNull Iterable entities) {
- entities.forEach(this::save);
-
- return entities;
- }
-
- @Override
- public @NonNull Optional findById(@NonNull String id) {
- return Optional.ofNullable(inMemoryStore.get(id));
- }
-
- @Override
- public boolean existsById(@NonNull String id) {
- return inMemoryStore.containsKey(id);
- }
-
- @Override
- public @NonNull Iterable findAll() {
- return inMemoryStore.values();
- }
-
- @Override
- public @NonNull Iterable findAllById(@NonNull Iterable ids) {
- return StreamSupport.stream(ids.spliterator(), false).map(inMemoryStore::get).filter(Objects::nonNull).collect(Collectors.toList());
- }
-
- @Override
- public long count() {
- return inMemoryStore.size();
- }
-
- @Override
- public void deleteById(@NonNull String id) {
- inMemoryStore.remove(id);
- }
-
- @Override
- public void delete(@NonNull ConceptDescription entity) {
- inMemoryStore.remove(entity.getId());
- }
-
- @Override
- public void deleteAllById(@NonNull Iterable extends String> ids) {
- for (String id : ids)
- inMemoryStore.remove(id);
- }
-
- @Override
- public void deleteAll(@NonNull Iterable extends ConceptDescription> entities) {
- for (ConceptDescription entity : entities)
- inMemoryStore.remove(entity.getId());
- }
-
- @Override
- public void deleteAll() {
- inMemoryStore.clear();
- }
-
-}
-
diff --git a/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackendProvider.java b/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackendProvider.java
index b2dae7e65..e5775d9e7 100644
--- a/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackendProvider.java
+++ b/basyx.conceptdescriptionrepository/basyx.conceptdescriptionrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/conceptdescriptionrepository/ConceptDescriptionInMemoryBackendProvider.java
@@ -27,6 +27,7 @@
import org.eclipse.digitaltwin.aas4j.v3.model.ConceptDescription;
import org.eclipse.digitaltwin.basyx.aasrepository.backend.ConceptDescriptionBackendProvider;
+import org.eclipse.digitaltwin.basyx.common.backend.inmemory.core.InMemoryCrudRepository;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
@@ -42,7 +43,7 @@ public class ConceptDescriptionInMemoryBackendProvider implements ConceptDescrip
@Override
public CrudRepository getCrudRepository() {
- return new ConceptDescriptionInMemoryBackend();
+ return new InMemoryCrudRepository(ConceptDescription::getId);
}
}
diff --git a/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/pom.xml b/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/pom.xml
index 11d97c975..1edfa7be2 100644
--- a/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/pom.xml
+++ b/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/pom.xml
@@ -24,6 +24,10 @@
org.eclipse.digitaltwin.basyx
basyx.submodelservice-core
+
+
+ org.eclipse.digitaltwin.basyx
+ basyx.backend.inmemory.core
org.eclipse.digitaltwin.basyx
diff --git a/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackendProvider.java b/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackendProvider.java
index 79b69eb2a..bf65b85dc 100644
--- a/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackendProvider.java
+++ b/basyx.submodelrepository/basyx.submodelrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelInMemoryBackendProvider.java
@@ -26,6 +26,7 @@
package org.eclipse.digitaltwin.basyx.submodelrepository;
import org.eclipse.digitaltwin.aas4j.v3.model.Submodel;
+import org.eclipse.digitaltwin.basyx.common.backend.inmemory.core.InMemoryCrudRepository;
import org.eclipse.digitaltwin.basyx.submodelrepository.backend.SubmodelBackendProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.data.repository.CrudRepository;
@@ -43,7 +44,7 @@ public class SubmodelInMemoryBackendProvider implements SubmodelBackendProvider
@Override
public CrudRepository getCrudRepository() {
- return new SubmodelInMemoryBackend();
+ return new InMemoryCrudRepository(Submodel::getId);
}
}
diff --git a/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySuite.java b/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySuite.java
index 82fa5b6b5..ce9c3aa04 100644
--- a/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySuite.java
+++ b/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySuite.java
@@ -48,7 +48,6 @@
import org.eclipse.digitaltwin.basyx.core.exceptions.NotInvokableException;
import org.eclipse.digitaltwin.basyx.core.pagination.CursorResult;
import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo;
-import org.eclipse.digitaltwin.basyx.http.Base64UrlEncoder;
import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository;
import org.eclipse.digitaltwin.basyx.submodelservice.DummySubmodelFactory;
import org.eclipse.digitaltwin.basyx.submodelservice.SubmodelService;
@@ -95,7 +94,7 @@ public void getAllSubmodelsBySemanticIDPreconfigured() {
Collection expectedSubmodels = DummySubmodelFactory.getSubmodelsBySemanticid(DummySubmodelFactory.SUBMODEL_TECHNICAL_DATA_SEMANTIC_ID);
SubmodelRepository repo = getSubmodelRepository(expectedSubmodels);
- Collection submodels = repo.getAllSubmodels(DummySubmodelFactory.SUBMODEL_TECHNICAL_DATA_SEMANTIC_ID, NO_LIMIT_PAGINATION_INFO).getResult();
+ Collection submodels = repo.getAllSubmodels(DummySubmodelFactory.SUBMODEL_TECHNICAL_DATA_SEMANTIC_ID, PaginationInfo.NO_LIMIT).getResult();
assertSubmodelsAreContained(expectedSubmodels, submodels);
}
diff --git a/pom.xml b/pom.xml
index 079e995d4..7ece3f8bb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -448,6 +448,11 @@
basyx.filerepository-backend-mongodb
${revision}
+
+ org.eclipse.digitaltwin.basyx
+ basyx.backend.inmemory.core
+ ${revision}
+
org.eclipse.digitaltwin.basyx