001package jmri.jmrix.configurexml;
002
003import java.util.List;
004import jmri.configurexml.AbstractXmlAdapter;
005import jmri.jmrix.ConnectionConfig;
006import jmri.jmrix.PortAdapter;
007import org.jdom2.Element;
008
009/**
010 * Abstract base (and partial implementation) for classes persisting the status
011 * of connections.
012 *
013 * @author Bob Jacobsen Copyright: Copyright (c) 2003
014 */
015abstract public class AbstractConnectionConfigXml extends AbstractXmlAdapter {
016
017    public AbstractConnectionConfigXml() {
018    }
019
020    abstract protected void getInstance();
021
022    abstract protected void register();
023
024    protected void register(ConnectionConfig c) {
025        c.register();
026    }
027
028    @Override
029    public Element store(Object o, boolean shared) {
030        return this.store(o);
031    }
032
033    protected void storeCommon(Element e, PortAdapter adapter) {
034        if (adapter.getSystemConnectionMemo() != null) {
035            e.setAttribute("userName", adapter.getSystemConnectionMemo().getUserName());
036            e.setAttribute("systemPrefix", adapter.getSystemConnectionMemo().getSystemPrefix());
037        }
038        if (adapter.getManufacturer() != null) {
039            e.setAttribute("manufacturer", adapter.getManufacturer());
040        }
041
042        if (adapter.getDisabled()) {
043            e.setAttribute("disabled", "yes");
044        } else {
045            e.setAttribute("disabled", "no");
046        }
047
048        e.setAttribute("reconnectMaxInterval",String.valueOf(adapter.getReconnectMaxInterval()));
049        e.setAttribute("reconnectMaxAttempts",String.valueOf(adapter.getReconnectMaxAttempts()));
050
051        saveOptions(e, adapter);
052    }
053
054    /**
055     * Customizable method if you need to add anything more
056     *
057     * @param e Element being created, update as needed
058     */
059    protected void extendElement(Element e) {
060    }
061
062    /**
063     * Load common attributes and elements.
064     *
065     * @param shared  the shared element
066     * @param perNode the per node element
067     * @param adapter the port adapter
068     */
069    protected void loadCommon(Element shared, Element perNode, PortAdapter adapter) {
070        if (perNode.getAttribute("option1") != null) {
071            String option1Setting = perNode.getAttribute("option1").getValue();
072            adapter.configureOption1(option1Setting);
073        }
074        if (perNode.getAttribute("option2") != null) {
075            String option2Setting = perNode.getAttribute("option2").getValue();
076            adapter.configureOption2(option2Setting);
077        }
078        if (perNode.getAttribute("option3") != null) {
079            String option3Setting = perNode.getAttribute("option3").getValue();
080            adapter.configureOption3(option3Setting);
081        }
082        if (perNode.getAttribute("option4") != null) {
083            String option4Setting = perNode.getAttribute("option4").getValue();
084            adapter.configureOption4(option4Setting);
085        }
086
087        loadOptions(perNode.getChild("options"), perNode.getChild("options"), adapter);
088
089        try {
090            adapter.setManufacturer(perNode.getAttribute("manufacturer").getValue());
091        } catch (NullPointerException ex) { //Considered normal if not present
092
093        }
094
095        if (adapter.getSystemConnectionMemo() != null) {
096            if (shared.getAttribute("userName") != null) {
097                adapter.getSystemConnectionMemo().setUserName(shared.getAttribute("userName").getValue());
098            }
099
100            if (shared.getAttribute("systemPrefix") != null) {
101                adapter.getSystemConnectionMemo().setSystemPrefix(shared.getAttribute("systemPrefix").getValue());
102            }
103        }
104
105        if (shared.getAttribute("disabled") != null) {
106            String yesno = shared.getAttribute("disabled").getValue();
107            if ((yesno != null) && (!yesno.isEmpty())) {
108                if (yesno.equals("no")) {
109                    adapter.setDisabled(false);
110                } else if (yesno.equals("yes")) {
111                    adapter.setDisabled(true);
112                }
113            }
114        }
115
116        if (shared.getAttribute("reconnectMaxInterval") != null) {
117            String reconnectI = shared.getAttribute("reconnectMaxInterval").getValue();
118            if ((reconnectI!=null) && (!reconnectI.isEmpty() )) {
119                adapter.setReconnectMaxInterval(Integer.parseInt(reconnectI));
120            }
121        }
122
123        if (shared.getAttribute("reconnectMaxAttempts") != null) {
124            String reconnectA = shared.getAttribute("reconnectMaxAttempts").getValue();
125            if ((reconnectA!=null) && (!reconnectA.isEmpty() )) {
126                adapter.setReconnectMaxAttempts(Integer.parseInt(reconnectA));
127            }
128        }
129
130    }
131
132
133    /**
134     * save options
135     *
136     * @param e       the element
137     * @param adapter the port adapter
138     */
139    protected void saveOptions(Element e, PortAdapter adapter) {
140        Element element = new Element("options");
141        String[] options = adapter.getOptions();
142
143        for (String i : options) {
144            Element elem = new Element("option");
145            elem.addContent(new Element("name").addContent(i));
146            elem.addContent(new Element("value").addContent(adapter.getOptionState(i)));
147            element.addContent(elem);
148        }
149        e.addContent(element);
150    }
151
152    /**
153     * load options
154     *
155     * @param shared  the shared element
156     * @param perNode the per node element
157     * @param adapter the port adapter
158     */
159    protected void loadOptions(Element shared, Element perNode, PortAdapter adapter) {
160        if (perNode == null) {
161            return;
162        }
163        List<Element> optionList = perNode.getChildren("option");
164        for (Element so : optionList) {
165            adapter.setOptionState(so.getChild("name").getText(), so.getChild("value").getText());
166        }
167    }
168
169    /**
170     * Method to unpack additional XML structures after connection creation, but
171     * before connection is usable.
172     *
173     * @param shared  connection information common to all nodes
174     * @param perNode connection information unique to this node
175     */
176    protected void unpackElement(Element shared, Element perNode) {
177    }
178
179    /**
180     * Service routine to look through "parameter" child elements to find a
181     * particular parameter value
182     *
183     * @param e    Element containing parameters
184     * @param name name of desired parameter
185     * @return String value
186     */
187    protected String findParmValue(Element e, String name) {
188        List<Element> l = e.getChildren("parameter");
189        for (Element n : l) {
190            if (n.getAttributeValue("name").equals(name)) {
191                return n.getTextTrim();
192            }
193        }
194        return null;
195    }
196
197    /**
198     * Store the outputInterval in a connection element for persistence.
199     *
200     * @param adapter the adapter for which properties are stored
201     * @param e the "connection" element being filled
202     */
203    protected void setOutputInterval(PortAdapter adapter, Element e) {
204        if (adapter.getSystemConnectionMemo().getOutputInterval() > 0) {
205            e.setAttribute("turnoutInterval", String.valueOf(adapter.getSystemConnectionMemo().getOutputInterval()));
206        } else {
207            e.setAttribute("turnoutInterval", "0");
208        }
209    }
210
211    abstract protected void dispose();
212
213    // initialize logging
214    // private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AbstractConnectionConfigXml.class);
215
216}