001package jmri.jmrix.mqtt.logixng.configurexml;
002
003import java.util.List;
004
005import jmri.*;
006import jmri.configurexml.JmriConfigureXmlException;
007import jmri.jmrit.logixng.DigitalActionManager;
008import jmri.jmrix.mqtt.MqttSystemConnectionMemo;
009import jmri.jmrix.mqtt.logixng.Publish;
010import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectStringXml;
011
012import org.jdom2.Element;
013
014/**
015 * Handle XML configuration for Publish objects.
016 *
017 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010
018 * @author Daniel Bergqvist Copyright (C) 2022
019 */
020public class PublishXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML {
021
022    public PublishXml() {
023    }
024
025    /**
026     * Default implementation for storing the contents of a publish action.
027     *
028     * @param o Object to store, of type Publish
029     * @return Element containing the complete info
030     */
031    @Override
032    public Element store(Object o) {
033        Publish p = (Publish) o;
034
035        var selectTopicXml = new LogixNG_SelectStringXml();
036        var selectDataXml = new LogixNG_SelectStringXml();
037
038        Element element = new Element("MQTTPublish");
039        element.setAttribute("class", this.getClass().getName());
040        element.addContent(new Element("systemName").addContent(p.getSystemName()));
041
042        storeCommon(p, element);
043
044        if (p.getMemo() != null) {
045            element.addContent(new Element("systemConnection")
046                    .addContent(p.getMemo().getSystemPrefix()));
047        }
048
049        element.addContent(selectTopicXml.store(p.getSelectTopic(), "topic"));
050        element.addContent(selectDataXml.store(p.getSelectMessage(), "message"));
051
052        return element;
053    }
054
055    @Override
056    public boolean load(Element shared, Element perNode) throws JmriConfigureXmlException {
057        String sys = getSystemName(shared);
058        String uname = getUserName(shared);
059
060        MqttSystemConnectionMemo memo = null;
061
062        Element systemConnection = shared.getChild("systemConnection");
063        if (systemConnection != null) {
064            String systemConnectionName = systemConnection.getTextTrim();
065            List<MqttSystemConnectionMemo> systemConnections =
066                    jmri.InstanceManager.getList(MqttSystemConnectionMemo.class);
067
068            for (MqttSystemConnectionMemo m : systemConnections) {
069                if (m.getSystemPrefix().equals(systemConnectionName)) {
070                    memo = m;
071                    break;
072                }
073            }
074        }
075
076        Publish h = new Publish(sys, uname, memo);
077
078        var selectTopicXml = new LogixNG_SelectStringXml();
079        var selectDataXml = new LogixNG_SelectStringXml();
080
081        loadCommon(h, shared);
082
083        selectTopicXml.load(shared.getChild("topic"), h.getSelectTopic());
084        selectDataXml.load(shared.getChild("message"), h.getSelectMessage());
085
086        InstanceManager.getDefault(DigitalActionManager.class).registerAction(h);
087        return true;
088    }
089
090//    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PublishXml.class);
091}