001package jmri.jmrit.logix;
002
003import javax.annotation.CheckForNull;
004import javax.annotation.Nonnull;
005
006import jmri.InstanceManagerAutoDefault;
007import jmri.ProvidingManager;
008import jmri.managers.AbstractManager;
009
010/**
011 * Basic Implementation of an OBlockManager.
012 * <p>
013 * Note that this does not enforce any particular system naming convention.
014 * <p>
015 * Note this is a concrete class, there are now 2 types of Blocks (LayoutBlocks
016 * use a Block member and inheritance). Perhaps now the proxyManager
017 * strategy of interface/implementation pairs like other Managers should be
018 * implemented.
019 *
020 * @author Bob Jacobsen Copyright (C) 2006
021 * @author Pete Cressman Copyright (C) 2009
022 */
023public class OBlockManager extends AbstractManager<OBlock>
024        implements ProvidingManager<OBlock>, InstanceManagerAutoDefault {
025
026    public OBlockManager() {
027        super(new jmri.jmrix.CaptiveSystemConnectionMemo("O", "OBlocks")); // NOI18N
028    }
029
030    @Override
031    public int getXMLOrder() {
032        return jmri.Manager.OBLOCKS;
033    }
034
035    @Override
036    public char typeLetter() {
037        return 'B';
038    }
039
040    /**
041     * Create a new OBlock if it does not exist.
042     *
043     * @param systemName System name
044     * @param userName   User name
045     * @return newly created OBlock, or null if an OBlock with the same
046     * systemName or userName already exists, or if there
047     * is trouble creating a new OBlock
048     */
049    @CheckForNull
050    public OBlock createNewOBlock(@Nonnull String systemName, @CheckForNull String userName) {
051        // Check that OBlock does not already exist
052        OBlock r;
053        if (userName != null && !userName.equals("")) {
054            r = getByUserName(userName);
055            if (r != null) {
056                return null;
057            }
058        }
059        if (!isValidSystemNameFormat(systemName)) {
060            return null;
061        }
062
063        r = getBySystemName(systemName);
064        if (r != null) {
065            return null;
066        }
067        // OBlock does not exist, create a new OBlock
068        r = new OBlock(systemName, userName);
069
070        // Keep track of the last created auto system name
071        updateAutoNumber(systemName);
072
073        // save in the maps
074        register(r);
075        return r;
076    }
077
078    /**
079     * Create a new OBlock using an automatically incrementing system
080     * name.
081     *
082     * @param userName the user name for the new OBlock
083     * @return null if an OBlock with the same systemName or userName already
084     *         exists, or if there is trouble creating a new OBlock.
085     */
086    @CheckForNull
087    public OBlock createNewOBlock(@Nonnull String userName) {
088        return createNewOBlock(getAutoSystemName(), userName);
089    }
090
091
092    /**
093     * Get an existing OBlock by a given name. First looks up assuming that name
094     * is a User Name. If this fails looks up assuming that name is a System Name.
095     * If both fail, returns null.
096     *
097     * @param name OBlock name
098     * @return the OBlock, oe null if not found
099     */
100    public OBlock getOBlock(@Nonnull String name) {
101        OBlock r = getByUserName(name);
102        if (r != null) {
103            return r;
104        }
105        return getBySystemName(name);
106    }
107
108    @Override
109    public OBlock provide(@Nonnull String name) {
110        return provideOBlock(name);
111    }
112
113    @Nonnull
114    public OBlock provideOBlock(@Nonnull String name) {
115        if (name.trim().length() == 0) {
116            throw new IllegalArgumentException("No name given for OBlock");
117        }
118        OBlock ob = getByUserName(name);
119        if (ob == null) {
120            ob = getBySystemName(name);
121        }
122        if (ob == null) {
123            ob = createNewOBlock(name, null);
124            if (ob == null) {
125                throw new IllegalArgumentException("could not create OBlock \"" + name + "\"");
126            }
127        }
128        return ob;
129    }
130
131    @Override
132    @Nonnull
133    public String getBeanTypeHandled(boolean plural) {
134        return Bundle.getMessage(plural ? "BeanNameOBlocks" : "BeanNameOBlock");
135    }
136
137    /**
138     * {@inheritDoc}
139     */
140    @Override
141    public Class<OBlock> getNamedBeanClass() {
142        return OBlock.class;
143    }
144
145}