001package jmri.jmrit.logixng.actions.configurexml;
002
003import org.jdom2.Element;
004
005import jmri.InstanceManager;
006import jmri.Memory;
007import jmri.configurexml.JmriConfigureXmlException;
008import jmri.jmrit.logixng.DigitalActionManager;
009import jmri.jmrit.logixng.MaleSocket;
010import jmri.jmrit.logixng.actions.ForEachWithDelay;
011import jmri.jmrit.logixng.actions.CommonManager;
012import jmri.jmrit.logixng.actions.ForEachWithDelay.UserSpecifiedSource;
013import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectNamedBeanXml;
014import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectStringXml;
015import jmri.jmrit.logixng.util.parser.ParserException;
016import jmri.util.TimerUnit;
017
018/**
019 * Handle XML configuration for ForEachWithDelay objects.
020 *
021 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010
022 * @author Daniel Bergqvist Copyright (C) 2025
023 */
024public class ForEachWithDelayXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML {
025
026    public ForEachWithDelayXml() {
027    }
028
029    /**
030     * Default implementation for storing the contents of a SE8cSignalHead
031     *
032     * @param o Object to store, of type TripleTurnoutSignalHead
033     * @return Element containing the complete info
034     */
035    @Override
036    public Element store(Object o) {
037        ForEachWithDelay p = (ForEachWithDelay) o;
038
039        Element element = new Element("ForEachWithDelay");
040        element.setAttribute("class", this.getClass().getName());
041        element.addContent(new Element("systemName").addContent(p.getSystemName()));
042
043        storeCommon(p, element);
044
045        var selectVariableXml = new LogixNG_SelectStringXml();
046        var selectMemoryNamedBeanXml = new LogixNG_SelectNamedBeanXml<Memory>();
047
048        element.addContent(new Element("useCommonSource").addContent(p.isUseCommonSource()? "yes" : "no"));
049        element.addContent(new Element("commonManager").addContent(p.getCommonManager().name()));   // NOI18N
050
051        element.addContent(new Element("operation").addContent(p.getUserSpecifiedSource().name()));   // NOI18N
052
053        element.addContent(selectVariableXml.store(p.getSelectVariable(), "otherVariable"));
054
055        element.addContent(selectMemoryNamedBeanXml.store(p.getSelectMemoryNamedBean(), "memoryNamedBean"));
056
057        element.addContent(new Element("formula").addContent(p.getFormula()));  // NOI18N
058
059        element.addContent(new Element("delay").addContent(Integer.toString(p.getDelay())));
060        element.addContent(new Element("unit").addContent(p.getUnit().name()));
061
062        element.addContent(new Element("localVariable").addContent(p.getLocalVariableName()));
063
064        element.addContent(new Element("resetIfAlreadyStarted").addContent(p.getResetIfAlreadyStarted() ? "yes" : "no"));  // NOI18N
065        element.addContent(new Element("useIndividualTimers").addContent(p.getUseIndividualTimers() ? "yes" : "no"));  // NOI18N
066
067        Element e2 = new Element("Socket");
068        e2.addContent(new Element("socketName").addContent(p.getChild(0).getName()));
069        MaleSocket socket = p.getSocket().getConnectedSocket();
070        String socketSystemName;
071        if (socket != null) {
072            socketSystemName = socket.getSystemName();
073        } else {
074            socketSystemName = p.getSocketSystemName();
075        }
076        if (socketSystemName != null) {
077            e2.addContent(new Element("systemName").addContent(socketSystemName));
078        }
079        element.addContent(e2);
080
081        return element;
082    }
083
084    @Override
085    public boolean load(Element shared, Element perNode) throws JmriConfigureXmlException {
086
087        String sys = getSystemName(shared);
088        String uname = getUserName(shared);
089        ForEachWithDelay h = new ForEachWithDelay(sys, uname);
090
091        loadCommon(h, shared);
092
093        var selectVariableXml = new LogixNG_SelectStringXml();
094        var selectMemoryNamedBeanXml = new LogixNG_SelectNamedBeanXml<Memory>();
095
096        Element useCommonSourceElem = shared.getChild("useCommonSource");
097        if (useCommonSourceElem != null) {
098            h.setUseCommonSource("yes".equals(useCommonSourceElem.getTextTrim()));
099        }
100
101        Element commonManagerType = shared.getChild("commonManager");   // NOI18N
102        if (commonManagerType != null) {
103            try {
104                h.setCommonManager(CommonManager.valueOf(commonManagerType.getTextTrim()));
105            } catch (ParserException e) {
106                log.error("cannot set variable operation: {}", commonManagerType.getTextTrim(), e);  // NOI18N
107            }
108        }
109
110        Element operationType = shared.getChild("operation");   // NOI18N
111        if (operationType != null) {
112            try {
113                h.setUserSpecifiedSource(UserSpecifiedSource.valueOf(operationType.getTextTrim()));
114            } catch (ParserException e) {
115                log.error("cannot set variable operation: {}", operationType.getTextTrim(), e);  // NOI18N
116            }
117        }
118
119        selectVariableXml.load(shared.getChild("otherVariable"), h.getSelectVariable());
120
121        selectMemoryNamedBeanXml.load(shared.getChild("memoryNamedBean"), h.getSelectMemoryNamedBean());
122
123        Element formula = shared.getChild("formula");   // NOI18N
124        if (formula != null) {
125            try {
126                h.setFormula(formula.getTextTrim());
127            } catch (ParserException e) {
128                log.error("cannot set data: {}", formula.getTextTrim(), e);  // NOI18N
129            }
130        }
131
132        Element delayElement = shared.getChild("delay");
133        if (delayElement != null) {
134            h.setDelay(Integer.parseInt(delayElement.getText()));
135        }
136
137        Element unit = shared.getChild("unit");
138        if (unit != null) {
139            h.setUnit(TimerUnit.valueOf(unit.getTextTrim()));
140        }
141
142        Element localVariable = shared.getChild("localVariable");
143        if (localVariable != null) {
144            h.setLocalVariableName(localVariable.getTextTrim());
145        }
146
147        String resetIfAlreadyStarted = "no";
148        if (shared.getChild("resetIfAlreadyStarted") != null) {  // NOI18N
149            resetIfAlreadyStarted = shared.getChild("resetIfAlreadyStarted").getTextTrim();  // NOI18N
150        }
151        h.setResetIfAlreadyStarted("yes".equals(resetIfAlreadyStarted));
152
153        String useIndividualTimers = "no";
154        if (shared.getChild("useIndividualTimers") != null) {  // NOI18N
155            useIndividualTimers = shared.getChild("useIndividualTimers").getTextTrim();  // NOI18N
156        }
157        h.setUseIndividualTimers("yes".equals(useIndividualTimers));
158
159        Element socketName = shared.getChild("Socket").getChild("socketName");
160        h.getChild(0).setName(socketName.getTextTrim());
161        Element socketSystemName = shared.getChild("Socket").getChild("systemName");
162        if (socketSystemName != null) {
163            h.setSocketSystemName(socketSystemName.getTextTrim());
164        }
165
166        InstanceManager.getDefault(DigitalActionManager.class).registerAction(h);
167        return true;
168    }
169
170    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ForEachWithDelayXml.class);
171}