blob: 71301142d1b7618fcc2b625a0620ee5665890b17 [file] [log] [blame]
package org.eclipse.basyx.examples.snippets.vab;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashMap;
import org.eclipse.basyx.components.servlet.vab.VABLambdaServlet;
import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext;
import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
import org.eclipse.basyx.examples.support.directory.ExamplesPreconfiguredDirectory;
import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
import org.eclipse.basyx.vab.manager.VABConnectionManager;
import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
import org.junit.ClassRule;
import org.junit.Test;
/**
* Code snippet that illustrates the use of CRUD Virtual Automation Bus (VAB) operations
*
* The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
* Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
* is able to host any VAB object.
*
* @author kuhn
*
*/
public class CRUDOperations {
/**
* Create VAB connection manager backend
*
* The connection manager uses a preconfigured directory for resolving IDs to
* network addresses, and a HTTP connector to connect to VAB objects.
*/
protected VABConnectionManager connManager = new VABConnectionManager(
new ExamplesPreconfiguredDirectory()
// Add example specific mappings
.addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/devicestatusVAB/"),
new HTTPConnectorProvider());
/**
* The BaSyx Deployment instantiates and starts context elements for this example.
*
* This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
* example context that creates one AAS server, and one SQL based AAS registry.
*
* BaSyxDeployment contexts instantiate all components on the IP address of the host.
* Therefore, all components use the same IP address.
*/
@ClassRule
public static BaSyxDeployment context = new BaSyxDeployment(
// Simulated servlets
// - BaSys topology with one AAS Server and one SQL directory
new BaSyxExamplesContext().
// Deploy example specific servlets to Tomcat server in this context
addServletMapping("/Testsuite/components/BaSys/1.0/devicestatusVAB/*", new VABLambdaServlet())
);
/**
* Run code snippet. This code snippet illustrates the use of CRUD operations to
* access Virtual Automation Bus objects
*/
@Test
public void snippet() throws Exception {
// Server connections
// - Connect to VAB object by ID. The connection manager looks up this ID in
// its directory
VABElementProxy connSubModel1 = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003");
// Create properties on AAS
// - This code creates a simple container "properties" and two contained
// properties "prop1" and "prop2". Container and properties lack the
// required properties for AAS and AAS sub models. They are therefore
// not compliant to Asset Administration Shells.
connSubModel1.createValue("properties", new HashMap<String, Object>());
connSubModel1.createValue("properties/prop1", 7);
connSubModel1.createValue("properties/prop2", "myStr");
// Read property values
int prop1Val = (int) connSubModel1.getModelPropertyValue("properties/prop1");
String prop2Val = (String) connSubModel1.getModelPropertyValue("properties/prop2");
// Update property values
connSubModel1.setModelPropertyValue("properties/prop1", 8);
connSubModel1.setModelPropertyValue("properties/prop2", "stillMine");
// Read property values again
int prop1Val_2 = (int) connSubModel1.getModelPropertyValue("properties/prop1");
String prop2Val_2 = (String) connSubModel1.getModelPropertyValue("properties/prop2");
// Delete property values
connSubModel1.deleteValue("properties/prop1");
connSubModel1.deleteValue("properties/prop2");
// Read property values again
try {
connSubModel1.getModelPropertyValue("properties/prop1");
fail();
} catch (ResourceNotFoundException e) {}
try {
connSubModel1.getModelPropertyValue("properties/prop2");
fail();
} catch (ResourceNotFoundException e) {}
// Check expected values from CRUD operations
assertTrue(prop1Val == 7);
assertTrue(prop2Val.equals("myStr"));
assertTrue(prop1Val_2 == 8);
assertTrue(prop2Val_2.equals("stillMine"));
}
}