Fixes persistency problem with MongoDB in AASServerComponent

Change-Id: I2022f792de0b97163e015d823af324f6933cf467
Signed-off-by: Daniel Espen <Daniel.Espen@iese.fraunhofer.de>
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAPI.java b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAPI.java
index 99ae7c4..9dbc2c7 100644
--- a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAPI.java
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAPI.java
@@ -122,7 +122,7 @@
 		// Add reference
 		aas.addSubmodelReference(submodel);
 		// Update db entry
-		mongoOps.findAndReplace(hasId, aas);
+		mongoOps.findAndReplace(hasId, aas, collection);
 	}
 
 	@Override
@@ -149,7 +149,7 @@
 			}
 		}
 		// Update db entry
-		mongoOps.findAndReplace(hasId, aas);
+		mongoOps.findAndReplace(hasId, aas, collection);
 	}
 
 }
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAggregator.java b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAggregator.java
index 5c37004..8f8903c 100644
--- a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAggregator.java
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mongodb/MongoDBAASAggregator.java
@@ -18,6 +18,7 @@
 import org.eclipse.basyx.aas.restapi.AASModelProvider;
 import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
 import org.eclipse.basyx.aas.restapi.api.IAASAPI;
+import org.eclipse.basyx.aas.restapi.api.IAASAPIFactory;
 import org.eclipse.basyx.components.configuration.BaSyxMongoDBConfiguration;
 import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
 import org.eclipse.basyx.submodel.metamodel.api.reference.IKey;
@@ -29,8 +30,10 @@
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.Referable;
 import org.eclipse.basyx.submodel.restapi.SubModelProvider;
 import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPI;
+import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPIFactory;
 import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
 import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.vab.protocol.api.IConnectorProvider;
 import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,6 +68,16 @@
 	private IAASRegistryService registry;
 
 	/**
+	 * Store AAS API Provider. By default, uses the MongoDB API Provider
+	 */
+	protected IAASAPIFactory aasApiProvider;
+
+	/**
+	 * Store Submodel API Provider. By default, uses a MongoDB Submodel Provider
+	 */
+	protected ISubmodelAPIFactory smApiProvider;
+
+	/**
 	 * Receives the path of the configuration.properties file in it's constructor.
 	 * 
 	 * @param configFilePath
@@ -101,11 +114,24 @@
 	 * @param config
 	 */
 	public void setConfiguration(BaSyxMongoDBConfiguration config) {
+		// set mongoDB configuration
 		this.config = config;
 		MongoClient client = MongoClients.create(config.getConnectionUrl());
 		this.mongoOps = new MongoTemplate(client, config.getDatabase());
 		this.aasCollection = config.getAASCollection();
 		this.smCollection = config.getSubmodelCollection();
+
+		// Create API factories with the given configuration
+		this.aasApiProvider = aas -> {
+			MongoDBAASAPI api = new MongoDBAASAPI(config, aas.getIdentification().getId());
+			api.setAAS(aas);
+			return api;
+		};
+		this.smApiProvider = sm -> {
+			MongoDBSubmodelAPI api = new MongoDBSubmodelAPI(config, sm.getIdentification().getId());
+			api.setSubModel(sm);
+			return api;
+		};
 	}
 
 	/**
@@ -120,17 +146,31 @@
 	private void init() {
 		List<AssetAdministrationShell> data = mongoOps.findAll(AssetAdministrationShell.class, aasCollection);
 		for (AssetAdministrationShell aas : data) {
-			logger.info("Adding AAS from DB: " + aas.getIdentification().getId());
-			VABMultiSubmodelProvider provider = createMultiSubmodelProvider(aas);
+			String aasId = aas.getIdentification().getId();
+			logger.info("Adding AAS from DB: " + aasId);
+			MongoDBAASAPI aasApi = new MongoDBAASAPI(config, aasId);
+			VABMultiSubmodelProvider provider = initMultiSubmodelProvider(aasApi);
+			addSubmodelsFromDB(provider, aas);
 			aasProviderMap.put(aas.getIdentification().getId(), provider);
 		}
 	}
 
-	private VABMultiSubmodelProvider createMultiSubmodelProvider(AssetAdministrationShell aas) {
-		IAASAPI aasApi = new MongoDBAASAPI(config, aas.getIdentification().getId());
+	/**
+	 * Initializes and returns a VABMultiSubmodelProvider with only the AssetAdministrationShell
+	 */
+	private VABMultiSubmodelProvider initMultiSubmodelProvider(IAASAPI aasApi) {
 		AASModelProvider aasProvider = new AASModelProvider(aasApi);
-		VABMultiSubmodelProvider provider = new VABMultiSubmodelProvider(aasProvider, registry, new HTTPConnectorProvider());
+		IConnectorProvider connProvider = new HTTPConnectorProvider();
+		VABMultiSubmodelProvider provider = new VABMultiSubmodelProvider(aasProvider, registry, connProvider,
+				smApiProvider, aasApiProvider);
+		provider.setAssetAdministrationShell(aasProvider);
+		return provider;
+	}
 
+	/**
+	 * Adds submodel providers for submodels in the MongoDB
+	 */
+	private void addSubmodelsFromDB(VABMultiSubmodelProvider provider, AssetAdministrationShell aas) {
 		// Get ids and idShorts from aas
 		Collection<IReference> submodelRefs = aas.getSubmodelReferences();
 		List<String> smIds = new ArrayList<>();
@@ -158,8 +198,6 @@
 			logger.info("Adding Submodel from DB: " + id);
 			addSubmodelProvidersById(id, provider);
 		}
-
-		return provider;
 	}
 
 	private String getSubmodelId(String idShort) {
@@ -205,10 +243,9 @@
 
 	@Override
 	public void createAAS(AssetAdministrationShell aas) {
-		MongoDBAASAPI aasApi = new MongoDBAASAPI(config, aas.getIdentification().getId());
-		aasApi.setAAS(aas);
-		AASModelProvider provider = new AASModelProvider(aasApi);
-		aasProviderMap.put(aas.getIdentification().getId(), new VABMultiSubmodelProvider(provider));
+		IAASAPI aasApi = this.aasApiProvider.getAASApi(aas);
+		VABMultiSubmodelProvider provider = initMultiSubmodelProvider(aasApi);
+		aasProviderMap.put(aas.getIdentification().getId(), provider);
 	}
 
 	@Override
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mqtt/MqttSubmodelAPIFactory.java b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mqtt/MqttSubmodelAPIFactory.java
index bc944aa..41dd9dc 100644
--- a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mqtt/MqttSubmodelAPIFactory.java
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/main/java/org/eclipse/basyx/components/aas/mqtt/MqttSubmodelAPIFactory.java
@@ -4,13 +4,12 @@
 
 import org.eclipse.basyx.components.configuration.BaSyxMqttConfiguration;
 import org.eclipse.basyx.extensions.submodel.mqtt.MqttSubmodelAPI;
-import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
-import org.eclipse.basyx.submodel.metamodel.map.qualifier.Identifiable;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
 import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPI;
 import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPIFactory;
 import org.eclipse.basyx.submodel.restapi.vab.VABSubmodelAPI;
-import org.eclipse.basyx.vab.modelprovider.VABPathTools;
 import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.vab.modelprovider.lambda.VABLambdaProvider;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,13 +34,13 @@
 	}
 
 	@Override
-	public ISubmodelAPI getSubmodelAPI(IModelProvider smProvider) {
+	public ISubmodelAPI getSubmodelAPI(SubModel sm) {
 		// Get the submodel's id from the given provider
-		String idPath = VABPathTools.concatenatePaths(Identifiable.IDENTIFICATION, Identifier.ID);
-		String smId = (String) smProvider.getModelPropertyValue(idPath);
+		String smId = sm.getIdentification().getId();
 		
 		// Create the API
-		VABSubmodelAPI observedApi = new VABSubmodelAPI(smProvider);
+		IModelProvider provider = new VABLambdaProvider(sm);
+		VABSubmodelAPI observedApi = new VABSubmodelAPI(provider);
 
 		// Configure the API according to the given configs
 		String brokerEndpoint = config.getServer();
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/AASServerSuite.java b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/AASServerSuite.java
index cf485e6..d7d47b0 100644
--- a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/AASServerSuite.java
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/AASServerSuite.java
@@ -23,9 +23,9 @@
  */
 public abstract class AASServerSuite {
 	protected IAASRegistryService aasRegistry;
-	private ConnectedAssetAdministrationShellManager manager;
+	protected ConnectedAssetAdministrationShellManager manager;
 
-	private String aasId = "testId";
+	protected String aasId = "testId";
 
 	protected abstract String getURL();
 
@@ -50,5 +50,4 @@
 		IAssetAdministrationShell remote = manager.retrieveAAS(identifier);
 		assertEquals(shell.getIdShort(), remote.getIdShort());
 	}
-
 }
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestMongoDBServer.java b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestMongoDBServer.java
index f82fcd7..8537f19 100644
--- a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestMongoDBServer.java
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestMongoDBServer.java
@@ -1,17 +1,26 @@
 package org.eclipse.basyx.regression.AASServer;
 
+import static org.junit.Assert.assertEquals;
+
 import java.io.IOException;
 
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
 import org.eclipse.basyx.components.aas.AASServerComponent;
 import org.eclipse.basyx.components.aas.configuration.AASServerBackend;
 import org.eclipse.basyx.components.aas.configuration.BaSyxAASServerConfiguration;
 import org.eclipse.basyx.components.aas.mongodb.MongoDBAASAggregator;
+import org.eclipse.basyx.components.aas.mongodb.MongoDBSubmodelAPI;
 import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
 import org.eclipse.basyx.components.configuration.BaSyxMongoDBConfiguration;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.junit.Test;
 import org.xml.sax.SAXException;
 
 /**
@@ -23,6 +32,7 @@
 public class TestMongoDBServer extends AASServerSuite {
 
 	private static AASServerComponent component;
+	private static BaSyxMongoDBConfiguration mongoDBConfig;
 
 	@Override
 	protected String getURL() {
@@ -37,7 +47,7 @@
 		// Setup component configuration
 		BaSyxContextConfiguration contextConfig = new BaSyxContextConfiguration();
 		contextConfig.loadFromResource(BaSyxContextConfiguration.DEFAULT_CONFIG_PATH);
-		BaSyxMongoDBConfiguration mongoDBConfig = new BaSyxMongoDBConfiguration();
+		mongoDBConfig = new BaSyxMongoDBConfiguration();
 		BaSyxAASServerConfiguration aasConfig = new BaSyxAASServerConfiguration(AASServerBackend.MONGODB, "");
 
 		// Start component
@@ -45,6 +55,18 @@
 		component.startComponent();
 	}
 
+	@Test
+	public void testAddSubmodelPersistency() throws Exception {
+		testAddAAS();
+
+		SubModel sm = new SubModel("MongoDB", new Identifier(IdentifierType.CUSTOM, "MongoDBId"));
+		manager.createSubModel(new ModelUrn(aasId), sm);
+
+		MongoDBSubmodelAPI api = new MongoDBSubmodelAPI(mongoDBConfig, sm.getIdentification().getId());
+		ISubModel persistentSM = api.getSubmodel();
+		assertEquals("MongoDB", persistentSM.getIdShort());
+	}
+
 	@AfterClass
 	public static void tearDownClass() {
 		component.stopComponent();
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/aggregator/AASAggregator.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/aggregator/AASAggregator.java
index f76947c..0a3a97d 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/aggregator/AASAggregator.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/aggregator/AASAggregator.java
@@ -19,7 +19,6 @@
 import org.eclipse.basyx.submodel.restapi.vab.VABSubmodelAPIFactory;
 import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
 import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
-import org.eclipse.basyx.vab.modelprovider.lambda.VABLambdaProvider;
 import org.eclipse.basyx.vab.protocol.api.IConnectorProvider;
 import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
 
@@ -125,10 +124,10 @@
 
 	private VABMultiSubmodelProvider createMultiSubmodelProvider(AssetAdministrationShell aas) {
 		IConnectorProvider connProvider = new HTTPConnectorProvider();
-		VABMultiSubmodelProvider multiAASProvider = new VABMultiSubmodelProvider(registry, connProvider, smApiProvider, aasApiProvider);
-		IAASAPI aasApi = aasApiProvider.getAASApi(new VABLambdaProvider(aas));
+		IAASAPI aasApi = aasApiProvider.getAASApi(aas);
 		AASModelProvider contentProvider = new AASModelProvider(aasApi);
-		multiAASProvider.setAssetAdministrationShell(contentProvider);
+		VABMultiSubmodelProvider multiAASProvider = new VABMultiSubmodelProvider(contentProvider, registry,
+				connProvider, smApiProvider, aasApiProvider);
 		return multiAASProvider;
 	}
 
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABAASAPIFactory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABAASAPIFactory.java
index 3535f28..e92da2f 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABAASAPIFactory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABAASAPIFactory.java
@@ -1,8 +1,9 @@
 package org.eclipse.basyx.aas.restapi;
 
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
 import org.eclipse.basyx.aas.restapi.api.IAASAPI;
 import org.eclipse.basyx.aas.restapi.api.IAASAPIFactory;
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.vab.modelprovider.lambda.VABLambdaProvider;
 
 /**
  * AAS API provider that provides the default VAB AAS API
@@ -11,7 +12,7 @@
  */
 public class VABAASAPIFactory implements IAASAPIFactory {
 	@Override
-	public IAASAPI getAASApi(IModelProvider aasProvider) {
-		return new VABAASAPI(aasProvider);
+	public IAASAPI getAASApi(AssetAdministrationShell aas) {
+		return new VABAASAPI(new VABLambdaProvider(aas));
 	}
 }
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABMultiSubmodelProvider.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABMultiSubmodelProvider.java
index ddc547c..ae88553 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABMultiSubmodelProvider.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/VABMultiSubmodelProvider.java
@@ -24,7 +24,6 @@
 import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
 import org.eclipse.basyx.vab.modelprovider.VABPathTools;
 import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
-import org.eclipse.basyx.vab.modelprovider.lambda.VABLambdaProvider;
 import org.eclipse.basyx.vab.protocol.api.IConnectorProvider;
 import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
 
@@ -125,18 +124,20 @@
 	 * Constructor with empty default aas and default VAB APIs
 	 */
 	public VABMultiSubmodelProvider() {
-		this(new VABAASAPIFactory(), new VABSubmodelAPIFactory());
+		this.aasApiProvider = new VABAASAPIFactory();
+		this.smApiProvider = new VABSubmodelAPIFactory();
+		IAASAPI aasApi = aasApiProvider.getAASApi(new AssetAdministrationShell());
+		setAssetAdministrationShell(new AASModelProvider(aasApi));
 	}
 
 	/**
 	 * Constructor for using custom APIs
 	 */
-	public VABMultiSubmodelProvider(IAASAPIFactory aasApiProvider, ISubmodelAPIFactory smApiProvider) {
+	public VABMultiSubmodelProvider(AASModelProvider contentProvider, IAASAPIFactory aasApiProvider,
+			ISubmodelAPIFactory smApiProvider) {
 		this.aasApiProvider = aasApiProvider;
 		this.smApiProvider = smApiProvider;
-		IModelProvider aasLambdaProvider = new VABLambdaProvider(new AssetAdministrationShell());
-		IAASAPI aasApi = aasApiProvider.getAASApi(aasLambdaProvider);
-		setAssetAdministrationShell(new AASModelProvider(aasApi));
+		setAssetAdministrationShell(contentProvider);
 	}
 
 	/**
@@ -172,9 +173,9 @@
 	/**
 	 * Constructor that accepts a registry, a connection provider and API providers
 	 */
-	public VABMultiSubmodelProvider(IAASRegistryService registry, IConnectorProvider connectorProvider,
-			ISubmodelAPIFactory smApiProvider, IAASAPIFactory aasApiProvider) {
-		this(aasApiProvider, smApiProvider);
+	public VABMultiSubmodelProvider(AASModelProvider contentProvider, IAASRegistryService registry,
+			IConnectorProvider connectorProvider, ISubmodelAPIFactory smApiProvider, IAASAPIFactory aasApiProvider) {
+		this(contentProvider, aasApiProvider, smApiProvider);
 		this.registry = registry;
 		this.connectorProvider = connectorProvider;
 	}
@@ -382,7 +383,7 @@
 	private void createAssetAdministrationShell(Object newAAS) {
 		Map<String, Object> aas = (Map<String, Object>) newAAS;
 		AssetAdministrationShell shell = AssetAdministrationShell.createAsFacade(aas);
-		IAASAPI aasApi = aasApiProvider.getAASApi(new VABLambdaProvider(shell));
+		IAASAPI aasApi = aasApiProvider.getAASApi(shell);
 		aas_provider = new AASModelProvider(aasApi);
 	}
 
@@ -391,7 +392,7 @@
 		// Adds a new submodel to the registered AAS
 		SubModel sm = SubModel.createAsFacade((Map<String, Object>) newSM);
 
-		ISubmodelAPI smApi = smApiProvider.getSubmodelAPI(new VABLambdaProvider(sm));
+		ISubmodelAPI smApi = smApiProvider.getSubmodelAPI(sm);
 		addSubmodel(new SubModelProvider(smApi));
 	}
 
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/api/IAASAPIFactory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/api/IAASAPIFactory.java
index eeea356..76f70c8 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/api/IAASAPIFactory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/api/IAASAPIFactory.java
@@ -1,6 +1,6 @@
 package org.eclipse.basyx.aas.restapi.api;
 
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
 
 /**
  * Interface for providing an AAS API
@@ -14,5 +14,5 @@
 	 * 
 	 * @return
 	 */
-	public IAASAPI getAASApi(IModelProvider aasProvider);
+	public IAASAPI getAASApi(AssetAdministrationShell aas);
 }
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/api/ISubmodelAPIFactory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/api/ISubmodelAPIFactory.java
index c27cce1..09f5017 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/api/ISubmodelAPIFactory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/api/ISubmodelAPIFactory.java
@@ -1,6 +1,6 @@
 package org.eclipse.basyx.submodel.restapi.api;
 
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
 
 /**
  * Interface for providing an Submodel API
@@ -14,5 +14,5 @@
 	 * 
 	 * @return
 	 */
-	public ISubmodelAPI getSubmodelAPI(IModelProvider submodelProvider);
+	public ISubmodelAPI getSubmodelAPI(SubModel submodel);
 }
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/vab/VABSubmodelAPIFactory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/vab/VABSubmodelAPIFactory.java
index 30f7bce..6f20f3d 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/vab/VABSubmodelAPIFactory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/restapi/vab/VABSubmodelAPIFactory.java
@@ -1,8 +1,9 @@
 package org.eclipse.basyx.submodel.restapi.vab;
 
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
 import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPI;
 import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPIFactory;
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.vab.modelprovider.lambda.VABLambdaProvider;
 
 /**
  * Submodel API provider that provides the default VAB Submodel API
@@ -12,7 +13,7 @@
  */
 public class VABSubmodelAPIFactory implements ISubmodelAPIFactory {
 	@Override
-	public ISubmodelAPI getSubmodelAPI(IModelProvider submodelProvider) {
-		return new VABSubmodelAPI(submodelProvider);
+	public ISubmodelAPI getSubmodelAPI(SubModel submodel) {
+		return new VABSubmodelAPI(new VABLambdaProvider(submodel));
 	}
 }