001package jmri.jmrix.mqtt.logixng;
002
003import jmri.jmrit.logixng.actions.*;
004
005import java.beans.PropertyChangeEvent;
006import java.beans.PropertyChangeListener;
007import java.util.*;
008
009import jmri.*;
010import jmri.jmrit.logixng.*;
011import jmri.jmrit.logixng.util.LogixNG_SelectString;
012import jmri.jmrit.logixng.util.parser.ParserException;
013import jmri.jmrix.mqtt.MqttSystemConnectionMemo;
014import jmri.util.ThreadingUtil;
015
016/**
017 * This action publishes a message to MQTT.
018 *
019 * @author Daniel Bergqvist Copyright 2022
020 */
021public class Publish extends AbstractDigitalAction
022        implements PropertyChangeListener {
023
024    private final LogixNG_SelectString _selectTopic =
025            new LogixNG_SelectString(this, this);
026    private final LogixNG_SelectString _selectMessage =
027            new LogixNG_SelectString(this, this);
028
029    private MqttSystemConnectionMemo _memo;
030
031
032    public Publish(String sys, String user, MqttSystemConnectionMemo memo)
033            throws BadUserNameException, BadSystemNameException {
034        super(sys, user);
035        _memo = memo;
036    }
037
038    @Override
039    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException {
040        DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class);
041        String sysName = systemNames.get(getSystemName());
042        String userName = userNames.get(getSystemName());
043        if (sysName == null) sysName = manager.getAutoSystemName();
044        Publish copy = new Publish(sysName, userName, _memo);
045        copy.setComment(getComment());
046        _selectTopic.copy(copy._selectTopic);
047        _selectMessage.copy(copy._selectMessage);
048        return manager.registerAction(copy);
049    }
050
051    public void setMemo(MqttSystemConnectionMemo memo) {
052        assertListenersAreNotRegistered(log, "setMemo");
053        _memo = memo;
054    }
055
056    public MqttSystemConnectionMemo getMemo() {
057        return _memo;
058    }
059
060    public LogixNG_SelectString getSelectTopic() {
061        return _selectTopic;
062    }
063
064    public LogixNG_SelectString getSelectMessage() {
065        return _selectMessage;
066    }
067
068    /** {@inheritDoc} */
069    @Override
070    public Category getCategory() {
071        return Category.ITEM;
072    }
073
074    /** {@inheritDoc} */
075    @Override
076    public void execute() throws JmriException {
077
078        String topic = _selectTopic.evaluateValue(getConditionalNG());
079        String data = _selectMessage.evaluateValue(getConditionalNG());
080
081        ThreadingUtil.runOnLayoutWithJmriException(() -> {
082            _memo.getMqttAdapter().publish(topic, data);
083        });
084    }
085
086    @Override
087    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
088        throw new UnsupportedOperationException("Not supported.");
089    }
090
091    @Override
092    public int getChildCount() {
093        return 0;
094    }
095
096    @Override
097    public String getShortDescription(Locale locale) {
098        return Bundle.getMessage(locale, "Publish_Short");
099    }
100
101    @Override
102    public String getLongDescription(Locale locale) {
103        return Bundle.getMessage(locale, "Publish_Long",
104                _selectTopic.getDescription(locale),
105                _selectMessage.getDescription(locale));
106    }
107
108    /** {@inheritDoc} */
109    @Override
110    public void setup() {
111        // Do nothing
112    }
113
114    /** {@inheritDoc} */
115    @Override
116    public void registerListenersForThisClass() {
117        _selectTopic.registerListeners();
118        _selectMessage.registerListeners();
119    }
120
121    /** {@inheritDoc} */
122    @Override
123    public void unregisterListenersForThisClass() {
124        _selectTopic.unregisterListeners();
125        _selectMessage.unregisterListeners();
126    }
127
128    /** {@inheritDoc} */
129    @Override
130    public void propertyChange(PropertyChangeEvent evt) {
131        getConditionalNG().execute();
132    }
133
134    /** {@inheritDoc} */
135    @Override
136    public void disposeMe() {
137    }
138
139    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Publish.class);
140
141}