001package jmri.jmrit.logixng.implementation.configurexml;
002
003import java.util.List;
004
005import jmri.InstanceManager;
006import jmri.jmrit.logixng.*;
007import jmri.jmrit.logixng.Module.Parameter;
008import jmri.jmrit.logixng.ModuleManager;
009import jmri.jmrit.logixng.implementation.DefaultModule;
010
011import org.jdom2.Element;
012
013/**
014 * Handle XML configuration for DefaultModule objects.
015 *
016 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010
017 * @author Daniel Bergqvist Copyright (C) 2020
018 */
019public class DefaultModuleXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML {
020
021    public DefaultModuleXml() {
022    }
023
024    /**
025     * Default implementation for storing the contents of a DefaultModule
026     *
027     * @param o Object to store, of type DefaultModule
028     * @return Element containing the complete info
029     */
030    @Override
031    public Element store(Object o) {
032        DefaultModule p = (DefaultModule) o;
033
034        // Don't store the module if it's empty and if "store if empty" is false.
035        if (!p.isStoreIfEmpty() && !p.getRootSocket().isConnected()) {
036            return null;
037        }
038
039        Element element = new Element("Module");
040        element.setAttribute("class", this.getClass().getName());
041        element.addContent(new Element("systemName").addContent(p.getSystemName()));
042
043        storeCommon(p, element);
044
045        element.addContent(new Element("rootSocketType").addContent(p.getRootSocketType().getName()));
046
047        if (!p.isVisible()) {
048            element.addContent(new Element("isVisible").addContent(p.isVisible() ? "yes" : "no"));
049        }
050
051        if (!p.isStoreIfEmpty()) {
052            element.addContent(new Element("storeIfEmpty").addContent(p.isStoreIfEmpty() ? "yes" : "no"));
053        }
054
055        Element elementParameters = new Element("Parameters");
056        for (Parameter data : p.getParameters()) {
057            Element elementParameter = new Element("Parameter");
058            elementParameter.addContent(new Element("name").addContent(data.getName()));
059            elementParameter.addContent(new Element("isInput").addContent(data.isInput() ? "yes" : "no"));
060            elementParameter.addContent(new Element("isOutput").addContent(data.isOutput() ? "yes" : "no"));
061            elementParameters.addContent(elementParameter);
062        }
063        element.addContent(elementParameters);
064
065        Element e2 = new Element("RootSocket");
066        e2.addContent(new Element("socketName").addContent(p.getChild(0).getName()));
067        MaleSocket socket = p.getRootSocket().getConnectedSocket();
068        String socketSystemName;
069        if (socket != null) {
070            socketSystemName = socket.getSystemName();
071        } else {
072            socketSystemName = p.getSocketSystemName();
073        }
074        if (socketSystemName != null) {
075            e2.addContent(new Element("systemName").addContent(socketSystemName));
076        }
077        element.addContent(e2);
078
079        return element;
080    }
081
082    @Override
083    public boolean load(Element shared, Element perNode) {
084        String sys = getSystemName(shared);
085        String uname = getUserName(shared);
086
087        String rootSocketTypeName = shared.getChild("rootSocketType").getTextTrim();
088
089        FemaleSocketManager.SocketType socketType =
090                InstanceManager.getDefault(FemaleSocketManager.class)
091                        .getSocketTypeByType(rootSocketTypeName);
092
093        DefaultModule h = (DefaultModule) InstanceManager.getDefault(ModuleManager.class)
094                .createModule(sys, uname, socketType);
095
096        // The error handling module might already exist. If so, get the existing module.
097        if (h == null && LogixNG_Manager.ERROR_HANDLING_MODULE_NAME.equals(sys)) {
098            h = (DefaultModule) InstanceManager.getDefault(ModuleManager.class).getBySystemName(sys);
099        }
100
101        if (h == null) {
102            log.error("Module {} cannot be loaded", sys);
103            return false;
104        }
105
106        loadCommon(h, shared);
107
108        List<Element> parameterList = shared.getChild("Parameters").getChildren();  // NOI18N
109        log.debug("Found {} parameters", parameterList.size() );  // NOI18N
110
111        for (Element e : parameterList) {
112            Element elementName = e.getChild("name");
113
114            boolean isInput = "yes".equals(e.getChild("isInput").getTextTrim());
115            boolean isOutput = "yes".equals(e.getChild("isOutput").getTextTrim());
116
117            h.addParameter(elementName.getTextTrim(), isInput, isOutput);
118        }
119
120        Element socketName = shared.getChild("RootSocket").getChild("socketName");
121        h.getChild(0).setName(socketName.getTextTrim());
122        Element socketSystemName = shared.getChild("RootSocket").getChild("systemName");
123        if (socketSystemName != null) {
124            h.setSocketSystemName(socketSystemName.getTextTrim());
125        }
126
127        Element isVisibleElement = shared.getChild("isVisible");
128        if (isVisibleElement != null) {
129            h.setVisible("yes".equals(isVisibleElement.getTextTrim()));
130        }
131
132        Element storeIfEmptyElement = shared.getChild("storeIfEmpty");
133        if (storeIfEmptyElement != null) {
134            h.setStoreIfEmpty("yes".equals(storeIfEmptyElement.getTextTrim()));
135        }
136
137        return true;
138    }
139
140    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DefaultModuleXml.class);
141}