| package org.eclipse.basyx.wrapper.provider.aas; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.function.Function; |
| |
| import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier; |
| import org.eclipse.basyx.submodel.metamodel.api.reference.enums.KeyElements; |
| import org.eclipse.basyx.submodel.metamodel.api.reference.enums.KeyType; |
| import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement; |
| import org.eclipse.basyx.submodel.metamodel.map.SubModel; |
| import org.eclipse.basyx.submodel.metamodel.map.reference.Key; |
| import org.eclipse.basyx.submodel.metamodel.map.reference.Reference; |
| import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection; |
| 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.vab.modelprovider.lambda.VABLambdaProviderHelper; |
| import org.eclipse.basyx.wrapper.receiver.IPropertyWrapperService; |
| import org.eclipse.basyx.wrapper.receiver.PropertyResult; |
| import org.eclipse.basyx.wrapper.receiver.configuration.PropertyConfiguration; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * A submodel for wrapping the data |
| * |
| * @author espen |
| * |
| */ |
| public class WrapperSubmodel extends SubModel { |
| private static final Logger logger = LoggerFactory.getLogger(WrapperSubmodel.class); |
| |
| protected Map<String, SubmodelElementCollection> collections = new HashMap<>(); |
| private IPropertyWrapperService proxyService; |
| |
| public WrapperSubmodel(String idShort, IIdentifier id, IPropertyWrapperService connector, |
| Collection<PropertyConfiguration> config) { |
| super(); |
| setIdShort(idShort); |
| setIdentification(id.getIdType(), id.getId()); |
| setSemanticId(new Reference(new Key(KeyElements.CONCEPTDESCRIPTION, true, "0112/2///61360_4#AAF891#001", KeyType.IRDI))); |
| |
| proxyService = connector; |
| proxyService.addProxyListener((String propId, PropertyResult result) -> { |
| SubmodelElementCollection coll = collections.get(propId); |
| if (coll != null) { |
| Collection<ISubmodelElement> smElements = generateSubmodelElements(propId, result); |
| coll.setValue(smElements); |
| } else { |
| logger.error("Invalid property '" + propId + "' has been updated"); |
| } |
| }); |
| initialize(config, connector); |
| } |
| |
| private void initialize(Collection<PropertyConfiguration> configs, IPropertyWrapperService connector) { |
| for ( PropertyConfiguration config : configs ) { |
| String propId = config.getId(); |
| if ( config.getActive() ) { |
| setActiveProperty(propId); |
| } else { |
| setPassiveProperty(propId); |
| } |
| } |
| } |
| |
| private Collection<ISubmodelElement> generateSubmodelElements(String idShort, PropertyResult result) { |
| Collection<ISubmodelElement> elements = new ArrayList<>(); |
| List<Object> data = result.getData(); |
| List<String> dates = result.getTimestamps(); |
| for (int i = data.size() - 1; i >= 0; i--) { |
| Property dateProp = new Property(); |
| dateProp.setIdShort("time" + i); |
| dateProp.set(dates.get(i).toString()); |
| elements.add(dateProp); |
| Property valueProp = new Property(); |
| valueProp.setIdShort("value" + i); |
| valueProp.set(data.get(i)); |
| elements.add(valueProp); |
| } |
| Operation setOperation = new Operation(); |
| setOperation.setIdShort("set" + idShort); |
| Function<Object[], Object> fillInvokable = (params) -> { |
| // not supported, yet |
| return params; |
| }; |
| setOperation.setInvocable(fillInvokable); |
| elements.add(setOperation); |
| return elements; |
| } |
| |
| private void setActiveProperty(String propId) { |
| SubmodelElementCollection coll = new SubmodelElementCollection(); |
| coll.setIdShort(propId); |
| collections.put(propId, coll); |
| addSubModelElement(coll); |
| } |
| |
| private void setPassiveProperty(final String propId) { |
| SubmodelElementCollection coll = new SubmodelElementCollection(); |
| coll.setIdShort(propId); |
| collections.put(propId, new SubmodelElementCollection()); |
| addSubModelElement(coll); |
| |
| coll.put(Property.VALUE, VABLambdaProviderHelper.createSimple(() -> { |
| proxyService.generatePassiveValue(propId); |
| return collections.get(propId).getValue(); |
| }, null)); |
| } |
| } |