001package jmri.jmrit.logixng.actions.configurexml;
002
003import java.util.List;
004
005import jmri.InstanceManager;
006import jmri.SystemConnectionMemo;
007import jmri.configurexml.JmriConfigureXmlException;
008import jmri.jmrit.logixng.*;
009import jmri.jmrit.logixng.actions.ProgramOnMain;
010import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectComboBoxXml;
011import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectIntegerXml;
012
013import org.jdom2.Element;
014
015/**
016 * Handle XML configuration for ActionLightXml objects.
017 *
018 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010
019 * @author Daniel Bergqvist Copyright (C) 2024
020 */
021public class ProgramOnMainXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML {
022
023    /**
024     * Default implementation for storing the contents of a SE8cSignalHead
025     *
026     * @param o Object to store, of type TripleTurnoutSignalHead
027     * @return Element containing the complete info
028     */
029    @Override
030    public Element store(Object o) {
031        ProgramOnMain p = (ProgramOnMain) o;
032
033        var selectProgrammingModeXml = new LogixNG_SelectComboBoxXml();
034        var selectAddressXml = new LogixNG_SelectIntegerXml();
035        var selectCVXml = new LogixNG_SelectIntegerXml();
036        var selectValueXml = new LogixNG_SelectIntegerXml();
037
038        Element element = new Element("ProgramOnMain");
039        element.setAttribute("class", this.getClass().getName());
040        element.addContent(new Element("systemName").addContent(p.getSystemName()));
041
042        storeCommon(p, element);
043
044        Element e2 = new Element("Socket");
045        e2.addContent(new Element("socketName").addContent(p.getExecuteSocket().getName()));
046        MaleSocket socket = p.getExecuteSocket().getConnectedSocket();
047        String socketSystemName;
048        if (socket != null) {
049            socketSystemName = socket.getSystemName();
050        } else {
051            socketSystemName = p.getExecuteSocketSystemName();
052        }
053        if (socketSystemName != null) {
054            e2.addContent(new Element("systemName").addContent(socketSystemName));
055        }
056        element.addContent(e2);
057
058        element.addContent(selectProgrammingModeXml.store(
059                p.getSelectProgrammingMode(), "programmingMode"));
060        element.addContent(selectAddressXml.store(p.getSelectAddress(), "address"));
061        element.addContent(selectCVXml.store(p.getSelectCV(), "cv"));
062        element.addContent(selectValueXml.store(p.getSelectValue(), "value"));
063
064        if (p.getMemo() != null) {
065            element.addContent(new Element("systemConnection")
066                    .addContent(p.getMemo().getSystemPrefix()));
067        }
068
069        element.addContent(new Element("localVariableForStatus").addContent(p.getLocalVariableForStatus()));
070
071        return element;
072    }
073
074    @Override
075    public boolean load(Element shared, Element perNode) throws JmriConfigureXmlException {
076
077        String sys = getSystemName(shared);
078        String uname = getUserName(shared);
079        ProgramOnMain h = new ProgramOnMain(sys, uname);
080
081        var selectProgrammingModeXml = new LogixNG_SelectComboBoxXml();
082        var selectAddressXml = new LogixNG_SelectIntegerXml();
083        var selectCVXml = new LogixNG_SelectIntegerXml();
084        var selectValueXml = new LogixNG_SelectIntegerXml();
085
086        loadCommon(h, shared);
087
088        Element executeSocket = shared.getChild("Socket");
089        if ((executeSocket == null) && (shared.getChild("Socket") != null)) {
090            executeSocket = shared.getChild("Socket");
091        }
092        if (executeSocket != null) {
093            Element socketNameElement = executeSocket.getChild("socketName");
094            String socketName = socketNameElement.getTextTrim();
095            Element socketSystemNameElement = executeSocket.getChild("systemName");
096            String socketSystemName = null;
097            if (socketSystemNameElement != null) {
098                socketSystemName = socketSystemNameElement.getTextTrim();
099            }
100
101            h.getExecuteSocket().setName(socketName);
102            h.setExecuteSocketSystemName(socketSystemName);
103        }
104
105        selectProgrammingModeXml.load(shared.getChild("programmingMode"), h.getSelectProgrammingMode());
106        selectAddressXml.load(shared.getChild("address"), h.getSelectAddress());
107        selectCVXml.load(shared.getChild("cv"), h.getSelectCV());
108        selectValueXml.load(shared.getChild("value"), h.getSelectValue());
109
110        Element systemConnection = shared.getChild("systemConnection");
111        if (systemConnection != null) {
112            String systemConnectionName = systemConnection.getTextTrim();
113            List<SystemConnectionMemo> systemConnections =
114                    jmri.InstanceManager.getList(SystemConnectionMemo.class);
115
116            for (SystemConnectionMemo memo : systemConnections) {
117                if (memo.getSystemPrefix().equals(systemConnectionName)) {
118                    h.setMemo(memo);
119                    break;
120                }
121            }
122        }
123
124        Element elem = shared.getChild("localVariableForStatus");  // NOI18N
125        h.setLocalVariableForStatus((elem != null) ? elem.getValue() : "");
126
127        InstanceManager.getDefault(DigitalActionManager.class).registerAction(h);
128        return true;
129    }
130
131//    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ProgramOnMainXml.class);
132}