Fixes MultiSubmodelProvider to enforce prefix in REST-API

Change-Id: Iaf80607400586d77d2864d7efa7d449c9dc31918
Signed-off-by: Daniel Espen <Daniel.Espen@iese.fraunhofer.de>
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/MultiSubmodelProvider.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/MultiSubmodelProvider.java
index afc71f3..19f5d9c 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/MultiSubmodelProvider.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/restapi/MultiSubmodelProvider.java
@@ -96,6 +96,7 @@
 public class MultiSubmodelProvider implements IModelProvider {
 
 	public static final String AAS = "aas";
+	public static final String SUBMODELS_PREFIX = VABPathTools.concatenatePaths(AAS, AssetAdministrationShell.SUBMODELS);
 
 	/**
 	 * Store aas providers
@@ -352,16 +353,12 @@
 	public void setValue(String path, Object newValue) throws ProviderException {
  		VABPathTools.checkPathForNull(path);
 		path = VABPathTools.stripSlashes(path);
-		// Split path
 		String[] pathElements = VABPathTools.splitPath(path);
 		String propertyPath = VABPathTools.buildPath(pathElements, 3);
-		// - Ignore first 2 elements, as it is "/aas/submodels" --> 'aas','submodels'
-		
-		String submodelsPath = VABPathTools.concatenatePaths(AAS, AssetAdministrationShell.SUBMODELS);
 		if (path.equals(AAS)) {
 			createAssetAdministrationShell(newValue);
-		} else if (!path.startsWith(submodelsPath)) {
-			throw new MalformedRequestException("Access to MultiSubmodelProvider always has to start with \"" + submodelsPath + "\", was " + path);
+		} else if (!path.startsWith(SUBMODELS_PREFIX)) {
+			throw new MalformedRequestException("Access to MultiSubmodelProvider always has to start with \"" + SUBMODELS_PREFIX + "\", was " + path);
 		} else if (propertyPath.isEmpty()) {
 			createSubmodel(newValue);
 		} else {
@@ -396,9 +393,12 @@
 	public void deleteValue(String path) throws ProviderException {
 		VABPathTools.checkPathForNull(path);
 		path = VABPathTools.stripSlashes(path);
+		if (!path.startsWith(SUBMODELS_PREFIX)) {
+			throw new MalformedRequestException("Access to MultiSubmodelProvider always has to start with \"" + SUBMODELS_PREFIX + "\", was " + path);
+		}
+		
 		String[] pathElements = VABPathTools.splitPath(path);
 		String propertyPath = VABPathTools.buildPath(pathElements, 3);
-		// - Ignore first 2 elements, as it is "/aas/submodels" --> 'aas','submodels'
 		if (pathElements.length == 3) {
 			// Delete Submodel from registered AAS
 			String smIdShort = pathElements[2];
@@ -408,8 +408,8 @@
 
 			// Delete submodel reference from aas
 			// TODO: This is a hack until the API is further clarified
-			Submodel sm = Submodel.createAsFacade((Map<String, Object>) submodel_providers.get(smIdShort).getValue("/submodel"));
-			aas_provider.deleteValue("aas/submodels/" + sm.getIdentification().getId());
+			Submodel sm = Submodel.createAsFacade((Map<String, Object>) submodel_providers.get(smIdShort).getValue("/" + SubmodelProvider.SUBMODEL));
+			aas_provider.deleteValue(SUBMODELS_PREFIX + "/" + sm.getIdentification().getId());
 
 			// Remove submodel provider
 			submodel_providers.remove(smIdShort);
@@ -435,10 +435,13 @@
 	public Object invokeOperation(String path, Object... parameter) throws ProviderException {
 		VABPathTools.checkPathForNull(path);
 		path = VABPathTools.stripSlashes(path);
+		if (!path.startsWith(SUBMODELS_PREFIX)) {
+			throw new MalformedRequestException("Access to MultiSubmodelProvider always has to start with \"" + SUBMODELS_PREFIX + "\", was " + path);
+		}
+
 		String[] pathElements = VABPathTools.splitPath(path);
 		String operationPath = VABPathTools.buildPath(pathElements, 3);
-		// - Ignore first 2 elements, as it is "/aas/submodels" --> 'aas','submodels'
-		// - Invoke provider and return result
+
 		IModelProvider provider;
 		if (isSubmodelLocal(pathElements[2])) {
 			provider = submodel_providers.get(pathElements[2]);
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/restapi/MultiSubmodelProviderTest.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/restapi/MultiSubmodelProviderTest.java
index 87c1b84..af618f9 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/restapi/MultiSubmodelProviderTest.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/restapi/MultiSubmodelProviderTest.java
@@ -26,6 +26,7 @@
 import org.eclipse.basyx.submodel.restapi.SubmodelProvider;
 import org.eclipse.basyx.testsuite.regression.submodel.restapi.SimpleAASSubmodel;
 import org.eclipse.basyx.testsuite.regression.vab.manager.VABConnectionManagerStub;
+import org.eclipse.basyx.vab.exception.provider.MalformedRequestException;
 import org.eclipse.basyx.vab.exception.provider.ProviderException;
 import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
 import org.junit.Before;
@@ -59,10 +60,7 @@
 		stub.addProvider(urn, "", provider);
 		proxy = stub.connectToVABElement(urn);
 	}
-
-	/**
-	 * Run JUnit test case
-	 */
+	
 	@Test
 	public void invokeExceptionTest() {
 		// Invoke operationEx1
@@ -77,6 +75,19 @@
 			fail();
 		} catch (ProviderException e) {}
 	}
+	
+	@Test
+	public void invalidPathPrefixInvokeTest() {
+		try {
+			proxy.invokeOperation("/aas/submodelX/SimpleAASSubmodel/submodel/submodelElements/complex/" + Operation.INVOKE, 10, 3);
+			fail();
+		} catch (MalformedRequestException e) {}
+		
+		try {
+			proxy.invokeOperation("/abc/submodels/SimpleAASSubmodel/submodel/submodelElements/complex/" + Operation.INVOKE, 10, 3);
+			fail();
+		} catch (MalformedRequestException e) {}
+	}
 
 	@Test
 	public void invokeTest() {
@@ -93,6 +104,19 @@
 
 		getTestRunner("SimpleAASSubmodel");
 	}
+	
+	@Test
+	public void invalidPathPrefixGetTest() {
+		try {
+			proxy.getValue("/aas/submodelX/SimpleAASSubmodel/submodel/");
+			fail();
+		} catch (MalformedRequestException e) {}
+		
+		try {
+			proxy.getValue("/abc/submodel/SimpleAASSubmodel/submodel/");
+			fail();
+		} catch (MalformedRequestException e) {}
+	}
 
 	@Test
 	public void updateSubmodelTest() {
@@ -108,6 +132,21 @@
 		String newId = shell.getSubmodels().get("TestSM").getIdentification().getId();
 		assertEquals("TestId2", newId);
 	}
+	
+	@Test
+	public void invalidPathPrefixSetTest() {
+		Submodel sm = new SimpleAASSubmodel("TestSM");
+		sm.setIdentification(IdentifierType.CUSTOM, "TestId");
+		try {
+			proxy.setValue("/aas/submodelX/" + sm.getIdShort(), sm);
+			fail();
+		} catch (MalformedRequestException e) {}
+		
+		try {
+			proxy.setValue("/abc/submodels/" + sm.getIdShort(), sm);
+			fail();
+		} catch (MalformedRequestException e) {}
+	}
 
 	@Test
 	public void createDeleteSubmodelTest() {
@@ -136,6 +175,22 @@
 			// Expected
 		}
 	}
+	
+	@Test
+	public void invalidPathPrefixDeleteTest() {
+		Submodel sm = new SimpleAASSubmodel("TestSM");
+		sm.setIdentification(IdentifierType.CUSTOM, "TestId");
+		try {
+			proxy.deleteValue("/aas/submodelX/SimpleAASSubmodel");
+			fail();
+		} catch (MalformedRequestException e) {}
+		
+		try {
+			proxy.deleteValue("/aas/submodelX/SimpleAASSubmodel");
+			fail();
+		} catch (MalformedRequestException e) {}
+	}
+
 
 	private void getTestRunner(String smId) {
 		// Get property value