001package jmri.jmrit.logixng.actions;
002
003import java.util.Locale;
004import java.util.Map;
005
006import jmri.*;
007import jmri.jmrit.logixng.*;
008import jmri.jmrit.logixng.util.LogixNG_SelectEnum;
009import jmri.jmrit.logixng.util.parser.ParserException;
010
011/**
012 * This action sets the state of a turnout.
013 *
014 * @author Daniel Bergqvist Copyright 2018
015 */
016public class ShutdownComputer extends AbstractDigitalAction {
017
018    private final LogixNG_SelectEnum<Operation> _selectEnum =
019            new LogixNG_SelectEnum<>(this, Operation.values(), Operation.ShutdownJMRI);
020
021
022    public ShutdownComputer(String sys, String user)
023            throws BadUserNameException, BadSystemNameException {
024        super(sys, user);
025    }
026
027    @Override
028    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException {
029        DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class);
030        String sysName = systemNames.get(getSystemName());
031        String userName = userNames.get(getSystemName());
032        if (sysName == null) sysName = manager.getAutoSystemName();
033        ShutdownComputer copy = new ShutdownComputer(sysName, userName);
034        copy.setComment(getComment());
035        _selectEnum.copy(copy._selectEnum);
036        return manager.registerAction(copy);
037    }
038
039    public LogixNG_SelectEnum<Operation> getSelectEnum() {
040        return _selectEnum;
041    }
042
043    /** {@inheritDoc} */
044    @Override
045    public LogixNG_Category getCategory() {
046        return LogixNG_Category.OTHER;
047    }
048
049    /** {@inheritDoc} */
050    @Override
051    public void execute() throws JmriException {
052        Operation operation = _selectEnum.evaluateEnum(getConditionalNG());
053
054        jmri.util.ThreadingUtil.runOnGUI(() -> {
055            switch (operation) {
056                case ShutdownComputer:
057                    InstanceManager.getDefault(ShutDownManager.class).shutdownOS();
058                    break;
059
060                case RebootComputer:
061                    InstanceManager.getDefault(ShutDownManager.class).restartOS();
062                    break;
063
064                case ShutdownJMRI:
065                    InstanceManager.getDefault(ShutDownManager.class).shutdown();
066                    break;
067
068                case RebootJMRI:
069                    InstanceManager.getDefault(ShutDownManager.class).restart();
070                    break;
071
072                default:
073                    throw new RuntimeException("_operation has invalid value: " + operation.name());
074            }
075        });
076    }
077
078    @Override
079    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
080        throw new UnsupportedOperationException("Not supported.");
081    }
082
083    @Override
084    public int getChildCount() {
085        return 0;
086    }
087
088    @Override
089    public String getShortDescription(Locale locale) {
090        return Bundle.getMessage(locale, "ShutdownComputer_Short");
091    }
092
093    @Override
094    public String getLongDescription(Locale locale) {
095        return Bundle.getMessage(locale, "ShutdownComputer_Long", _selectEnum.getDescription(locale));
096    }
097
098    /** {@inheritDoc} */
099    @Override
100    public void setup() {
101        // Do nothing
102    }
103
104    /** {@inheritDoc} */
105    @Override
106    public void disposeMe() {
107    }
108
109
110
111    public enum Operation {
112        ShutdownComputer(Bundle.getMessage("ShutdownComputer_ShutdownComputer")),
113        RebootComputer(Bundle.getMessage("ShutdownComputer_RebootComputer")),
114        ShutdownJMRI(Bundle.getMessage("ShutdownComputer_ShutdownJMRI")),
115        RebootJMRI(Bundle.getMessage("ShutdownComputer_RebootJMRI"));
116
117        private final String _text;
118
119        private Operation(String text) {
120            this._text = text;
121        }
122
123        @Override
124        public String toString() {
125            return _text;
126        }
127
128    }
129
130//     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ShutdownComputer.class);
131}