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}