blob: ef20c2df8bc0eaf039aa1d0d5cbb557d6b42a5ec [file] [log] [blame]
package org.eclipse.basyx.submodel.restapi.vab;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
import org.eclipse.basyx.submodel.metamodel.api.submodelelement.operation.IOperation;
import org.eclipse.basyx.submodel.metamodel.map.SubModel;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElement;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.operation.Operation;
import org.eclipse.basyx.submodel.restapi.MultiSubmodelElementProvider;
import org.eclipse.basyx.submodel.restapi.OperationProvider;
import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPI;
import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
/**
* Implements the Submodel API by mapping it to VAB paths
*
* @author schnicke
*
*/
public class VABSubmodelAPI implements ISubmodelAPI {
// The VAB model provider containing the model this API implementation is based
// on
private IModelProvider modelProvider;
/**
* Creates a VABSubmodelAPI that wraps an IModelProvider
*
* @param modelProvider
* providing the Submodel
*/
public VABSubmodelAPI(IModelProvider modelProvider) {
super();
this.modelProvider = modelProvider;
}
/**
* Creates an IModelProvider for handling accesses to the elements within the
* submodel
*
* @return returns the SubmodelElementProvider pointing to the contained
* submodelelements
*/
private MultiSubmodelElementProvider getElementProvider() {
IModelProvider elementProxy = new VABElementProxy(SubModel.SUBMODELELEMENT, modelProvider);
return new MultiSubmodelElementProvider(elementProxy);
}
@SuppressWarnings("unchecked")
@Override
public ISubModel getSubmodel() {
// For access on the container property root, return the whole model
Map<String, Object> map = (Map<String, Object>) modelProvider.getModelPropertyValue("");
// Only return a copy of the Submodel
Map<String, Object> smCopy = new HashMap<>();
smCopy.putAll(map);
return SubModel.createAsFacade(smCopy);
}
@Override
public void addSubmodelElement(ISubmodelElement elem) {
getElementProvider().createValue(MultiSubmodelElementProvider.ELEMENTS, elem);
}
@Override
public void addSubmodelElement(String idShortPath, ISubmodelElement elem) {
getElementProvider().createValue(MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath, elem);
}
@Override
public void deleteSubmodelElement(String idShortPath) {
getElementProvider().deleteValue(MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath);
}
@Override
public Collection<IOperation> getOperations() {
return getSubmodelElements().stream().filter(e -> e instanceof IOperation).map(e -> (IOperation) e).collect(Collectors.toList());
}
@SuppressWarnings("unchecked")
@Override
public Collection<ISubmodelElement> getSubmodelElements() {
Collection<Map<String, Object>> elements = (Collection<Map<String, Object>>) getElementProvider()
.getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS);
return elements.stream().map(SubmodelElement::createAsFacade).collect(Collectors.toList());
}
@Override
public void updateSubmodelElement(String idShortPath, Object newValue) {
getElementProvider().setModelPropertyValue(buildValuePathForProperty(idShortPath), newValue);
}
@Override
public Object getSubmodelElementValue(String idShortPath) {
return getElementProvider().getModelPropertyValue(buildValuePathForProperty(idShortPath));
}
@SuppressWarnings("unchecked")
@Override
public ISubmodelElement getSubmodelElement(String idShortPath) {
return SubmodelElement.createAsFacade((Map<String, Object>) getElementProvider().getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath));
}
@Override
public Object invokeOperation(String idShortPath, Object... params) {
return getElementProvider().invokeOperation(MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath, params);
}
@Override
public Object invokeAsync(String idShortPath, Object... params) {
return getElementProvider().invokeOperation(MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath +"/" + Operation.INVOKE + OperationProvider.ASYNC, params);
}
private String buildValuePathForProperty(String idShortPath) {
return MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath + "/" + Property.VALUE;
}
@Override
public Object getOperationResult(String idShortPath, String requestId) {
return getElementProvider().getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/" + idShortPath + "/" + OperationProvider.INVOCATION_LIST + "/" + requestId);
}
}