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}