001package jmri.jmrit.logixng.expressions.configurexml;
002
003import jmri.*;
004import jmri.configurexml.JmriConfigureXmlException;
005import jmri.jmrit.entryexit.DestinationPoints;
006import jmri.jmrit.logixng.*;
007import jmri.jmrit.logixng.expressions.ExpressionEntryExit;
008import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectNamedBeanXml;
009import jmri.jmrit.logixng.util.parser.ParserException;
010
011import org.jdom2.Element;
012
013/**
014 * Handle XML configuration for ExpressionLightXml objects.
015 *
016 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010
017 * @author Daniel Bergqvist Copyright (C) 2019
018 */
019public class ExpressionEntryExitXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML {
020
021    public ExpressionEntryExitXml() {
022    }
023
024    /**
025     * Default implementation for storing the contents of a SE8cSignalHead
026     *
027     * @param o Object to store, of type TripleEntryExitSignalHead
028     * @return Element containing the complete info
029     */
030    @Override
031    public Element store(Object o) {
032        ExpressionEntryExit p = (ExpressionEntryExit) o;
033
034        Element element = new Element("ExpressionEntryExit");
035        element.setAttribute("class", this.getClass().getName());
036        element.addContent(new Element("systemName").addContent(p.getSystemName()));
037
038        storeCommon(p, element);
039
040        var selectNamedBeanXml = new LogixNG_SelectNamedBeanXml<DestinationPoints>();
041        element.addContent(selectNamedBeanXml.store(
042                p.getSelectNamedBean(),
043                "namedBean",
044                (handle) -> handle.getBean() != null ? handle.getBean().getSystemName() : null));
045
046        element.addContent(new Element("is_isNot").addContent(p.get_Is_IsNot().name()));
047
048        element.addContent(new Element("stateAddressing").addContent(p.getStateAddressing().name()));
049        element.addContent(new Element("entryExitState").addContent(p.getBeanState().name()));
050        element.addContent(new Element("stateReference").addContent(p.getStateReference()));
051        element.addContent(new Element("stateLocalVariable").addContent(p.getStateLocalVariable()));
052        element.addContent(new Element("stateFormula").addContent(p.getStateFormula()));
053
054        return element;
055    }
056
057    @Override
058    public boolean load(Element shared, Element perNode) throws JmriConfigureXmlException {
059        String sys = getSystemName(shared);
060        String uname = getUserName(shared);
061        ExpressionEntryExit h = new ExpressionEntryExit(sys, uname);
062
063        loadCommon(h, shared);
064
065        var selectNamedBeanXml = new LogixNG_SelectNamedBeanXml<DestinationPoints>();
066        selectNamedBeanXml.load(shared.getChild("namedBean"), h.getSelectNamedBean(), true);
067        selectNamedBeanXml.loadLegacy(shared, h.getSelectNamedBean(), "destinationPoints");
068
069        Element is_IsNot = shared.getChild("is_isNot");
070        if (is_IsNot != null) {
071            h.set_Is_IsNot(Is_IsNot_Enum.valueOf(is_IsNot.getTextTrim()));
072        }
073
074        try {
075            Element elem = shared.getChild("stateAddressing");
076            if (elem != null) {
077                h.setStateAddressing(NamedBeanAddressing.valueOf(elem.getTextTrim()));
078            }
079
080            Element entryExitState = shared.getChild("entryExitState");
081            if (entryExitState != null) {
082                h.setBeanState(ExpressionEntryExit.EntryExitState.valueOf(entryExitState.getTextTrim()));
083            }
084
085            elem = shared.getChild("stateReference");
086            if (elem != null) h.setStateReference(elem.getTextTrim());
087
088            elem = shared.getChild("stateLocalVariable");
089            if (elem != null) h.setStateLocalVariable(elem.getTextTrim());
090
091            elem = shared.getChild("stateFormula");
092            if (elem != null) h.setStateFormula(elem.getTextTrim());
093
094        } catch (ParserException e) {
095            throw new JmriConfigureXmlException(e);
096        }
097
098        InstanceManager.getDefault(DigitalExpressionManager.class).registerExpression(h);
099        return true;
100    }
101
102//    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ExpressionEntryExitXml.class);
103}