001package jmri.jmrit.logixng.actions.configurexml; 002 003import java.util.List; 004 005import jmri.InstanceManager; 006import jmri.jmrit.logixng.DigitalActionManager; 007import jmri.jmrit.logixng.actions.ActionListenOnBeans; 008import jmri.jmrit.logixng.actions.ActionListenOnBeans.NamedBeanReference; 009import jmri.jmrit.logixng.NamedBeanType; 010 011import org.jdom2.Element; 012 013/** 014 * Handle XML configuration for ActionLightXml objects. 015 * 016 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010 017 * @author Daniel Bergqvist Copyright (C) 2019 018 */ 019public class ActionListenOnBeansXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML { 020 021 public ActionListenOnBeansXml() { 022 } 023 024 /** 025 * Default implementation for storing the contents of a SE8cSignalHead 026 * 027 * @param o Object to store, of type TripleLightSignalHead 028 * @return Element containing the complete info 029 */ 030 @Override 031 public Element store(Object o) { 032 ActionListenOnBeans p = (ActionListenOnBeans) o; 033 034 Element element = new Element("ActionListenOnBeans"); 035 element.setAttribute("class", this.getClass().getName()); 036 element.addContent(new Element("systemName").addContent(p.getSystemName())); 037 038 storeCommon(p, element); 039 040 Element parameters = new Element("References"); 041 for (NamedBeanReference ref : p.getReferences()) { 042 Element elementParameter = new Element("Reference"); 043 if (ref.getType() == NamedBeanType.EntryExit) { 044 // Use the system name when storing an EntryExit object. 045 var nxName = ref.getHandle().getBean().getSystemName(); 046 elementParameter.addContent(new Element("name").addContent(nxName)); 047 } else { 048 elementParameter.addContent(new Element("name").addContent(ref.getName())); 049 } 050 elementParameter.addContent(new Element("type").addContent(ref.getType().name())); 051 elementParameter.addContent(new Element("all").addContent(ref.getListenOnAllProperties() ? "yes" : "no")); // NOI18N 052 parameters.addContent(elementParameter); 053 } 054 element.addContent(parameters); 055 056 element.addContent(new Element("localVariableNamedBean").addContent(p.getLocalVariableNamedBean())); 057 element.addContent(new Element("localVariableEvent").addContent(p.getLocalVariableEvent())); 058 element.addContent(new Element("localVariableNewValue").addContent(p.getLocalVariableNewValue())); 059 060 return element; 061 } 062 063 @Override 064 public boolean load(Element shared, Element perNode) { 065 String sys = getSystemName(shared); 066 String uname = getUserName(shared); 067 ActionListenOnBeans h = new ActionListenOnBeans(sys, uname); 068 069 loadCommon(h, shared); 070 071 List<Element> parameterList = shared.getChild("References").getChildren(); // NOI18N 072 log.debug("Found {} references", parameterList.size() ); // NOI18N 073 074 for (Element e : parameterList) { 075 Element elementName = e.getChild("name"); 076 077 NamedBeanType type = null; 078 Element elementType = e.getChild("type"); 079 if (elementType != null) { 080 type = NamedBeanType.valueOf(elementType.getTextTrim()); 081 } 082 083 if (elementName == null) throw new IllegalArgumentException("Element 'name' does not exists"); 084 if (type == null) throw new IllegalArgumentException("Element 'type' does not exists"); 085 086 String all = "no"; // NOI18N 087 if (e.getChild("all") != null) { // NOI18N 088 all = e.getChild("all").getValue(); // NOI18N 089 } 090 boolean listenToAll = "yes".equals(all); // NOI18N 091 092 h.addReference(new NamedBeanReference(elementName.getTextTrim(), type, listenToAll)); 093 } 094 095 Element variableName = shared.getChild("localVariableNamedBean"); 096 if (variableName != null) { 097 h.setLocalVariableNamedBean(variableName.getTextTrim()); 098 } 099 100 variableName = shared.getChild("localVariableEvent"); 101 if (variableName != null) { 102 h.setLocalVariableEvent(variableName.getTextTrim()); 103 } 104 105 variableName = shared.getChild("localVariableNewValue"); 106 if (variableName != null) { 107 h.setLocalVariableNewValue(variableName.getTextTrim()); 108 } 109 110 InstanceManager.getDefault(DigitalActionManager.class).registerAction(h); 111 return true; 112 } 113 114 private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionListenOnBeansXml.class); 115}