001package jmri.jmrit.logixng.actions;
002
003import java.util.*;
004
005import jmri.*;
006import jmri.jmrit.logixng.*;
007import jmri.jmrit.logixng.util.*;
008import jmri.jmrit.logixng.util.parser.*;
009import jmri.util.ThreadingUtil;
010
011/**
012 * This action requests an update from the layout of the state of a sensor.
013 *
014 * @author Daniel Bergqvist Copyright 2024
015 */
016public class ActionRequestUpdateOfSensor extends AbstractDigitalAction {
017
018    private final LogixNG_SelectNamedBean<Sensor> _selectNamedBean =
019            new LogixNG_SelectNamedBean<>(
020                    this, Sensor.class, InstanceManager.getDefault(SensorManager.class));
021
022
023    public ActionRequestUpdateOfSensor(String sys, String user)
024            throws BadUserNameException, BadSystemNameException {
025        super(sys, user);
026    }
027
028    @Override
029    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException {
030        DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class);
031        String sysName = systemNames.get(getSystemName());
032        String userName = userNames.get(getSystemName());
033        if (sysName == null) sysName = manager.getAutoSystemName();
034        ActionRequestUpdateOfSensor copy = new ActionRequestUpdateOfSensor(sysName, userName);
035        copy.setComment(getComment());
036        _selectNamedBean.copy(copy._selectNamedBean);
037        return manager.registerAction(copy);
038    }
039
040    public LogixNG_SelectNamedBean<Sensor> getSelectNamedBean() {
041        return _selectNamedBean;
042    }
043
044    /** {@inheritDoc} */
045    @Override
046    public LogixNG_Category getCategory() {
047        return LogixNG_Category.ITEM;
048    }
049
050    /** {@inheritDoc} */
051    @Override
052    public void execute() throws JmriException {
053        Sensor sensor = _selectNamedBean.evaluateNamedBean(getConditionalNG());
054
055        if (sensor == null) return;
056
057        ThreadingUtil.runOnLayoutWithJmriException(() -> {
058            sensor.requestUpdateFromLayout();
059        });
060    }
061
062    @Override
063    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
064        throw new UnsupportedOperationException("Not supported.");
065    }
066
067    @Override
068    public int getChildCount() {
069        return 0;
070    }
071
072    @Override
073    public String getShortDescription(Locale locale) {
074        return Bundle.getMessage(locale, "ActionRequestUpdateOfSensor_Short");
075    }
076
077    @Override
078    public String getLongDescription(Locale locale) {
079        String namedBean = _selectNamedBean.getDescription(locale);
080        return Bundle.getMessage(locale, "ActionRequestUpdateOfSensor_Long", namedBean);
081    }
082
083    /** {@inheritDoc} */
084    @Override
085    public void setup() {
086        // Do nothing
087    }
088
089    /** {@inheritDoc} */
090    @Override
091    public void getUsageDetail(int level, NamedBean bean, List<NamedBeanUsageReport> report, NamedBean cdl) {
092        _selectNamedBean.getUsageDetail(level, bean, report, cdl, this, LogixNG_SelectNamedBean.Type.Action);
093    }
094
095    /** {@inheritDoc} */
096    @Override
097    public void disposeMe() {
098    }
099
100//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionRequestUpdateOfSensor.class);
101}