001package jmri.jmrit.logixng.implementation.configurexml;
002
003import java.util.List;
004
005import jmri.jmrit.logixng.*;
006import jmri.jmrit.logixng.SymbolTable.InitialValueType;
007import jmri.jmrit.logixng.configurexml.MaleSocketXml;
008
009import org.jdom2.Element;
010
011import jmri.jmrit.logixng.implementation.AbstractMaleSocket;
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 AbstractMaleSocketXml
020        extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML
021        implements MaleSocketXml {
022
023    public AbstractMaleSocketXml() {
024    }
025    
026    /**
027     * Default implementation for storing the contents of a ActionMany
028     *
029     * @param o Object to store, of type ActionMany
030     * @return Element containing the complete info
031     */
032    @Override
033    public Element store(Object o) {
034        AbstractMaleSocket maleSocket = (AbstractMaleSocket) o;
035        
036        Element element = new Element("AbstractMaleSocket");                     // NOI18N
037        element.setAttribute("enabled", maleSocket.isEnabled() ? "yes" : "no");  // NOI18N
038        element.setAttribute("locked", maleSocket.isLocked() ? "yes" : "no");    // NOI18N
039        element.setAttribute("system", maleSocket.isSystem() ? "yes" : "no");    // NOI18N
040        element.setAttribute("catchAbortExecution", maleSocket.getCatchAbortExecution()? "yes" : "no");  // NOI18N
041        element.setAttribute("class", this.getClass().getName());
042        
043        // Only store error handling type of the inner most socket
044        if (!(maleSocket.getObject() instanceof MaleSocket)) {
045            element.addContent(new Element("errorHandling").addContent(maleSocket.getErrorHandlingType().name()));  // NOI18N
046        }
047        
048        for (SymbolTable.VariableData data : maleSocket.getLocalVariables()) {
049            Element elementVariable = new Element("LocalVariable");                                     // NOI18N
050            elementVariable.addContent(new Element("name").addContent(data._name));                     // NOI18N
051            elementVariable.addContent(new Element("type").addContent(data._initialValueType.name()));   // NOI18N
052            elementVariable.addContent(new Element("data").addContent(data._initialValueData));         // NOI18N
053            element.addContent(elementVariable);
054        }
055        
056        return element;
057    }
058    
059    @Override
060    public boolean load(Element shared, Element perNode) {
061        return false;
062    }
063    
064    @Override
065    public boolean load(Element maleSocketElement, MaleSocket maleSocket) {
066        if (!(maleSocket instanceof AbstractMaleSocket)) {
067            throw new IllegalArgumentException("maleSocket is not an AbstractMaleSocket: "+maleSocket.getClass().getName());
068        }
069        
070        String enabled = "yes";     // NOI18N
071        if (maleSocketElement.getAttribute("enabled") != null) {  // NOI18N
072            enabled = maleSocketElement.getAttribute("enabled").getValue();  // NOI18N
073        }
074        ((AbstractMaleSocket)maleSocket).setEnabledFlag("yes".equals(enabled)); // NOI18N
075        
076        String locked = "no";       // NOI18N
077        if (maleSocketElement.getAttribute("locked") != null) {  // NOI18N
078            locked = maleSocketElement.getAttribute("locked").getValue();   // NOI18N
079        }
080        ((AbstractMaleSocket)maleSocket).setLocked("yes".equals(locked));   // NOI18N
081        
082        String system = "no";       // NOI18N
083        if (maleSocketElement.getAttribute("system") != null) {  // NOI18N
084            system = maleSocketElement.getAttribute("system").getValue();   // NOI18N
085        }
086        ((AbstractMaleSocket)maleSocket).setSystem("yes".equals(system));   // NOI18N
087        
088        String catchAbortExecution = "no";      // NOI18N
089        if (maleSocketElement.getAttribute("catchAbortExecution") != null) {  // NOI18N
090            catchAbortExecution = maleSocketElement.getAttribute("catchAbortExecution").getValue();  // NOI18N
091        }
092        ((AbstractMaleSocket)maleSocket).setCatchAbortExecution("yes".equals(catchAbortExecution));  // NOI18N
093        
094        Element errorHandlingElement = maleSocketElement.getChild("errorHandling");     // NOI18N
095        if (errorHandlingElement != null) {
096            maleSocket.setErrorHandlingType(MaleSocket.ErrorHandlingType
097                    .valueOf(errorHandlingElement.getTextTrim()));
098        }
099        
100        List<Element> localVariableList = maleSocketElement.getChildren("LocalVariable");  // NOI18N
101        log.debug("Found {} male sockets", localVariableList.size() );  // NOI18N
102        
103        for (Element e : localVariableList) {
104            Element elementName = e.getChild("name");   // NOI18N
105            
106            InitialValueType type = null;
107            Element elementType = e.getChild("type");   // NOI18N
108            if (elementType != null) {
109                type = InitialValueType.valueOf(elementType.getTextTrim());
110            }
111            
112            Element elementData = e.getChild("data");   // NOI18N
113            
114            if (elementName == null) throw new IllegalArgumentException("Element 'name' does not exists");  // NOI18N
115            if (type == null) throw new IllegalArgumentException("Element 'type' does not exists");         // NOI18N
116            if (elementData == null) throw new IllegalArgumentException("Element 'data' does not exists");  // NOI18N
117            
118            maleSocket.addLocalVariable(elementName.getTextTrim(), type, elementData.getTextTrim());
119        }
120        
121        return true;
122    }
123    
124    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AbstractMaleSocketXml.class);
125}