001package jmri.managers;
002
003import javax.annotation.CheckForNull;
004import javax.annotation.Nonnull;
005import jmri.IdTag;
006import jmri.InstanceManager;
007import jmri.RailCom;
008import jmri.RailComManager;
009import jmri.implementation.DefaultRailCom;
010import jmri.managers.configurexml.DefaultIdTagManagerXml;
011import org.slf4j.Logger;
012import org.slf4j.LoggerFactory;
013
014/**
015 * Concrete implementation for the Internal {@link jmri.RailComManager}
016 * interface.
017 *
018 * @author Kevin Dickerson Copyright (C) 2012
019 * @since 2.99.4
020 */
021public class DefaultRailComManager extends DefaultIdTagManager
022        implements RailComManager {
023
024    public DefaultRailComManager() {
025        super(new jmri.jmrix.CaptiveSystemConnectionMemo("R", "RailCom")); // NOI18N
026        setInstances();
027    }
028
029    final void setInstances() {
030        InstanceManager.store(this, RailComManager.class);
031        InstanceManager.setIdTagManager(this);
032    }
033
034    @Override
035    protected RailCom createNewIdTag(@Nonnull String systemName, String userName) {
036        // we've decided to enforce that IdTag system
037        // names start with RD by prepending if not present
038        if (!systemName.startsWith(getSystemPrefix() + "D")) {
039            systemName = getSystemPrefix() + "D" + systemName;
040        }
041        return new DefaultRailCom(systemName, userName);
042    }
043
044    private void checkSystemName(@Nonnull String systemName, @CheckForNull String userName) {
045        if (systemName == null) {
046            log.error("SystemName cannot be null. UserName was {}",
047                    (userName == null ? "null" : userName));
048            throw new IllegalArgumentException("SystemName cannot be null. UserName was "
049                    + ((userName == null) ? "null" : userName));
050        }
051    }
052
053    /**
054     * Provide by userName, then SystemName, else create new.
055     * {@inheritDoc}
056     */
057    @Override
058    @Nonnull
059    public IdTag newIdTag(@Nonnull String systemName, @CheckForNull String userName) throws IllegalArgumentException {
060        log.debug("new IdTag: {};{}", systemName, (userName == null ? "null" : userName));
061        checkSystemName(systemName, userName);
062
063        // return existing if there is one
064        RailCom s;
065        if ((userName != null) && ((s = (RailCom)getByUserName(userName)) != null)) {
066            if (getBySystemName(systemName) != s) {
067                log.error("inconsistent user ({}) and system name ({}) results; userName related to ({})",
068                        userName, systemName, s.getSystemName());
069            }
070            return s;
071        }
072        if ((s = (RailCom) getBySystemName(systemName)) != null) {
073            if ((s.getUserName() == null) && (userName != null)) {
074                s.setUserName(userName);
075            } else if (userName != null) {
076                log.warn("Found IdTag via system name ({}) with non-null user name ({})", systemName, userName);
077            }
078            return s;
079        }
080
081        // doesn't exist, make a new one
082        s = createNewIdTag(systemName, userName);
083        // save in the maps
084        register(s);
085
086        // if that failed, blame it on the input arguments
087        if (s == null) {
088            throw new IllegalArgumentException();
089        }
090
091        return s;
092    }
093
094    @Override
095    public void writeIdTagDetails() throws java.io.IOException {
096        if (this.dirty) {
097            new DefaultIdTagManagerXml(this,"RailComIdTags.xml").store();  // NOI18N
098            this.dirty = false;
099            log.debug("...done writing IdTag details");
100        }
101    }
102
103    @Override
104    public void readIdTagDetails() {
105        log.debug("reading idTag Details");
106        new DefaultIdTagManagerXml(this,"RailComIdTags.xml").load();  // NOI18N
107        this.dirty = false;
108        log.debug("...done reading IdTag details");
109    }
110
111    private static final Logger log = LoggerFactory.getLogger(DefaultRailComManager.class);
112
113}