blob: 9aa693a0972b648f846f90639cc849e873fde855 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2021 the Eclipse BaSyx Authors
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
******************************************************************************/
package org.eclipse.basyx.components.aas.mqtt;
import java.util.Set;
import org.eclipse.basyx.components.configuration.BaSyxMqttConfiguration;
import org.eclipse.basyx.extensions.submodel.mqtt.MqttSubmodelAPI;
import org.eclipse.basyx.submodel.metamodel.map.SubModel;
import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPI;
import org.eclipse.basyx.submodel.restapi.api.ISubmodelAPIFactory;
import org.eclipse.basyx.submodel.restapi.vab.VABSubmodelAPI;
import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
import org.eclipse.basyx.vab.modelprovider.lambda.VABLambdaProvider;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Api provider for constructing a new Submodel API that emits MQTT events
*
* @author espen
*/
public class MqttSubmodelAPIFactory implements ISubmodelAPIFactory {
private static Logger logger = LoggerFactory.getLogger(MqttSubmodelAPIFactory.class);
private BaSyxMqttConfiguration config;
/**
* Constructor with MQTT configuration for providing submodel APIs
*
* @param config
*/
public MqttSubmodelAPIFactory(BaSyxMqttConfiguration config) {
this.config = config;
}
@Override
public ISubmodelAPI getSubmodelAPI(SubModel sm) {
// Get the submodel's id from the given provider
String smId = sm.getIdentification().getId();
// Create the API
IModelProvider provider = new VABLambdaProvider(sm);
VABSubmodelAPI observedApi = new VABSubmodelAPI(provider);
// Configure the API according to the given configs
String brokerEndpoint = config.getServer();
String clientId = smId;
MqttSubmodelAPI api;
try {
if (config.getUser() != null) {
String user = config.getUser();
String pass = config.getPass();
api = new MqttSubmodelAPI(observedApi, brokerEndpoint, clientId, user, pass.toCharArray());
} else {
api = new MqttSubmodelAPI(observedApi, brokerEndpoint, clientId);
}
setWhitelist(api, smId);
} catch (MqttException e) {
logger.error("Could not create MqttSubmodelApi", e);
return observedApi;
}
return api;
}
private void setWhitelist(MqttSubmodelAPI api, String smId) {
if (!config.isWhitelistEnabled(smId)) {
// Do not use the whitelist if it has been disabled
api.disableWhitelist();
return;
}
// Read whitelist from configuration
Set<String> whitelist = config.getWhitelist(smId);
logger.info("Set MQTT whitelist for " + smId + " with " + whitelist.size() + " entries");
api.setWhitelist(whitelist);
api.enableWhitelist();
}
}