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}