001package jmri.jmrix.configurexml;
002
003import jmri.jmrix.AbstractStreamPortController;
004import org.jdom2.Element;
005import org.slf4j.Logger;
006import org.slf4j.LoggerFactory;
007
008/**
009 * Abstract base (and partial implementation) for classes persisting the status
010 * of (non-serial) Stream Port adapters.
011 *
012 * @author Bob Jacobsen Copyright: Copyright (c) 2003
013 * @author George Warner Copyright: Copyright (c) 2017
014 */
015abstract public class AbstractStreamConnectionConfigXml extends AbstractConnectionConfigXml {
016
017    /**
018     * constructor
019     */
020    public AbstractStreamConnectionConfigXml() {
021    }
022
023    protected AbstractStreamPortController adapter;
024
025    /**
026     * set the stream port adapter
027     *
028     * @param streamPortAdapter the stream port adapter to set
029     */
030    protected void setAdapter(AbstractStreamPortController streamPortAdapter) {
031        log.debug("setAdapter({})", streamPortAdapter);
032        adapter = streamPortAdapter;
033    }
034
035    /**
036     * get the stream port adapter
037     *
038     * @return the stream port adapter
039     */
040    protected AbstractStreamPortController getAdapter() {
041        log.debug("getAdapter()");
042        return adapter;
043    }
044
045    /**
046     * get the stream adapter
047     *
048     * @return the stream port adapter
049     */
050    public AbstractStreamPortController getStreamAdapter() {
051        log.debug("getStreamAdapter()");
052        return adapter;
053    }
054
055    /**
056     * get instance
057     *
058     * @param object to get the instance of
059     */
060    protected abstract void getInstance(Object object);
061
062    /**
063     * {@inheritDoc}
064     */
065    @Override
066    public Element store(Object object) {
067        log.debug("store({})", object);
068        getInstance(object);
069        Element e = new Element("connection");
070
071        if (adapter == null) {
072            log.warn("No adapter found while saving stream port configuration {}", object.toString());
073            return null;
074        }
075
076        // many of the following are required by the DTD; failing to include
077        // them makes the XML file unreadable, but at least the next
078        // invocation of the program can then continue.
079        storeCommon(e, adapter);
080
081        e.setAttribute("class", this.getClass().getName());
082
083        extendElement(e);
084
085        return e;
086    }
087
088    /**
089     * {@inheritDoc}
090     */
091    @Override
092    protected void extendElement(Element e) {
093        log.debug("extendElement({})", e);
094    }
095
096    /**
097     * load from xml elements
098     *
099     * @param shared  element
100     * @param perNode element
101     * @return boolean true if successful
102     */
103    @Override
104    public boolean load(Element shared, Element perNode) {
105        log.debug("load({}, {})", shared, perNode);
106        boolean result = true;  // assume success (optimist!)
107
108        getInstance();
109
110        loadCommon(shared, perNode, adapter);
111
112        // register, so can be picked up next time
113        register();
114
115        // once all the configure processing has happened, do any
116        // extra config
117        unpackElement(shared, perNode);
118        return result;
119    }
120
121    /**
122     * Update static data from XML file
123     *
124     * @param element Top level Element to unpack.
125     */
126    @Override
127    public void load(Element element, Object o) {
128        log.debug("load({}, {})", element, o);
129
130        getInstance(o);
131
132        loadCommon(element, element, adapter);
133
134        // register, so can be picked up next time
135        register();
136
137        // once all the configure processing has happened, do any
138        // extra config
139        unpackElement(element, element);
140    }
141
142    // initialize logging
143    private static final Logger log
144            = LoggerFactory.getLogger(AbstractStreamConnectionConfigXml.class);
145}