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}