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}