001package jmri.jmrit.logixng.actions;
002
003import jmri.*;
004import jmri.jmrit.entryexit.DestinationPoints;
005import jmri.jmrit.entryexit.EntryExitPairs;
006import jmri.jmrit.logix.OBlock;
007import jmri.jmrit.logix.OBlockManager;
008import jmri.jmrit.logix.Warrant;
009import jmri.jmrit.logix.WarrantManager;
010import jmri.jmrit.logixng.GlobalVariable;
011import jmri.jmrit.logixng.GlobalVariableManager;
012
013/**
014 * Defines types of NamedBeans, for example Turnout and Light.
015 *
016 * @author Daniel Bergqvist Copyright 2019
017 */
018public enum NamedBeanType {
019
020    Block(
021            Bundle.getMessage("BeanNameBlock"),
022            Bundle.getMessage("BeanNameBlocks"),
023            Block.class,
024            null,
025            () -> InstanceManager.getDefault(BlockManager.class),
026            InstanceManager.getDefault(BlockManager.class)::createNewBlock,
027            (NamedBean bean, String property) -> {
028                if (!(bean instanceof Block)) throw new IllegalArgumentException("bean is not a Block");
029                InstanceManager.getDefault(BlockManager.class).deleteBean((Block)bean, property);
030            }),
031
032    GlobalVariable(
033            Bundle.getMessage("BeanNameGlobalVariable"),
034            Bundle.getMessage("BeanNameGlobalVariables"),
035            GlobalVariable.class,
036            "value",
037            () -> InstanceManager.getDefault(GlobalVariableManager.class),
038            InstanceManager.getDefault(GlobalVariableManager.class)::createGlobalVariable,
039            (NamedBean bean, String property) -> {
040                if (!(bean instanceof GlobalVariable)) throw new IllegalArgumentException("bean is not a GlobalVariable");
041                InstanceManager.getDefault(GlobalVariableManager.class).deleteBean((GlobalVariable)bean, property);
042            }),
043
044    EntryExit(
045            Bundle.getMessage("BeanNameEntryExit"),
046            Bundle.getMessage("BeanNameEntryExits"),
047            DestinationPoints.class,
048            "active",
049            () -> InstanceManager.getDefault(EntryExitPairs.class),
050            null,
051            (NamedBean bean, String property) -> {
052                if (!(bean instanceof DestinationPoints)) throw new IllegalArgumentException("bean is not a DestinationPoints");
053                InstanceManager.getDefault(EntryExitPairs.class).deleteBean((DestinationPoints)bean, property);
054            }),
055
056    Light(
057            Bundle.getMessage("BeanNameLight"),
058            Bundle.getMessage("BeanNameLights"),
059            Light.class,
060            "KnownState",
061            () -> InstanceManager.getDefault(LightManager.class),
062            InstanceManager.getDefault(LightManager.class)::newLight,
063            (NamedBean bean, String property) -> {
064                if (!(bean instanceof Light)) throw new IllegalArgumentException("bean is not a Light");
065                InstanceManager.getDefault(LightManager.class).deleteBean((Light)bean, property);
066            }),
067
068    Memory(
069            Bundle.getMessage("BeanNameMemory"),
070            Bundle.getMessage("BeanNameMemories"),
071            Memory.class,
072            "value",
073            () -> InstanceManager.getDefault(MemoryManager.class),
074            InstanceManager.getDefault(MemoryManager.class)::newMemory,
075            (NamedBean bean, String property) -> {
076                if (!(bean instanceof Memory)) throw new IllegalArgumentException("bean is not a Memory");
077                InstanceManager.getDefault(MemoryManager.class).deleteBean((Memory)bean, property);
078            }),
079
080    OBlock(
081            Bundle.getMessage("BeanNameOBlock"),
082            Bundle.getMessage("BeanNameOBlocks"),
083            OBlock.class,
084            "state",
085            () -> InstanceManager.getDefault(OBlockManager.class),
086            InstanceManager.getDefault(OBlockManager.class)::createNewOBlock,
087            (NamedBean bean, String property) -> {
088                if (!(bean instanceof OBlock)) throw new IllegalArgumentException("bean is not a OBlock");
089                InstanceManager.getDefault(OBlockManager.class).deleteBean((OBlock)bean, property);
090            }),
091
092    Reporter(
093            Bundle.getMessage("BeanNameReporter"),
094            Bundle.getMessage("BeanNameReporters"),
095            Reporter.class,
096            "currentReport",
097            () -> InstanceManager.getDefault(ReporterManager.class),
098            InstanceManager.getDefault(ReporterManager.class)::newReporter,
099            (NamedBean bean, String property) -> {
100                if (!(bean instanceof Reporter)) throw new IllegalArgumentException("bean is not a Reporter");
101                InstanceManager.getDefault(ReporterManager.class).deleteBean((Reporter)bean, property);
102            }),
103
104    Sensor(
105            Bundle.getMessage("BeanNameSensor"),
106            Bundle.getMessage("BeanNameSensors"),
107            Sensor.class,
108            "KnownState",
109            () -> InstanceManager.getDefault(SensorManager.class),
110            InstanceManager.getDefault(SensorManager.class)::newSensor,
111            (NamedBean bean, String property) -> {
112                if (!(bean instanceof Sensor)) throw new IllegalArgumentException("bean is not a Sensor");
113                InstanceManager.getDefault(SensorManager.class).deleteBean((Sensor)bean, property);
114            }),
115
116    SignalHead(
117            Bundle.getMessage("BeanNameSignalHead"),
118            Bundle.getMessage("BeanNameSignalHeads"),
119            SignalHead.class,
120            "Appearance",
121            () -> InstanceManager.getDefault(SignalHeadManager.class),
122            null,
123            (NamedBean bean, String property) -> {
124                if (!(bean instanceof SignalHead)) throw new IllegalArgumentException("bean is not a SignalHead");
125                InstanceManager.getDefault(SignalHeadManager.class).deleteBean((SignalHead)bean, property);
126            }),
127
128    SignalMast(
129            Bundle.getMessage("BeanNameSignalMast"),
130            Bundle.getMessage("BeanNameSignalMasts"),
131            SignalMast.class,
132            "Aspect",
133            () -> InstanceManager.getDefault(SignalMastManager.class),
134            null,
135            (NamedBean bean, String property) -> {
136                if (!(bean instanceof SignalMast)) throw new IllegalArgumentException("bean is not a SignalMast");
137                InstanceManager.getDefault(SignalMastManager.class).deleteBean((SignalMast)bean, property);
138            }),
139
140    Turnout(
141            Bundle.getMessage("BeanNameTurnout"),
142            Bundle.getMessage("BeanNameTurnouts"),
143            Turnout.class, "KnownState",
144            () -> InstanceManager.getDefault(TurnoutManager.class),
145            InstanceManager.getDefault(TurnoutManager.class)::newTurnout,
146            (NamedBean bean, String property) -> {
147                if (!(bean instanceof Turnout)) throw new IllegalArgumentException("bean is not a Turnout");
148                InstanceManager.getDefault(TurnoutManager.class).deleteBean((Turnout)bean, property);
149            }),
150
151    Warrant(
152            Bundle.getMessage("BeanNameWarrant"),
153            Bundle.getMessage("BeanNameWarrants"),
154            Warrant.class, "KnownState",
155            () -> InstanceManager.getDefault(WarrantManager.class),
156            null,
157            (NamedBean bean, String property) -> {
158                if (!(bean instanceof Warrant)) throw new IllegalArgumentException("bean is not a Warrant");
159                InstanceManager.getDefault(WarrantManager.class).deleteBean((Warrant)bean, property);
160            });
161
162
163    private final String _name;
164    private final String _namePlural;
165    private final Class<? extends NamedBean> _clazz;
166    private final String _propertyName;
167    private final GetManager _getManager;
168    private Manager<? extends NamedBean> _manager;
169    private final CreateBean _createBean;
170    private final DeleteBean _deleteBean;
171
172    NamedBeanType(
173            String name,
174            String namePlural,
175            Class<? extends NamedBean> clazz,
176            String propertyName,
177            GetManager getManager,
178            CreateBean createBean,
179            DeleteBean deleteBean) {
180        _name = name;
181        _namePlural = namePlural;
182        _clazz = clazz;
183        _propertyName = propertyName;
184        _getManager = getManager;
185        _manager = _getManager.getManager();
186        _createBean = createBean;
187        _deleteBean = deleteBean;
188    }
189
190    @Override
191    public String toString() {
192        return _name;
193    }
194
195    public String getName(boolean plural) {
196        return plural ? _namePlural : _name;
197    }
198
199    public Class<? extends NamedBean> getClazz() {
200        return _clazz;
201    }
202
203    public String getPropertyName() {
204        return _propertyName;
205    }
206
207    public Manager<? extends NamedBean> getManager() {
208        return _manager;
209    }
210
211    public CreateBean getCreateBean() {
212        return _createBean;
213    }
214
215    public DeleteBean getDeleteBean() {
216        return _deleteBean;
217    }
218
219    // This method is used by test classes to reset this enum.
220    // Each test resets the InstanceManager so we need to reset the
221    // managers in this enum.
222    public static void reset() {
223        for (NamedBeanType type : NamedBeanType.values()) {
224            type._manager = type._getManager.getManager();
225        }
226    }
227
228    private interface GetManager {
229
230        Manager<? extends NamedBean> getManager();
231    }
232
233    public interface CreateBean {
234
235        public NamedBean createBean(String systemName, String userName);
236    }
237
238    public interface DeleteBean {
239
240        public void deleteBean(NamedBean bean, String property)
241                throws java.beans.PropertyVetoException;
242    }
243
244}