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